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

Commit fd5dcb0c authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "[RenderEngine] Rebind output texture when unbinding framebuffer" into rvc-dev am: 5edc3fe6

Change-Id: I93b40e53c508aa8c58cad484f11c5588949f25ca
parents fd02f166 5edc3fe6
Loading
Loading
Loading
Loading
+26 −1
Original line number Original line Diff line number Diff line
@@ -876,6 +876,25 @@ void GLESRenderEngine::unbindFrameBuffer(Framebuffer* /* framebuffer */) {
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
}


bool GLESRenderEngine::cleanupPostRender() {
    ATRACE_CALL();

    if (mPriorResourcesCleaned ||
        (mLastDrawFence != nullptr && mLastDrawFence->getStatus() != Fence::Status::Signaled)) {
        // If we don't have a prior frame needing cleanup, then don't do anything.
        return false;
    }

    // Bind the texture to dummy data so that backing image data can be freed.
    GLFramebuffer* glFramebuffer = static_cast<GLFramebuffer*>(getFramebufferForDrawing());
    glFramebuffer->allocateBuffers(1, 1, mPlaceholderDrawBuffer);
    // Release the cached fence here, so that we don't churn reallocations when
    // we could no-op repeated calls of this method instead.
    mLastDrawFence = nullptr;
    mPriorResourcesCleaned = true;
    return true;
}

void GLESRenderEngine::checkErrors() const {
void GLESRenderEngine::checkErrors() const {
    checkErrors(nullptr);
    checkErrors(nullptr);
}
}
@@ -1161,7 +1180,13 @@ status_t GLESRenderEngine::drawLayers(const DisplaySettings& display,
            // us bad parameters, or we messed up our shader generation).
            // us bad parameters, or we messed up our shader generation).
            return INVALID_OPERATION;
            return INVALID_OPERATION;
        }
        }
        mLastDrawFence = nullptr;
    } else {
        // The caller takes ownership of drawFence, so we need to duplicate the
        // fd here.
        mLastDrawFence = new Fence(dup(drawFence->get()));
    }
    }
    mPriorResourcesCleaned = false;


    checkErrors();
    checkErrors();
    return NO_ERROR;
    return NO_ERROR;
+12 −1
Original line number Original line Diff line number Diff line
@@ -17,7 +17,6 @@
#ifndef SF_GLESRENDERENGINE_H_
#ifndef SF_GLESRENDERENGINE_H_
#define SF_GLESRENDERENGINE_H_
#define SF_GLESRENDERENGINE_H_


#include <stdint.h>
#include <condition_variable>
#include <condition_variable>
#include <deque>
#include <deque>
#include <mutex>
#include <mutex>
@@ -76,6 +75,7 @@ public:
                        const std::vector<const LayerSettings*>& layers,
                        const std::vector<const LayerSettings*>& layers,
                        ANativeWindowBuffer* buffer, const bool useFramebufferCache,
                        ANativeWindowBuffer* buffer, const bool useFramebufferCache,
                        base::unique_fd&& bufferFence, base::unique_fd* drawFence) override;
                        base::unique_fd&& bufferFence, base::unique_fd* drawFence) override;
    bool cleanupPostRender() override;


    EGLDisplay getEGLDisplay() const { return mEGLDisplay; }
    EGLDisplay getEGLDisplay() const { return mEGLDisplay; }
    // Creates an output image for rendering to
    // Creates an output image for rendering to
@@ -231,6 +231,17 @@ private:
    std::mutex mRenderingMutex;
    std::mutex mRenderingMutex;


    std::unique_ptr<Framebuffer> mDrawingBuffer;
    std::unique_ptr<Framebuffer> mDrawingBuffer;
    // this is a 1x1 RGB buffer, but over-allocate in case a driver wants more
    // memory or if it needs to satisfy alignment requirements. In this case:
    // assume that each channel requires 4 bytes, and add 3 additional bytes to
    // ensure that we align on a word. Allocating 16 bytes will provide a
    // guarantee that we don't clobber memory.
    uint32_t mPlaceholderDrawBuffer[4];
    sp<Fence> mLastDrawFence;
    // Store a separate boolean checking if prior resources were cleaned up, as
    // devices that don't support native sync fences can't rely on a last draw
    // fence that doesn't exist.
    bool mPriorResourcesCleaned = true;


    // Blur effect processor, only instantiated when a layer requests it.
    // Blur effect processor, only instantiated when a layer requests it.
    BlurFilter* mBlurFilter = nullptr;
    BlurFilter* mBlurFilter = nullptr;
+2 −2
Original line number Original line Diff line number Diff line
@@ -68,11 +68,11 @@ bool GLFramebuffer::setNativeWindowBuffer(ANativeWindowBuffer* nativeBuffer, boo
    return true;
    return true;
}
}


void GLFramebuffer::allocateBuffers(uint32_t width, uint32_t height) {
void GLFramebuffer::allocateBuffers(uint32_t width, uint32_t height, void* data) {
    ATRACE_CALL();
    ATRACE_CALL();


    glBindTexture(GL_TEXTURE_2D, mTextureName);
    glBindTexture(GL_TEXTURE_2D, mTextureName);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
+1 −1
Original line number Original line Diff line number Diff line
@@ -39,7 +39,7 @@ public:


    bool setNativeWindowBuffer(ANativeWindowBuffer* nativeBuffer, bool isProtected,
    bool setNativeWindowBuffer(ANativeWindowBuffer* nativeBuffer, bool isProtected,
                               const bool useFramebufferCache) override;
                               const bool useFramebufferCache) override;
    void allocateBuffers(uint32_t width, uint32_t height);
    void allocateBuffers(uint32_t width, uint32_t height, void* data = nullptr);
    EGLImageKHR getEGLImage() const { return mEGLImage; }
    EGLImageKHR getEGLImage() const { return mEGLImage; }
    uint32_t getTextureName() const { return mTextureName; }
    uint32_t getTextureName() const { return mTextureName; }
    uint32_t getFramebufferName() const { return mFramebufferName; }
    uint32_t getFramebufferName() const { return mFramebufferName; }
+8 −0
Original line number Original line Diff line number Diff line
@@ -111,6 +111,14 @@ public:
    // Returns NO_ERROR when binds successfully, NO_MEMORY when there's no memory for allocation.
    // Returns NO_ERROR when binds successfully, NO_MEMORY when there's no memory for allocation.
    virtual status_t bindFrameBuffer(Framebuffer* framebuffer) = 0;
    virtual status_t bindFrameBuffer(Framebuffer* framebuffer) = 0;
    virtual void unbindFrameBuffer(Framebuffer* framebuffer) = 0;
    virtual void unbindFrameBuffer(Framebuffer* framebuffer) = 0;
    // Clean-up method that should be called on the main thread after the
    // drawFence returned by drawLayers fires. This method will free up
    // resources used by the most recently drawn frame. If the frame is still
    // being drawn, then this call is silently ignored.
    //
    // Returns true if resources were cleaned up, and false if we didn't need to
    // do any work.
    virtual bool cleanupPostRender() = 0;


    // queries
    // queries
    virtual size_t getMaxTextureSize() const = 0;
    virtual size_t getMaxTextureSize() const = 0;
Loading