Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f7aa6cdc authored by Stan Iliev's avatar Stan Iliev
Browse files

Add comments to clarify how SkDrawable dtor is called

Document the 3 variants of SkDrawable object lifetime in
SkiaRecordingCanvas:
- The only drawable that is using ref couting to delete itself is
"LayerDrawable"
- 2 other drawables (RenderNodeDrawable and GLFunctorDrawable) are
deleted by std::deque
- the rest are deleted by ~LinearAllocator

bug: 36717955
Test: built and ran on device
Change-Id: I16f7f6573f6e4dc8d665f58d051255d40b1b690d
parent 7ead6c4d
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -60,7 +60,7 @@ public:
     * Use the linear allocator to create any SkDrawables needed by the display
     * list. This could be dangerous as these objects are ref-counted, so we
     * need to monitor that they don't extend beyond the lifetime of the class
     * that creates them.
     * that creates them. Allocator dtor invokes all SkDrawable dtors.
     */
    template<class T, typename... Params>
    SkDrawable* allocateDrawable(Params&&... params) {
+4 −1
Original line number Diff line number Diff line
@@ -62,6 +62,7 @@ void SkiaRecordingCanvas::drawRoundRect(uirenderer::CanvasPropertyPrimitive* lef
        uirenderer::CanvasPropertyPrimitive* top, uirenderer::CanvasPropertyPrimitive* right,
        uirenderer::CanvasPropertyPrimitive* bottom, uirenderer::CanvasPropertyPrimitive* rx,
        uirenderer::CanvasPropertyPrimitive* ry, uirenderer::CanvasPropertyPaint* paint) {
    // Destructor of drawables created with allocateDrawable, will be invoked by ~LinearAllocator.
    drawDrawable(mDisplayList->allocateDrawable<AnimatedRoundRect>(left, top, right, bottom,
            rx, ry, paint));
}
@@ -92,13 +93,14 @@ void SkiaRecordingCanvas::insertReorderBarrier(bool enableReorder) {
void SkiaRecordingCanvas::drawLayer(uirenderer::DeferredLayerUpdater* layerUpdater) {
    if (layerUpdater != nullptr && layerUpdater->backingLayer() != nullptr) {
        uirenderer::Layer* layer = layerUpdater->backingLayer();
        // Create a ref-counted drawable, which is kept alive by sk_sp in SkLiteDL.
        sk_sp<SkDrawable> drawable(new LayerDrawable(layer));
        drawDrawable(drawable.get());
    }
}

void SkiaRecordingCanvas::drawRenderNode(uirenderer::RenderNode* renderNode) {
    // record the child node
    // Record the child node. Drawable dtor will be invoked when mChildNodes deque is cleared.
    mDisplayList->mChildNodes.emplace_back(renderNode, asSkCanvas(), true, mCurrentBarrier);
    auto& renderNodeDrawable = mDisplayList->mChildNodes.back();
    drawDrawable(&renderNodeDrawable);
@@ -113,6 +115,7 @@ void SkiaRecordingCanvas::drawRenderNode(uirenderer::RenderNode* renderNode) {

void SkiaRecordingCanvas::callDrawGLFunction(Functor* functor,
        uirenderer::GlFunctorLifecycleListener* listener) {
    // Drawable dtor will be invoked when mChildFunctors deque is cleared.
    mDisplayList->mChildFunctors.emplace_back(functor, listener, asSkCanvas());
    drawDrawable(&mDisplayList->mChildFunctors.back());
}