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

Commit fe0d72b6 authored by Alec Mouri's avatar Alec Mouri
Browse files

Don't cache framebuffer images for screenshots.

Screenshots always create a new GraphicBuffer, so they shouldn't be
cached since they'll never be redrawn to.

Bug: 129072814
Test: systrace
Change-Id: I116444804b80fbdacf5b8f8ef23f943032b3b777
parent dc705b9e
Loading
Loading
Loading
Loading
+18 −13
Original line number Diff line number Diff line
@@ -808,14 +808,16 @@ bool GLESRenderEngine::useProtectedContext(bool useProtectedContext) {
    return success;
}
EGLImageKHR GLESRenderEngine::createFramebufferImageIfNeeded(ANativeWindowBuffer* nativeBuffer,
                                                             bool isProtected) {
                                                             bool isProtected,
                                                             bool useFramebufferCache) {
    sp<GraphicBuffer> graphicBuffer = GraphicBuffer::from(nativeBuffer);
    uint64_t bufferId = graphicBuffer->getId();
    if (useFramebufferCache) {
        for (const auto& image : mFramebufferImageCache) {
        if (image.first == bufferId) {
            if (image.first == graphicBuffer->getId()) {
                return image.second;
            }
        }
    }
    EGLint attributes[] = {
            isProtected ? EGL_PROTECTED_CONTENT_EXT : EGL_NONE,
            isProtected ? EGL_TRUE : EGL_NONE,
@@ -823,13 +825,15 @@ EGLImageKHR GLESRenderEngine::createFramebufferImageIfNeeded(ANativeWindowBuffer
    };
    EGLImageKHR image = eglCreateImageKHR(mEGLDisplay, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID,
                                          nativeBuffer, attributes);
    if (useFramebufferCache) {
        if (image != EGL_NO_IMAGE_KHR) {
            if (mFramebufferImageCache.size() >= mFramebufferImageCacheSize) {
                EGLImageKHR expired = mFramebufferImageCache.front().second;
                mFramebufferImageCache.pop_front();
                eglDestroyImageKHR(mEGLDisplay, expired);
            }
        mFramebufferImageCache.push_back({bufferId, image});
            mFramebufferImageCache.push_back({graphicBuffer->getId(), image});
        }
    }
    return image;
}
@@ -837,7 +841,8 @@ EGLImageKHR GLESRenderEngine::createFramebufferImageIfNeeded(ANativeWindowBuffer
status_t GLESRenderEngine::drawLayers(const DisplaySettings& display,
                                      const std::vector<LayerSettings>& layers,
                                      ANativeWindowBuffer* const buffer,
                                      base::unique_fd&& bufferFence, base::unique_fd* drawFence) {
                                      const bool useFramebufferCache, base::unique_fd&& bufferFence,
                                      base::unique_fd* drawFence) {
    ATRACE_CALL();
    if (layers.empty()) {
        ALOGV("Drawing empty layer stack");
@@ -857,7 +862,7 @@ status_t GLESRenderEngine::drawLayers(const DisplaySettings& display,
    {
        std::lock_guard<std::mutex> lock(mRenderingMutex);

        BindNativeBufferAsFramebuffer fbo(*this, buffer);
        BindNativeBufferAsFramebuffer fbo(*this, buffer, useFramebufferCache);

        if (fbo.getStatus() != NO_ERROR) {
            ALOGE("Failed to bind framebuffer! Aborting GPU composition for buffer (%p).",
+5 −3
Original line number Diff line number Diff line
@@ -83,14 +83,16 @@ public:
    bool supportsProtectedContent() const override;
    bool useProtectedContext(bool useProtectedContext) override;
    status_t drawLayers(const DisplaySettings& display, const std::vector<LayerSettings>& layers,
                        ANativeWindowBuffer* buffer, base::unique_fd&& bufferFence,
                        base::unique_fd* drawFence) EXCLUDES(mRenderingMutex) override;
                        ANativeWindowBuffer* buffer, const bool useFramebufferCache,
                        base::unique_fd&& bufferFence, base::unique_fd* drawFence)
            EXCLUDES(mRenderingMutex) override;

    // internal to RenderEngine
    EGLDisplay getEGLDisplay() const { return mEGLDisplay; }
    EGLConfig getEGLConfig() const { return mEGLConfig; }
    // Creates an output image for rendering to
    EGLImageKHR createFramebufferImageIfNeeded(ANativeWindowBuffer* nativeBuffer, bool isProtected);
    EGLImageKHR createFramebufferImageIfNeeded(ANativeWindowBuffer* nativeBuffer, bool isProtected,
                                               bool useFramebufferCache);

    // Test-only methods
    // Returns true iff mImageCache contains an image keyed by bufferId
+8 −2
Original line number Diff line number Diff line
@@ -41,19 +41,25 @@ GLFramebuffer::~GLFramebuffer() {
    glDeleteTextures(1, &mTextureName);
}

bool GLFramebuffer::setNativeWindowBuffer(ANativeWindowBuffer* nativeBuffer, bool isProtected) {
bool GLFramebuffer::setNativeWindowBuffer(ANativeWindowBuffer* nativeBuffer, bool isProtected,
                                          const bool useFramebufferCache) {
    ATRACE_CALL();
    if (mEGLImage != EGL_NO_IMAGE_KHR) {
        if (!usingFramebufferCache) {
            eglDestroyImageKHR(mEGLDisplay, mEGLImage);
        }
        mEGLImage = EGL_NO_IMAGE_KHR;
        mBufferWidth = 0;
        mBufferHeight = 0;
    }

    if (nativeBuffer) {
        mEGLImage = mEngine.createFramebufferImageIfNeeded(nativeBuffer, isProtected);
        mEGLImage = mEngine.createFramebufferImageIfNeeded(nativeBuffer, isProtected,
                                                           useFramebufferCache);
        if (mEGLImage == EGL_NO_IMAGE_KHR) {
            return false;
        }
        usingFramebufferCache = useFramebufferCache;
        mBufferWidth = nativeBuffer->width;
        mBufferHeight = nativeBuffer->height;
    }
+3 −1
Original line number Diff line number Diff line
@@ -35,7 +35,8 @@ public:
    explicit GLFramebuffer(GLESRenderEngine& engine);
    ~GLFramebuffer() override;

    bool setNativeWindowBuffer(ANativeWindowBuffer* nativeBuffer, bool isProtected) override;
    bool setNativeWindowBuffer(ANativeWindowBuffer* nativeBuffer, bool isProtected,
                               const bool useFramebufferCache) override;
    EGLImageKHR getEGLImage() const { return mEGLImage; }
    uint32_t getTextureName() const { return mTextureName; }
    uint32_t getFramebufferName() const { return mFramebufferName; }
@@ -46,6 +47,7 @@ private:
    GLESRenderEngine& mEngine;
    EGLDisplay mEGLDisplay;
    EGLImageKHR mEGLImage;
    bool usingFramebufferCache = false;
    uint32_t mTextureName, mFramebufferName;

    int32_t mBufferHeight = 0;
+2 −1
Original line number Diff line number Diff line
@@ -27,7 +27,8 @@ class Framebuffer {
public:
    virtual ~Framebuffer() = default;

    virtual bool setNativeWindowBuffer(ANativeWindowBuffer* nativeBuffer, bool isProtected) = 0;
    virtual bool setNativeWindowBuffer(ANativeWindowBuffer* nativeBuffer, bool isProtected,
                                       const bool useFramebufferCache) = 0;
};

} // namespace renderengine
Loading