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

Commit f8c434eb authored by Adlai Holler's avatar Adlai Holler
Browse files

Migrate from GrContext to GrDirectContext

This is part of an effort to distinguish between different types of
contexts in GPU Skia. When using a DeferredDisplayList (DDL)
recorder, the context you get is not a direct context and cannot
be used for operations like uploading or reading textures.

Since Android does not use DDLs, it is not directly affected by this
change but other APIs, such as SkImage::MakeFromTexture are
being migrated to require a GrDirectContext to increase sanity.

Change-Id: I9afbdf3c026a9f9cb6ad2aad904915e189e584d6
parent b2991250
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -25,7 +25,8 @@ using namespace android::uirenderer::renderthread;
namespace android {
namespace uirenderer {

AutoBackendTextureRelease::AutoBackendTextureRelease(GrContext* context, AHardwareBuffer* buffer) {
AutoBackendTextureRelease::AutoBackendTextureRelease(GrDirectContext* context,
                                                     AHardwareBuffer* buffer) {
    AHardwareBuffer_Desc desc;
    AHardwareBuffer_describe(buffer, &desc);
    bool createProtectedImage = 0 != (desc.usage & AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT);
@@ -67,8 +68,9 @@ static void releaseProc(SkImage::ReleaseContext releaseContext) {
    textureRelease->unref(false);
}

void AutoBackendTextureRelease::makeImage(AHardwareBuffer* buffer, android_dataspace dataspace,
                                          GrContext* context) {
void AutoBackendTextureRelease::makeImage(AHardwareBuffer* buffer,
                                          android_dataspace dataspace,
                                          GrDirectContext* context) {
    AHardwareBuffer_Desc desc;
    AHardwareBuffer_describe(buffer, &desc);
    SkColorType colorType = GrAHardwareBufferUtils::GetSkColorTypeFromBufferFormat(desc.format);
@@ -81,7 +83,7 @@ void AutoBackendTextureRelease::makeImage(AHardwareBuffer* buffer, android_datas
    }
}

void AutoBackendTextureRelease::newBufferContent(GrContext* context) {
void AutoBackendTextureRelease::newBufferContent(GrDirectContext* context) {
    if (mBackendTexture.isValid()) {
        mUpdateProc(mImageCtx, context);
    }
+6 −3
Original line number Diff line number Diff line
@@ -31,7 +31,8 @@ namespace uirenderer {
 */
class AutoBackendTextureRelease final {
public:
    AutoBackendTextureRelease(GrContext* context, AHardwareBuffer* buffer);
    AutoBackendTextureRelease(GrDirectContext* context,
                              AHardwareBuffer* buffer);

    const GrBackendTexture& getTexture() const { return mBackendTexture; }

@@ -42,9 +43,11 @@ public:

    inline sk_sp<SkImage> getImage() const { return mImage; }

    void makeImage(AHardwareBuffer* buffer, android_dataspace dataspace, GrContext* context);
    void makeImage(AHardwareBuffer* buffer,
                   android_dataspace dataspace,
                   GrDirectContext* context);

    void newBufferContent(GrContext* context);
    void newBufferContent(GrDirectContext* context);

private:
    // The only way to invoke dtor is with unref, when mUsageCount is 0.
+1 −1
Original line number Diff line number Diff line
@@ -189,7 +189,7 @@ void DeferredLayerUpdater::detachSurfaceTexture() {
sk_sp<SkImage> DeferredLayerUpdater::ImageSlot::createIfNeeded(AHardwareBuffer* buffer,
                                                               android_dataspace dataspace,
                                                               bool forceCreate,
                                                               GrContext* context) {
                                                               GrDirectContext* context) {
    if (!mTextureRelease || !mTextureRelease->getImage().get() || dataspace != mDataspace ||
        forceCreate || mBuffer != buffer) {
        if (buffer != mBuffer) {
+1 −1
Original line number Diff line number Diff line
@@ -106,7 +106,7 @@ private:
        ~ImageSlot() { clear(); }

        sk_sp<SkImage> createIfNeeded(AHardwareBuffer* buffer, android_dataspace dataspace,
                                      bool forceCreate, GrContext* context);
                                      bool forceCreate, GrDirectContext* context);

    private:
        void clear();
+2 −2
Original line number Diff line number Diff line
@@ -21,7 +21,7 @@
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include <GLES3/gl3.h>
#include <GrContext.h>
#include <GrDirectContext.h>
#include <SkCanvas.h>
#include <SkImage.h>
#include <utils/GLUtils.h>
@@ -285,7 +285,7 @@ private:
        return (image.get() != nullptr);
    }

    sk_sp<GrContext> mGrContext;
    sk_sp<GrDirectContext> mGrContext;
    renderthread::VulkanManager mVulkanManager;
    std::mutex mVkLock;
};
Loading