blob: 4fc457f904136510267d6ab5fb63caffb77d3d92 [file] [log] [blame]
Mathias Agopian3f844832013-08-07 21:24:32 -07001/*
2 * Copyright 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Peiyong Lin7e219eb2018-12-03 05:40:42 -080017#ifndef SF_GLESRENDERENGINE_H_
18#define SF_GLESRENDERENGINE_H_
Mathias Agopian3f844832013-08-07 21:24:32 -070019
20#include <stdint.h>
Alec Mouri554d06e2018-12-20 00:15:33 -080021#include <condition_variable>
Alec Mourida4cf3b2019-02-12 15:33:01 -080022#include <deque>
Alec Mouri554d06e2018-12-20 00:15:33 -080023#include <mutex>
24#include <queue>
25#include <thread>
Alec Mourida4cf3b2019-02-12 15:33:01 -080026#include <unordered_map>
Mathias Agopian3f844832013-08-07 21:24:32 -070027
Peiyong Linf11f39b2018-09-05 14:37:41 -070028#include <EGL/egl.h>
29#include <EGL/eglext.h>
Mathias Agopian3f844832013-08-07 21:24:32 -070030#include <GLES2/gl2.h>
Alec Mouri16a99402019-07-29 16:37:30 -070031#include <android-base/thread_annotations.h>
Peiyong Lincbc184f2018-08-22 13:24:10 -070032#include <renderengine/RenderEngine.h>
Peiyong Lin833074a2018-08-28 11:53:54 -070033#include <renderengine/private/Description.h>
Alec Mouri16a99402019-07-29 16:37:30 -070034#include <sys/types.h>
Vishnu Nairf19544f2020-02-03 11:23:26 -080035#include "GLShadowTexture.h"
Alec Mouri16a99402019-07-29 16:37:30 -070036#include "ImageManager.h"
Mathias Agopian3f844832013-08-07 21:24:32 -070037
Peiyong Linf11f39b2018-09-05 14:37:41 -070038#define EGL_NO_CONFIG ((EGLConfig)0)
39
Mathias Agopian3f844832013-08-07 21:24:32 -070040namespace android {
Mathias Agopian3f844832013-08-07 21:24:32 -070041
Peiyong Lin833074a2018-08-28 11:53:54 -070042namespace renderengine {
43
Mathias Agopian3f844832013-08-07 21:24:32 -070044class Mesh;
Mathias Agopian49457ac2013-08-14 18:20:17 -070045class Texture;
Mathias Agopian3f844832013-08-07 21:24:32 -070046
Peiyong Lin833074a2018-08-28 11:53:54 -070047namespace gl {
Lloyd Pique144e1162017-12-20 16:44:52 -080048
Peiyong Linf1bada92018-08-29 09:39:31 -070049class GLImage;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -080050class BlurFilter;
Peiyong Linf1bada92018-08-29 09:39:31 -070051
Peiyong Lin7e219eb2018-12-03 05:40:42 -080052class GLESRenderEngine : public impl::RenderEngine {
Mathias Agopian3f844832013-08-07 21:24:32 -070053public:
Peiyong Lin4137a1d2019-10-09 10:39:09 -070054 static std::unique_ptr<GLESRenderEngine> create(const RenderEngineCreationArgs& args);
Peiyong Linf11f39b2018-09-05 14:37:41 -070055
Peiyong Lin4137a1d2019-10-09 10:39:09 -070056 GLESRenderEngine(const RenderEngineCreationArgs& args, EGLDisplay display, EGLConfig config,
57 EGLContext ctxt, EGLSurface dummy, EGLContext protectedContext,
58 EGLSurface protectedDummy);
Alec Mourid43ccab2019-03-13 12:23:45 -070059 ~GLESRenderEngine() override EXCLUDES(mRenderingMutex);
Mathias Agopian3f844832013-08-07 21:24:32 -070060
Peiyong Linf1bada92018-08-29 09:39:31 -070061 void primeCache() const override;
Peiyong Lin60bedb52018-09-05 10:47:31 -070062 void genTextures(size_t count, uint32_t* names) override;
63 void deleteTextures(size_t count, uint32_t const* names) override;
Peiyong Line5a9a7f2018-08-30 15:32:13 -070064 void bindExternalTextureImage(uint32_t texName, const Image& image) override;
Alec Mourid7b3a8b2019-03-21 11:44:18 -070065 status_t bindExternalTextureBuffer(uint32_t texName, const sp<GraphicBuffer>& buffer,
66 const sp<Fence>& fence) EXCLUDES(mRenderingMutex);
Alec Mouri16a99402019-07-29 16:37:30 -070067 void cacheExternalTextureBuffer(const sp<GraphicBuffer>& buffer) EXCLUDES(mRenderingMutex);
Alec Mourif0497272019-03-11 15:53:11 -070068 void unbindExternalTextureBuffer(uint64_t bufferId) EXCLUDES(mRenderingMutex);
Peiyong Line5a9a7f2018-08-30 15:32:13 -070069 status_t bindFrameBuffer(Framebuffer* framebuffer) override;
70 void unbindFrameBuffer(Framebuffer* framebuffer) override;
Peiyong Linf1bada92018-08-29 09:39:31 -070071
Peiyong Linfb530cf2018-12-15 05:07:38 +000072 bool isProtected() const override { return mInProtectedContext; }
73 bool supportsProtectedContent() const override;
74 bool useProtectedContext(bool useProtectedContext) override;
Vishnu Nair9b079a22020-01-21 14:36:08 -080075 status_t drawLayers(const DisplaySettings& display,
76 const std::vector<const LayerSettings*>& layers,
Alec Mourife0d72b2019-03-21 14:05:56 -070077 ANativeWindowBuffer* buffer, const bool useFramebufferCache,
Alec Mouri3d7c5612019-07-09 13:51:37 -070078 base::unique_fd&& bufferFence, base::unique_fd* drawFence) override;
Alec Mouri6e57f682018-09-29 20:45:08 -070079
Peiyong Linf11f39b2018-09-05 14:37:41 -070080 EGLDisplay getEGLDisplay() const { return mEGLDisplay; }
Alec Mourida4cf3b2019-02-12 15:33:01 -080081 // Creates an output image for rendering to
Alec Mourife0d72b2019-03-21 14:05:56 -070082 EGLImageKHR createFramebufferImageIfNeeded(ANativeWindowBuffer* nativeBuffer, bool isProtected,
Alec Mourief44c2d2019-07-15 15:27:22 -070083 bool useFramebufferCache)
84 EXCLUDES(mFramebufferImageCacheMutex);
Peiyong Linf11f39b2018-09-05 14:37:41 -070085
Alec Mourid43ccab2019-03-13 12:23:45 -070086 // Test-only methods
87 // Returns true iff mImageCache contains an image keyed by bufferId
88 bool isImageCachedForTesting(uint64_t bufferId) EXCLUDES(mRenderingMutex);
89 // Returns true iff mFramebufferImageCache contains an image keyed by bufferId
Alec Mourief44c2d2019-07-15 15:27:22 -070090 bool isFramebufferImageCachedForTesting(uint64_t bufferId)
91 EXCLUDES(mFramebufferImageCacheMutex);
Alec Mouri16a99402019-07-29 16:37:30 -070092 // These are wrappers around public methods above, but exposing Barrier
93 // objects so that tests can block.
94 std::shared_ptr<ImageManager::Barrier> cacheExternalTextureBufferForTesting(
95 const sp<GraphicBuffer>& buffer);
96 std::shared_ptr<ImageManager::Barrier> unbindExternalTextureBufferForTesting(uint64_t bufferId);
Alec Mourid43ccab2019-03-13 12:23:45 -070097
Mathias Agopian3f844832013-08-07 21:24:32 -070098protected:
Alec Mouri820c7402019-01-23 13:02:39 -080099 Framebuffer* getFramebufferForDrawing() override;
Alec Mourief44c2d2019-07-15 15:27:22 -0700100 void dump(std::string& result) override EXCLUDES(mRenderingMutex)
101 EXCLUDES(mFramebufferImageCacheMutex);
Peiyong Line5a9a7f2018-08-30 15:32:13 -0700102 size_t getMaxTextureSize() const override;
103 size_t getMaxViewportDims() const override;
104
105private:
Peiyong Linf11f39b2018-09-05 14:37:41 -0700106 enum GlesVersion {
107 GLES_VERSION_1_0 = 0x10000,
108 GLES_VERSION_1_1 = 0x10001,
109 GLES_VERSION_2_0 = 0x20000,
110 GLES_VERSION_3_0 = 0x30000,
111 };
112
Alec Mouri8002fca2019-06-28 15:24:13 -0700113 static EGLConfig chooseEglConfig(EGLDisplay display, int format, bool logConfig);
Peiyong Linf11f39b2018-09-05 14:37:41 -0700114 static GlesVersion parseGlesVersion(const char* str);
Peiyong Lina5e9f1b2018-11-27 22:49:37 -0800115 static EGLContext createEglContext(EGLDisplay display, EGLConfig config,
Peiyong Linfb530cf2018-12-15 05:07:38 +0000116 EGLContext shareContext, bool useContextPriority,
117 Protection protection);
Peiyong Lina5e9f1b2018-11-27 22:49:37 -0800118 static EGLSurface createDummyEglPbufferSurface(EGLDisplay display, EGLConfig config,
Peiyong Linfb530cf2018-12-15 05:07:38 +0000119 int hwcFormat, Protection protection);
Alec Mouri8002fca2019-06-28 15:24:13 -0700120 std::unique_ptr<Framebuffer> createFramebuffer();
121 std::unique_ptr<Image> createImage();
122 void checkErrors() const;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800123 void checkErrors(const char* tag) const;
Peiyong Lin1c097612019-03-22 16:21:46 -0700124 void setScissor(const Rect& region);
125 void disableScissor();
Alec Mouri554d06e2018-12-20 00:15:33 -0800126 bool waitSync(EGLSyncKHR sync, EGLint flags);
Alec Mouri16a99402019-07-29 16:37:30 -0700127 status_t cacheExternalTextureBufferInternal(const sp<GraphicBuffer>& buffer)
128 EXCLUDES(mRenderingMutex);
129 void unbindExternalTextureBufferInternal(uint64_t bufferId) EXCLUDES(mRenderingMutex);
Peiyong Linf11f39b2018-09-05 14:37:41 -0700130
Peiyong Line5a9a7f2018-08-30 15:32:13 -0700131 // A data space is considered HDR data space if it has BT2020 color space
132 // with PQ or HLG transfer function.
133 bool isHdrDataSpace(const ui::Dataspace dataSpace) const;
134 bool needsXYZTransformMatrix() const;
Alec Mouri1089aed2018-10-25 21:33:57 -0700135 // Defines the viewport, and sets the projection matrix to the projection
136 // defined by the clip.
137 void setViewportAndProjection(Rect viewport, Rect clip);
Alec Mouri539319f2018-12-19 17:56:23 -0800138 // Evicts stale images from the buffer cache.
139 void evictImages(const std::vector<LayerSettings>& layers);
Alec Mouri7c94edb2018-12-03 21:23:26 -0800140 // Computes the cropping window for the layer and sets up cropping
141 // coordinates for the mesh.
142 FloatRect setupLayerCropping(const LayerSettings& layer, Mesh& mesh);
Peiyong Line5a9a7f2018-08-30 15:32:13 -0700143
Peiyong Lin1c097612019-03-22 16:21:46 -0700144 // We do a special handling for rounded corners when it's possible to turn off blending
145 // for the majority of the layer. The rounded corners needs to turn on blending such that
146 // we can set the alpha value correctly, however, only the corners need this, and since
147 // blending is an expensive operation, we want to turn off blending when it's not necessary.
148 void handleRoundedCorners(const DisplaySettings& display, const LayerSettings& layer,
149 const Mesh& mesh);
Alec Mouri8002fca2019-06-28 15:24:13 -0700150 base::unique_fd flush();
151 bool finish();
152 bool waitFence(base::unique_fd fenceFd);
153 void clearWithColor(float red, float green, float blue, float alpha);
154 void fillRegionWithColor(const Region& region, float red, float green, float blue, float alpha);
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800155 void handleShadow(const FloatRect& casterRect, float casterCornerRadius,
156 const ShadowSettings& shadowSettings);
Alec Mouri8002fca2019-06-28 15:24:13 -0700157 void setupLayerBlending(bool premultipliedAlpha, bool opaque, bool disableTexture,
158 const half4& color, float cornerRadius);
159 void setupLayerTexturing(const Texture& texture);
160 void setupFillWithColor(float r, float g, float b, float a);
161 void setColorTransform(const mat4& colorTransform);
162 void disableTexturing();
163 void disableBlending();
164 void setupCornerRadiusCropSize(float width, float height);
165
166 // HDR and color management related functions and state
167 void setSourceY410BT2020(bool enable);
168 void setSourceDataSpace(ui::Dataspace source);
169 void setOutputDataSpace(ui::Dataspace dataspace);
170 void setDisplayMaxLuminance(const float maxLuminance);
171
172 // drawing
173 void drawMesh(const Mesh& mesh);
Peiyong Lin1c097612019-03-22 16:21:46 -0700174
Peiyong Linf11f39b2018-09-05 14:37:41 -0700175 EGLDisplay mEGLDisplay;
176 EGLConfig mEGLConfig;
177 EGLContext mEGLContext;
Alec Mouri0a9c7b82018-11-16 13:05:25 -0800178 EGLSurface mDummySurface;
Peiyong Linfb530cf2018-12-15 05:07:38 +0000179 EGLContext mProtectedEGLContext;
180 EGLSurface mProtectedDummySurface;
Peiyong Line5a9a7f2018-08-30 15:32:13 -0700181 GLuint mProtectedTexName;
182 GLint mMaxViewportDims[2];
183 GLint mMaxTextureSize;
184 GLuint mVpWidth;
185 GLuint mVpHeight;
186 Description mState;
Vishnu Nairf19544f2020-02-03 11:23:26 -0800187 GLShadowTexture mShadowTexture;
Peiyong Line5a9a7f2018-08-30 15:32:13 -0700188
Peiyong Lin70b26ce2018-09-18 19:02:39 -0700189 mat4 mSrgbToXyz;
Peiyong Lin70b26ce2018-09-18 19:02:39 -0700190 mat4 mDisplayP3ToXyz;
Valerie Haueb8e0762018-11-06 10:10:42 -0800191 mat4 mBt2020ToXyz;
Peiyong Line5a9a7f2018-08-30 15:32:13 -0700192 mat4 mXyzToSrgb;
193 mat4 mXyzToDisplayP3;
194 mat4 mXyzToBt2020;
Valerie Haueb8e0762018-11-06 10:10:42 -0800195 mat4 mSrgbToDisplayP3;
196 mat4 mSrgbToBt2020;
197 mat4 mDisplayP3ToSrgb;
198 mat4 mDisplayP3ToBt2020;
199 mat4 mBt2020ToSrgb;
200 mat4 mBt2020ToDisplayP3;
Peiyong Line5a9a7f2018-08-30 15:32:13 -0700201
Peiyong Linfb530cf2018-12-15 05:07:38 +0000202 bool mInProtectedContext = false;
Alec Mouri554d06e2018-12-20 00:15:33 -0800203 // If set to true, then enables tracing flush() and finish() to systrace.
204 bool mTraceGpuCompletion = false;
Alec Mourida4cf3b2019-02-12 15:33:01 -0800205 // Maximum size of mFramebufferImageCache. If more images would be cached, then (approximately)
206 // the last recently used buffer should be kicked out.
207 uint32_t mFramebufferImageCacheSize = 0;
208
209 // Cache of output images, keyed by corresponding GraphicBuffer ID.
Alec Mourief44c2d2019-07-15 15:27:22 -0700210 std::deque<std::pair<uint64_t, EGLImageKHR>> mFramebufferImageCache
211 GUARDED_BY(mFramebufferImageCacheMutex);
212 // The only reason why we have this mutex is so that we don't segfault when
213 // dumping info.
214 std::mutex mFramebufferImageCacheMutex;
Peiyong Linfb069302018-04-25 14:34:31 -0700215
216 // Current dataspace of layer being rendered
217 ui::Dataspace mDataSpace = ui::Dataspace::UNKNOWN;
218
219 // Current output dataspace of the render engine
220 ui::Dataspace mOutputDataSpace = ui::Dataspace::UNKNOWN;
221
Peiyong Lin13effd12018-07-24 17:01:47 -0700222 // Whether device supports color management, currently color management
223 // supports sRGB, DisplayP3 color spaces.
224 const bool mUseColorManagement = false;
Alec Mouri554d06e2018-12-20 00:15:33 -0800225
Alec Mouri539319f2018-12-19 17:56:23 -0800226 // Cache of GL images that we'll store per GraphicBuffer ID
Alec Mourif0497272019-03-11 15:53:11 -0700227 std::unordered_map<uint64_t, std::unique_ptr<Image>> mImageCache GUARDED_BY(mRenderingMutex);
228 // Mutex guarding rendering operations, so that:
229 // 1. GL operations aren't interleaved, and
230 // 2. Internal state related to rendering that is potentially modified by
231 // multiple threads is guaranteed thread-safe.
232 std::mutex mRenderingMutex;
233
Alec Mouri820c7402019-01-23 13:02:39 -0800234 std::unique_ptr<Framebuffer> mDrawingBuffer;
235
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800236 // Blur effect processor, only instantiated when a layer requests it.
237 BlurFilter* mBlurFilter = nullptr;
238
Alec Mouri554d06e2018-12-20 00:15:33 -0800239 class FlushTracer {
240 public:
241 FlushTracer(GLESRenderEngine* engine);
242 ~FlushTracer();
243 void queueSync(EGLSyncKHR sync) EXCLUDES(mMutex);
244
245 struct QueueEntry {
246 EGLSyncKHR mSync = nullptr;
247 uint64_t mFrameNum = 0;
248 };
249
250 private:
251 void loop();
252 GLESRenderEngine* const mEngine;
253 std::thread mThread;
254 std::condition_variable_any mCondition;
255 std::mutex mMutex;
256 std::queue<QueueEntry> mQueue GUARDED_BY(mMutex);
257 uint64_t mFramesQueued GUARDED_BY(mMutex) = 0;
258 bool mRunning = true;
259 };
260 friend class FlushTracer;
Alec Mouri16a99402019-07-29 16:37:30 -0700261 friend class ImageManager;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800262 friend class GLFramebuffer;
263 friend class BlurFilter;
264 friend class GaussianBlurFilter;
265 friend class LensBlurFilter;
266 friend class GenericProgram;
Alec Mouri554d06e2018-12-20 00:15:33 -0800267 std::unique_ptr<FlushTracer> mFlushTracer;
Alec Mouri16a99402019-07-29 16:37:30 -0700268 std::unique_ptr<ImageManager> mImageManager = std::make_unique<ImageManager>(this);
Mathias Agopian3f844832013-08-07 21:24:32 -0700269};
270
Peiyong Lin46080ef2018-10-26 18:43:14 -0700271} // namespace gl
272} // namespace renderengine
273} // namespace android
Mathias Agopian3f844832013-08-07 21:24:32 -0700274
Peiyong Lin7e219eb2018-12-03 05:40:42 -0800275#endif /* SF_GLESRENDERENGINE_H_ */