Loading libs/renderengine/gl/GLESRenderEngine.cpp +18 −13 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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; } Loading @@ -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"); Loading @@ -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).", Loading libs/renderengine/gl/GLESRenderEngine.h +5 −3 Original line number Diff line number Diff line Loading @@ -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 Loading libs/renderengine/gl/GLFramebuffer.cpp +8 −2 Original line number Diff line number Diff line Loading @@ -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; } Loading libs/renderengine/gl/GLFramebuffer.h +3 −1 Original line number Diff line number Diff line Loading @@ -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; } Loading @@ -46,6 +47,7 @@ private: GLESRenderEngine& mEngine; EGLDisplay mEGLDisplay; EGLImageKHR mEGLImage; bool usingFramebufferCache = false; uint32_t mTextureName, mFramebufferName; int32_t mBufferHeight = 0; Loading libs/renderengine/include/renderengine/Framebuffer.h +2 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
libs/renderengine/gl/GLESRenderEngine.cpp +18 −13 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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; } Loading @@ -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"); Loading @@ -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).", Loading
libs/renderengine/gl/GLESRenderEngine.h +5 −3 Original line number Diff line number Diff line Loading @@ -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 Loading
libs/renderengine/gl/GLFramebuffer.cpp +8 −2 Original line number Diff line number Diff line Loading @@ -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; } Loading
libs/renderengine/gl/GLFramebuffer.h +3 −1 Original line number Diff line number Diff line Loading @@ -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; } Loading @@ -46,6 +47,7 @@ private: GLESRenderEngine& mEngine; EGLDisplay mEGLDisplay; EGLImageKHR mEGLImage; bool usingFramebufferCache = false; uint32_t mTextureName, mFramebufferName; int32_t mBufferHeight = 0; Loading
libs/renderengine/include/renderengine/Framebuffer.h +2 −1 Original line number Diff line number Diff line Loading @@ -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