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

Commit 34257889 authored by Derek Sollenberger's avatar Derek Sollenberger
Browse files

Revert "Increase performance for screenshots by pre-loading the buffer"

This reverts commit 957f7b37.

Reason for revert: memory leak (see b/184564947)

Bug: 184564947
Change-Id: I0ac8a2cdc33f83a5b2315232177b5b1d7bd35bbe
parent 0de23a9e
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -28,19 +28,19 @@ namespace android {
namespace renderengine {
namespace skia {

AutoBackendTexture::AutoBackendTexture(GrDirectContext* context, AHardwareBuffer* buffer) {
AutoBackendTexture::AutoBackendTexture(GrDirectContext* context, AHardwareBuffer* buffer,
                                       bool isRender) {
    ATRACE_CALL();
    AHardwareBuffer_Desc desc;
    AHardwareBuffer_describe(buffer, &desc);
    const bool createProtectedImage = 0 != (desc.usage & AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT);
    const bool isRenderable = 0 != (desc.usage & AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER);
    bool createProtectedImage = 0 != (desc.usage & AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT);
    GrBackendFormat backendFormat =
            GrAHardwareBufferUtils::GetBackendFormat(context, buffer, desc.format, false);
    mBackendTexture =
            GrAHardwareBufferUtils::MakeBackendTexture(context, buffer, desc.width, desc.height,
                                                       &mDeleteProc, &mUpdateProc, &mImageCtx,
                                                       createProtectedImage, backendFormat,
                                                       isRenderable);
                                                       isRender);
    mColorType = GrAHardwareBufferUtils::GetSkColorTypeFromBufferFormat(desc.format);
}

+1 −1
Original line number Diff line number Diff line
@@ -69,7 +69,7 @@ public:
    };

    // Creates a GrBackendTexture whose contents come from the provided buffer.
    AutoBackendTexture(GrDirectContext* context, AHardwareBuffer* buffer);
    AutoBackendTexture(GrDirectContext* context, AHardwareBuffer* buffer, bool isRender);

    void ref() { mUsageCount++; }

+5 −4
Original line number Diff line number Diff line
@@ -500,7 +500,7 @@ void SkiaGLRenderEngine::cacheExternalTextureBuffer(const sp<GraphicBuffer>& buf
        std::shared_ptr<AutoBackendTexture::LocalRef> imageTextureRef =
                std::make_shared<AutoBackendTexture::LocalRef>();
        imageTextureRef->setTexture(
                new AutoBackendTexture(grContext.get(), buffer->toAHardwareBuffer()));
                new AutoBackendTexture(grContext.get(), buffer->toAHardwareBuffer(), false));
        cache.insert({buffer->getId(), imageTextureRef});
    }
    // restore the original state of the protected context if necessary
@@ -654,7 +654,7 @@ status_t SkiaGLRenderEngine::drawLayers(const DisplaySettings& display,
        ATRACE_NAME("Cache miss");
        surfaceTextureRef = std::make_shared<AutoBackendTexture::LocalRef>();
        surfaceTextureRef->setTexture(
                new AutoBackendTexture(grContext.get(), buffer->toAHardwareBuffer()));
                new AutoBackendTexture(grContext.get(), buffer->toAHardwareBuffer(), true));
        if (useFramebufferCache) {
            ALOGD("Adding to cache");
            cache.insert({buffer->getId(), surfaceTextureRef});
@@ -861,8 +861,9 @@ status_t SkiaGLRenderEngine::drawLayers(const DisplaySettings& display,
                imageTextureRef = iter->second;
            } else {
                imageTextureRef = std::make_shared<AutoBackendTexture::LocalRef>();
                imageTextureRef->setTexture(
                        new AutoBackendTexture(grContext.get(), item.buffer->toAHardwareBuffer()));
                imageTextureRef->setTexture(new AutoBackendTexture(grContext.get(),
                                                                   item.buffer->toAHardwareBuffer(),
                                                                   false));
                cache.insert({item.buffer->getId(), imageTextureRef});
            }

+11 −5
Original line number Diff line number Diff line
@@ -6051,11 +6051,8 @@ status_t SurfaceFlinger::captureScreenCommon(RenderAreaFuture renderAreaFuture,
    const status_t bufferStatus = buffer->initCheck();
    LOG_ALWAYS_FATAL_IF(bufferStatus != OK, "captureScreenCommon: Buffer failed to allocate: %d",
                        bufferStatus);
    getRenderEngine().cacheExternalTextureBuffer(buffer);
    status_t result = captureScreenCommon(std::move(renderAreaFuture), traverseLayers, buffer,
    return captureScreenCommon(std::move(renderAreaFuture), traverseLayers, buffer,
                               false /* regionSampling */, grayscale, captureListener);
    getRenderEngine().unbindExternalTextureBuffer(buffer->getId());
    return result;
}

status_t SurfaceFlinger::captureScreenCommon(RenderAreaFuture renderAreaFuture,
@@ -6095,6 +6092,15 @@ status_t SurfaceFlinger::captureScreenCommon(RenderAreaFuture renderAreaFuture,
                                            regionSampling, grayscale, captureResults);
        });

        // TODO(b/180767535): Remove this once we optimize buffer lifecycle for RenderEngine
        // Only do this when we're not doing region sampling, to allow the region sampling thread to
        // manage buffer lifecycle itself.
        if (!regionSampling &&
            getRenderEngine().getRenderEngineType() ==
                    renderengine::RenderEngine::RenderEngineType::SKIA_GL_THREADED) {
            getRenderEngine().unbindExternalTextureBuffer(buffer->getId());
        }

        captureResults.result = result;
        captureListener->onScreenCaptureCompleted(captureResults);
    }));