diff options
Diffstat (limited to 'libs/renderengine/gl/GLESRenderEngine.h')
-rw-r--r-- | libs/renderengine/gl/GLESRenderEngine.h | 77 |
1 files changed, 53 insertions, 24 deletions
diff --git a/libs/renderengine/gl/GLESRenderEngine.h b/libs/renderengine/gl/GLESRenderEngine.h index 42b8537b94..4cb1b4259b 100644 --- a/libs/renderengine/gl/GLESRenderEngine.h +++ b/libs/renderengine/gl/GLESRenderEngine.h @@ -48,34 +48,30 @@ namespace gl { class GLImage; class BlurFilter; -class GLESRenderEngine : public impl::RenderEngine { +class GLESRenderEngine : public RenderEngine { public: static std::unique_ptr<GLESRenderEngine> create(const RenderEngineCreationArgs& args); GLESRenderEngine(const RenderEngineCreationArgs& args, EGLDisplay display, EGLConfig config, - EGLContext ctxt, EGLSurface dummy, EGLContext protectedContext, - EGLSurface protectedDummy); + EGLContext ctxt, EGLSurface stub, EGLContext protectedContext, + EGLSurface protectedStub); ~GLESRenderEngine() override EXCLUDES(mRenderingMutex); - void primeCache() const override; + std::future<void> primeCache() override; void genTextures(size_t count, uint32_t* names) override; void deleteTextures(size_t count, uint32_t const* names) override; - void bindExternalTextureImage(uint32_t texName, const Image& image) override; - status_t bindExternalTextureBuffer(uint32_t texName, const sp<GraphicBuffer>& buffer, - const sp<Fence>& fence) EXCLUDES(mRenderingMutex); - void cacheExternalTextureBuffer(const sp<GraphicBuffer>& buffer) EXCLUDES(mRenderingMutex); - void unbindExternalTextureBuffer(uint64_t bufferId) EXCLUDES(mRenderingMutex); - status_t bindFrameBuffer(Framebuffer* framebuffer) override; - void unbindFrameBuffer(Framebuffer* framebuffer) override; - bool isProtected() const override { return mInProtectedContext; } bool supportsProtectedContent() const override; - bool useProtectedContext(bool useProtectedContext) override; + void useProtectedContext(bool useProtectedContext) override; status_t drawLayers(const DisplaySettings& display, const std::vector<const LayerSettings*>& layers, - ANativeWindowBuffer* buffer, const bool useFramebufferCache, - base::unique_fd&& bufferFence, base::unique_fd* drawFence) override; - bool cleanupPostRender() override; + const std::shared_ptr<ExternalTexture>& buffer, + const bool useFramebufferCache, base::unique_fd&& bufferFence, + base::unique_fd* drawFence) override; + void cleanupPostRender() override; + int getContextPriority() override; + bool supportsBackgroundBlur() override { return mBlurFilter != nullptr; } + void onPrimaryDisplaySizeChanged(ui::Size size) override {} EGLDisplay getEGLDisplay() const { return mEGLDisplay; } // Creates an output image for rendering to @@ -86,6 +82,12 @@ public: // Test-only methods // Returns true iff mImageCache contains an image keyed by bufferId bool isImageCachedForTesting(uint64_t bufferId) EXCLUDES(mRenderingMutex); + // Returns true iff texName was previously generated by RenderEngine and was + // not destroyed. + bool isTextureNameKnownForTesting(uint32_t texName); + // Returns the buffer ID of the content bound to texName, or nullopt if no + // such mapping exists. + std::optional<uint64_t> getBufferIdForTextureNameForTesting(uint32_t texName); // Returns true iff mFramebufferImageCache contains an image keyed by bufferId bool isFramebufferImageCachedForTesting(uint64_t bufferId) EXCLUDES(mFramebufferImageCacheMutex); @@ -96,13 +98,19 @@ public: std::shared_ptr<ImageManager::Barrier> unbindExternalTextureBufferForTesting(uint64_t bufferId); protected: - Framebuffer* getFramebufferForDrawing() override; + Framebuffer* getFramebufferForDrawing(); void dump(std::string& result) override EXCLUDES(mRenderingMutex) EXCLUDES(mFramebufferImageCacheMutex); size_t getMaxTextureSize() const override; size_t getMaxViewportDims() const override; + void mapExternalTextureBuffer(const sp<GraphicBuffer>& buffer, bool isRenderable) + EXCLUDES(mRenderingMutex); + void unmapExternalTextureBuffer(const sp<GraphicBuffer>& buffer) EXCLUDES(mRenderingMutex); + bool canSkipPostRenderCleanup() const override; private: + friend class BindNativeBufferAsFramebuffer; + enum GlesVersion { GLES_VERSION_1_0 = 0x10000, GLES_VERSION_1_1 = 0x10001, @@ -113,10 +121,13 @@ private: static EGLConfig chooseEglConfig(EGLDisplay display, int format, bool logConfig); static GlesVersion parseGlesVersion(const char* str); static EGLContext createEglContext(EGLDisplay display, EGLConfig config, - EGLContext shareContext, bool useContextPriority, + EGLContext shareContext, + std::optional<ContextPriority> contextPriority, Protection protection); - static EGLSurface createDummyEglPbufferSurface(EGLDisplay display, EGLConfig config, - int hwcFormat, Protection protection); + static std::optional<RenderEngine::ContextPriority> createContextPriority( + const RenderEngineCreationArgs& args); + static EGLSurface createStubEglPbufferSurface(EGLDisplay display, EGLConfig config, + int hwcFormat, Protection protection); std::unique_ptr<Framebuffer> createFramebuffer(); std::unique_ptr<Image> createImage(); void checkErrors() const; @@ -127,6 +138,12 @@ private: status_t cacheExternalTextureBufferInternal(const sp<GraphicBuffer>& buffer) EXCLUDES(mRenderingMutex); void unbindExternalTextureBufferInternal(uint64_t bufferId) EXCLUDES(mRenderingMutex); + status_t bindFrameBuffer(Framebuffer* framebuffer); + void unbindFrameBuffer(Framebuffer* framebuffer); + void bindExternalTextureImage(uint32_t texName, const Image& image); + void bindExternalTextureBuffer(uint32_t texName, const sp<GraphicBuffer>& buffer, + const sp<Fence>& fence) EXCLUDES(mRenderingMutex); + void cleanFramebufferCache() EXCLUDES(mFramebufferImageCacheMutex) override; // A data space is considered HDR data space if it has BT2020 color space // with PQ or HLG transfer function. @@ -159,6 +176,7 @@ private: void setupLayerTexturing(const Texture& texture); void setupFillWithColor(float r, float g, float b, float a); void setColorTransform(const mat4& colorTransform); + void setDisplayColorTransform(const mat4& colorTransform); void disableTexturing(); void disableBlending(); void setupCornerRadiusCropSize(float width, float height); @@ -175,15 +193,15 @@ private: EGLDisplay mEGLDisplay; EGLConfig mEGLConfig; EGLContext mEGLContext; - EGLSurface mDummySurface; + EGLSurface mStubSurface; EGLContext mProtectedEGLContext; - EGLSurface mProtectedDummySurface; + EGLSurface mProtectedStubSurface; GLint mMaxViewportDims[2]; GLint mMaxTextureSize; GLuint mVpWidth; GLuint mVpHeight; Description mState; - GLShadowTexture mShadowTexture; + std::unique_ptr<GLShadowTexture> mShadowTexture = nullptr; mat4 mSrgbToXyz; mat4 mDisplayP3ToXyz; @@ -222,8 +240,14 @@ private: // supports sRGB, DisplayP3 color spaces. const bool mUseColorManagement = false; + // Whether only shaders performing tone mapping from HDR to SDR will be generated on + // primeCache(). + const bool mPrecacheToneMapperShaderOnly = false; + // Cache of GL images that we'll store per GraphicBuffer ID std::unordered_map<uint64_t, std::unique_ptr<Image>> mImageCache GUARDED_BY(mRenderingMutex); + std::unordered_map<uint32_t, std::optional<uint64_t>> mTextureView; + // Mutex guarding rendering operations, so that: // 1. GL operations aren't interleaved, and // 2. Internal state related to rendering that is potentially modified by @@ -237,6 +261,11 @@ private: // ensure that we align on a word. Allocating 16 bytes will provide a // guarantee that we don't clobber memory. uint32_t mPlaceholderDrawBuffer[4]; + // Placeholder buffer and image, similar to mPlaceholderDrawBuffer, but + // instead these are intended for cleaning up texture memory with the + // GL_TEXTURE_EXTERNAL_OES target. + ANativeWindowBuffer* mPlaceholderBuffer = nullptr; + EGLImage mPlaceholderImage = EGL_NO_IMAGE_KHR; 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 @@ -273,7 +302,7 @@ private: friend class BlurFilter; friend class GenericProgram; std::unique_ptr<FlushTracer> mFlushTracer; - std::unique_ptr<ImageManager> mImageManager = std::make_unique<ImageManager>(this); + std::unique_ptr<ImageManager> mImageManager; }; } // namespace gl |