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

Commit 17e25514 authored by Nolan Scobie's avatar Nolan Scobie
Browse files

Make AutoBackendTexture remember which context it was created with

... and use that stored context when creating an SkImage or SkSurface.

As per I52e1d831f2d195cddb21c2e7a1e820059fe2a137 we no longer share
buffers between contexts, and this aligns with Graphite's need to know
the context that a backend texture was created with to clean it up in
ABT's destructor.

Test: manually validated core CUJs + existing tests (refactor)
Bug: b/293371537
Bug: others listed in I52e1d831f2d195cddb21c2e7a1e820059fe2a137
Change-Id: I7d4b0b95216b0529be72cfb7c2788c592a77ed0e
parent 48d4be6d
Loading
Loading
Loading
Loading
+6 −8
Original line number Diff line number Diff line
@@ -37,7 +37,7 @@ namespace skia {

AutoBackendTexture::AutoBackendTexture(GrDirectContext* context, AHardwareBuffer* buffer,
                                       bool isOutputBuffer, CleanupManager& cleanupMgr)
      : mCleanupMgr(cleanupMgr), mIsOutputBuffer(isOutputBuffer) {
      : mGrContext(context), mCleanupMgr(cleanupMgr), mIsOutputBuffer(isOutputBuffer) {
    ATRACE_CALL();
    AHardwareBuffer_Desc desc;
    AHardwareBuffer_describe(buffer, &desc);
@@ -158,12 +158,11 @@ void logFatalTexture(const char* msg, const GrBackendTexture& tex, ui::Dataspace
    }
}

sk_sp<SkImage> AutoBackendTexture::makeImage(ui::Dataspace dataspace, SkAlphaType alphaType,
                                             GrDirectContext* context) {
sk_sp<SkImage> AutoBackendTexture::makeImage(ui::Dataspace dataspace, SkAlphaType alphaType) {
    ATRACE_CALL();

    if (mBackendTexture.isValid()) {
        mUpdateProc(mImageCtx, context);
        mUpdateProc(mImageCtx, mGrContext);
    }

    auto colorType = mColorType;
@@ -174,7 +173,7 @@ sk_sp<SkImage> AutoBackendTexture::makeImage(ui::Dataspace dataspace, SkAlphaTyp
    }

    sk_sp<SkImage> image =
            SkImages::BorrowTextureFrom(context, mBackendTexture, kTopLeft_GrSurfaceOrigin,
            SkImages::BorrowTextureFrom(mGrContext, mBackendTexture, kTopLeft_GrSurfaceOrigin,
                                        colorType, alphaType, toSkColorSpace(dataspace),
                                        releaseImageProc, this);
    if (image.get()) {
@@ -190,13 +189,12 @@ sk_sp<SkImage> AutoBackendTexture::makeImage(ui::Dataspace dataspace, SkAlphaTyp
    return mImage;
}

sk_sp<SkSurface> AutoBackendTexture::getOrCreateSurface(ui::Dataspace dataspace,
                                                        GrDirectContext* context) {
sk_sp<SkSurface> AutoBackendTexture::getOrCreateSurface(ui::Dataspace dataspace) {
    ATRACE_CALL();
    LOG_ALWAYS_FATAL_IF(!mIsOutputBuffer, "You can't generate a SkSurface for a read-only texture");
    if (!mSurface.get() || mDataspace != dataspace) {
        sk_sp<SkSurface> surface =
                SkSurfaces::WrapBackendTexture(context, mBackendTexture,
                SkSurfaces::WrapBackendTexture(mGrContext, mBackendTexture,
                                               kTopLeft_GrSurfaceOrigin, 0, mColorType,
                                               toSkColorSpace(dataspace), nullptr,
                                               releaseSurfaceProc, this);
+7 −8
Original line number Diff line number Diff line
@@ -95,14 +95,13 @@ public:
        // Makes a new SkImage from the texture content.
        // As SkImages are immutable but buffer content is not, we create
        // a new SkImage every time.
        sk_sp<SkImage> makeImage(ui::Dataspace dataspace, SkAlphaType alphaType,
                                 GrDirectContext* context) {
            return mTexture->makeImage(dataspace, alphaType, context);
        sk_sp<SkImage> makeImage(ui::Dataspace dataspace, SkAlphaType alphaType) {
            return mTexture->makeImage(dataspace, alphaType);
        }

        // Makes a new SkSurface from the texture content, if needed.
        sk_sp<SkSurface> getOrCreateSurface(ui::Dataspace dataspace, GrDirectContext* context) {
            return mTexture->getOrCreateSurface(dataspace, context);
        sk_sp<SkSurface> getOrCreateSurface(ui::Dataspace dataspace) {
            return mTexture->getOrCreateSurface(dataspace);
        }

        SkColorType colorType() const { return mTexture->mColorType; }
@@ -130,17 +129,17 @@ private:
    // Makes a new SkImage from the texture content.
    // As SkImages are immutable but buffer content is not, we create
    // a new SkImage every time.
    sk_sp<SkImage> makeImage(ui::Dataspace dataspace, SkAlphaType alphaType,
                             GrDirectContext* context);
    sk_sp<SkImage> makeImage(ui::Dataspace dataspace, SkAlphaType alphaType);

    // Makes a new SkSurface from the texture content, if needed.
    sk_sp<SkSurface> getOrCreateSurface(ui::Dataspace dataspace, GrDirectContext* context);
    sk_sp<SkSurface> getOrCreateSurface(ui::Dataspace dataspace);

    GrBackendTexture mBackendTexture;
    GrAHardwareBufferUtils::DeleteImageProc mDeleteProc;
    GrAHardwareBufferUtils::UpdateImageProc mUpdateProc;
    GrAHardwareBufferUtils::TexImageCtx mImageCtx;

    const GrDirectContext* mGrContext = nullptr;
    CleanupManager& mCleanupMgr;

    static void releaseSurfaceProc(SkSurface::ReleaseContext releaseContext);
+2 −3
Original line number Diff line number Diff line
@@ -679,8 +679,7 @@ void SkiaRenderEngine::drawLayersInternal(
    // wait on the buffer to be ready to use prior to using it
    waitFence(grContext, bufferFence);

    sk_sp<SkSurface> dstSurface =
            surfaceTextureRef->getOrCreateSurface(display.outputDataspace, grContext);
    sk_sp<SkSurface> dstSurface = surfaceTextureRef->getOrCreateSurface(display.outputDataspace);

    SkCanvas* dstCanvas = mCapture->tryCapture(dstSurface.get());
    if (dstCanvas == nullptr) {
@@ -972,7 +971,7 @@ void SkiaRenderEngine::drawLayersInternal(
                    : item.isOpaque                      ? kOpaque_SkAlphaType
                    : item.usePremultipliedAlpha         ? kPremul_SkAlphaType
                                                         : kUnpremul_SkAlphaType;
            sk_sp<SkImage> image = imageTextureRef->makeImage(layerDataspace, alphaType, grContext);
            sk_sp<SkImage> image = imageTextureRef->makeImage(layerDataspace, alphaType);

            auto texMatrix = getSkM44(item.textureTransform).asM33();
            // textureTansform was intended to be passed directly into a shader, so when