blob: 21d5b8197d04e70a042c52ef502b156cef427798 [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>
21#include <sys/types.h>
22
Peiyong Linf11f39b2018-09-05 14:37:41 -070023#include <EGL/egl.h>
24#include <EGL/eglext.h>
Mathias Agopian3f844832013-08-07 21:24:32 -070025#include <GLES2/gl2.h>
Peiyong Lincbc184f2018-08-22 13:24:10 -070026#include <renderengine/RenderEngine.h>
Peiyong Lin833074a2018-08-28 11:53:54 -070027#include <renderengine/private/Description.h>
Mathias Agopian3f844832013-08-07 21:24:32 -070028
Peiyong Linf11f39b2018-09-05 14:37:41 -070029#define EGL_NO_CONFIG ((EGLConfig)0)
30
Mathias Agopian3f844832013-08-07 21:24:32 -070031namespace android {
Mathias Agopian3f844832013-08-07 21:24:32 -070032
Peiyong Lin833074a2018-08-28 11:53:54 -070033namespace renderengine {
34
Mathias Agopian3f844832013-08-07 21:24:32 -070035class Mesh;
Mathias Agopian49457ac2013-08-14 18:20:17 -070036class Texture;
Mathias Agopian3f844832013-08-07 21:24:32 -070037
Peiyong Lin833074a2018-08-28 11:53:54 -070038namespace gl {
Lloyd Pique144e1162017-12-20 16:44:52 -080039
Peiyong Linf1bada92018-08-29 09:39:31 -070040class GLImage;
Peiyong Linf1bada92018-08-29 09:39:31 -070041
Peiyong Lin7e219eb2018-12-03 05:40:42 -080042class GLESRenderEngine : public impl::RenderEngine {
Mathias Agopian3f844832013-08-07 21:24:32 -070043public:
Peiyong Lin7e219eb2018-12-03 05:40:42 -080044 static std::unique_ptr<GLESRenderEngine> create(int hwcFormat, uint32_t featureFlags);
Peiyong Linf11f39b2018-09-05 14:37:41 -070045 static EGLConfig chooseEglConfig(EGLDisplay display, int format, bool logConfig);
46
Peiyong Lin7e219eb2018-12-03 05:40:42 -080047 GLESRenderEngine(uint32_t featureFlags, // See RenderEngine::FeatureFlag
48 EGLDisplay display, EGLConfig config, EGLContext ctxt, EGLSurface dummy);
49 ~GLESRenderEngine() override;
Mathias Agopian3f844832013-08-07 21:24:32 -070050
Peiyong Line5a9a7f2018-08-30 15:32:13 -070051 std::unique_ptr<Framebuffer> createFramebuffer() override;
Peiyong Line5a9a7f2018-08-30 15:32:13 -070052 std::unique_ptr<Image> createImage() override;
Peiyong Linf1bada92018-08-29 09:39:31 -070053
54 void primeCache() const override;
Peiyong Lin60bedb52018-09-05 10:47:31 -070055 bool isCurrent() const override;
Peiyong Lin60bedb52018-09-05 10:47:31 -070056 base::unique_fd flush() override;
57 bool finish() override;
58 bool waitFence(base::unique_fd fenceFd) override;
59 void clearWithColor(float red, float green, float blue, float alpha) override;
Chia-I Wu28e3a252018-09-07 12:05:02 -070060 void fillRegionWithColor(const Region& region, float red, float green, float blue,
61 float alpha) override;
Alec Mouri05483a02018-09-10 21:03:42 +000062 void setScissor(const Rect& region) override;
Peiyong Lin60bedb52018-09-05 10:47:31 -070063 void disableScissor() override;
64 void genTextures(size_t count, uint32_t* names) override;
65 void deleteTextures(size_t count, uint32_t const* names) override;
Peiyong Line5a9a7f2018-08-30 15:32:13 -070066 void bindExternalTextureImage(uint32_t texName, const Image& image) override;
67 status_t bindFrameBuffer(Framebuffer* framebuffer) override;
68 void unbindFrameBuffer(Framebuffer* framebuffer) override;
Peiyong Lin60bedb52018-09-05 10:47:31 -070069 void checkErrors() const override;
Peiyong Linf1bada92018-08-29 09:39:31 -070070
Alec Mouri6e57f682018-09-29 20:45:08 -070071 status_t drawLayers(const DisplaySettings& settings, const std::vector<LayerSettings>& layers,
72 ANativeWindowBuffer* const buffer,
73 base::unique_fd* displayFence) const override;
74
Peiyong Linf11f39b2018-09-05 14:37:41 -070075 // internal to RenderEngine
76 EGLDisplay getEGLDisplay() const { return mEGLDisplay; }
77 EGLConfig getEGLConfig() const { return mEGLConfig; }
78
Mathias Agopian3f844832013-08-07 21:24:32 -070079protected:
Yiwei Zhang5434a782018-12-05 18:06:32 -080080 void dump(std::string& result) override;
Peiyong Line5a9a7f2018-08-30 15:32:13 -070081 void setViewportAndProjection(size_t vpw, size_t vph, Rect sourceCrop,
82 ui::Transform::orientation_flags rotation) override;
83 void setupLayerBlending(bool premultipliedAlpha, bool opaque, bool disableTexture,
Lucas Dupin1b6531c2018-07-05 17:18:21 -070084 const half4& color, float cornerRadius) override;
Peiyong Line5a9a7f2018-08-30 15:32:13 -070085 void setupLayerTexturing(const Texture& texture) override;
86 void setupLayerBlackedOut() override;
87 void setupFillWithColor(float r, float g, float b, float a) override;
Peiyong Lind3788632018-09-18 16:01:31 -070088 void setColorTransform(const mat4& colorTransform) override;
Peiyong Line5a9a7f2018-08-30 15:32:13 -070089 void disableTexturing() override;
90 void disableBlending() override;
Lucas Dupin1b6531c2018-07-05 17:18:21 -070091 void setupCornerRadiusCropSize(float width, float height) override;
Mathias Agopian3f844832013-08-07 21:24:32 -070092
Peiyong Linf11f39b2018-09-05 14:37:41 -070093 // HDR and color management related functions and state
94 void setSourceY410BT2020(bool enable) override;
95 void setSourceDataSpace(ui::Dataspace source) override;
96 void setOutputDataSpace(ui::Dataspace dataspace) override;
97 void setDisplayMaxLuminance(const float maxLuminance) override;
98
99 // drawing
Peiyong Line5a9a7f2018-08-30 15:32:13 -0700100 void drawMesh(const Mesh& mesh) override;
Mathias Agopian3f844832013-08-07 21:24:32 -0700101
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
113 static GlesVersion parseGlesVersion(const char* str);
Peiyong Lina5e9f1b2018-11-27 22:49:37 -0800114 static EGLContext createEglContext(EGLDisplay display, EGLConfig config,
115 EGLContext shareContext, bool useContextPriority);
116 static EGLSurface createDummyEglPbufferSurface(EGLDisplay display, EGLConfig config,
117 int hwcFormat);
Peiyong Linf11f39b2018-09-05 14:37:41 -0700118
Peiyong Line5a9a7f2018-08-30 15:32:13 -0700119 // A data space is considered HDR data space if it has BT2020 color space
120 // with PQ or HLG transfer function.
121 bool isHdrDataSpace(const ui::Dataspace dataSpace) const;
122 bool needsXYZTransformMatrix() const;
Alec Mouri0a9c7b82018-11-16 13:05:25 -0800123 void setEGLHandles(EGLDisplay display, EGLConfig config, EGLContext ctxt, EGLSurface dummy);
Peiyong Line5a9a7f2018-08-30 15:32:13 -0700124
Peiyong Linf11f39b2018-09-05 14:37:41 -0700125 EGLDisplay mEGLDisplay;
126 EGLConfig mEGLConfig;
127 EGLContext mEGLContext;
Alec Mouri0a9c7b82018-11-16 13:05:25 -0800128 EGLSurface mDummySurface;
Peiyong Line5a9a7f2018-08-30 15:32:13 -0700129 GLuint mProtectedTexName;
130 GLint mMaxViewportDims[2];
131 GLint mMaxTextureSize;
132 GLuint mVpWidth;
133 GLuint mVpHeight;
134 Description mState;
135
Peiyong Lin70b26ce2018-09-18 19:02:39 -0700136 mat4 mSrgbToXyz;
Peiyong Lin70b26ce2018-09-18 19:02:39 -0700137 mat4 mDisplayP3ToXyz;
Valerie Haueb8e0762018-11-06 10:10:42 -0800138 mat4 mBt2020ToXyz;
Peiyong Line5a9a7f2018-08-30 15:32:13 -0700139 mat4 mXyzToSrgb;
140 mat4 mXyzToDisplayP3;
141 mat4 mXyzToBt2020;
Valerie Haueb8e0762018-11-06 10:10:42 -0800142 mat4 mSrgbToDisplayP3;
143 mat4 mSrgbToBt2020;
144 mat4 mDisplayP3ToSrgb;
145 mat4 mDisplayP3ToBt2020;
146 mat4 mBt2020ToSrgb;
147 mat4 mBt2020ToDisplayP3;
Peiyong Line5a9a7f2018-08-30 15:32:13 -0700148
Alec Mouri05483a02018-09-10 21:03:42 +0000149 int32_t mFboHeight = 0;
Peiyong Linfb069302018-04-25 14:34:31 -0700150
151 // Current dataspace of layer being rendered
152 ui::Dataspace mDataSpace = ui::Dataspace::UNKNOWN;
153
154 // Current output dataspace of the render engine
155 ui::Dataspace mOutputDataSpace = ui::Dataspace::UNKNOWN;
156
Peiyong Lin13effd12018-07-24 17:01:47 -0700157 // Whether device supports color management, currently color management
158 // supports sRGB, DisplayP3 color spaces.
159 const bool mUseColorManagement = false;
Mathias Agopian3f844832013-08-07 21:24:32 -0700160};
161
Peiyong Lin46080ef2018-10-26 18:43:14 -0700162} // namespace gl
163} // namespace renderengine
164} // namespace android
Mathias Agopian3f844832013-08-07 21:24:32 -0700165
Peiyong Lin7e219eb2018-12-03 05:40:42 -0800166#endif /* SF_GLESRENDERENGINE_H_ */