blob: 94a4bbafc5481478798ae875a2223e0bdd692216 [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
Mathias Agopian3f844832013-08-07 21:24:32 -070017#ifndef SF_GLES20RENDERENGINE_H_
18#define SF_GLES20RENDERENGINE_H_
19
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
33class String8;
Peiyong Lin833074a2018-08-28 11:53:54 -070034
35namespace renderengine {
36
Mathias Agopian3f844832013-08-07 21:24:32 -070037class Mesh;
Mathias Agopian49457ac2013-08-14 18:20:17 -070038class Texture;
Mathias Agopian3f844832013-08-07 21:24:32 -070039
Peiyong Lin833074a2018-08-28 11:53:54 -070040namespace gl {
Lloyd Pique144e1162017-12-20 16:44:52 -080041
Peiyong Linf1bada92018-08-29 09:39:31 -070042class GLImage;
43class GLSurface;
44
Peiyong Lin833074a2018-08-28 11:53:54 -070045class GLES20RenderEngine : public impl::RenderEngine {
Mathias Agopian3f844832013-08-07 21:24:32 -070046public:
Peiyong Linf11f39b2018-09-05 14:37:41 -070047 static std::unique_ptr<GLES20RenderEngine> create(int hwcFormat, uint32_t featureFlags);
48 static EGLConfig chooseEglConfig(EGLDisplay display, int format, bool logConfig);
49
Kalle Raitabbdcf1f2017-05-22 15:47:46 -070050 GLES20RenderEngine(uint32_t featureFlags); // See RenderEngine::FeatureFlag
Peiyong Line5a9a7f2018-08-30 15:32:13 -070051 ~GLES20RenderEngine() override;
Mathias Agopian3f844832013-08-07 21:24:32 -070052
Peiyong Line5a9a7f2018-08-30 15:32:13 -070053 std::unique_ptr<Framebuffer> createFramebuffer() override;
54 std::unique_ptr<Surface> createSurface() override;
55 std::unique_ptr<Image> createImage() override;
Peiyong Linf1bada92018-08-29 09:39:31 -070056
57 void primeCache() const override;
Peiyong Lin60bedb52018-09-05 10:47:31 -070058 bool isCurrent() const override;
Peiyong Linf1bada92018-08-29 09:39:31 -070059 bool setCurrentSurface(const Surface& surface) override;
60 void resetCurrentSurface() override;
Peiyong Lin60bedb52018-09-05 10:47:31 -070061 base::unique_fd flush() override;
62 bool finish() override;
63 bool waitFence(base::unique_fd fenceFd) override;
64 void clearWithColor(float red, float green, float blue, float alpha) override;
Chia-I Wu28e3a252018-09-07 12:05:02 -070065 void fillRegionWithColor(const Region& region, float red, float green, float blue,
66 float alpha) override;
Peiyong Lin60bedb52018-09-05 10:47:31 -070067 void setScissor(uint32_t left, uint32_t bottom, uint32_t right, uint32_t top) override;
68 void disableScissor() override;
69 void genTextures(size_t count, uint32_t* names) override;
70 void deleteTextures(size_t count, uint32_t const* names) override;
Peiyong Line5a9a7f2018-08-30 15:32:13 -070071 void bindExternalTextureImage(uint32_t texName, const Image& image) override;
Peiyong Lin60bedb52018-09-05 10:47:31 -070072 void readPixels(size_t l, size_t b, size_t w, size_t h, uint32_t* pixels) override;
Peiyong Line5a9a7f2018-08-30 15:32:13 -070073 status_t bindFrameBuffer(Framebuffer* framebuffer) override;
74 void unbindFrameBuffer(Framebuffer* framebuffer) override;
Peiyong Lin60bedb52018-09-05 10:47:31 -070075 void checkErrors() const override;
Peiyong Linf1bada92018-08-29 09:39:31 -070076
Peiyong Linf11f39b2018-09-05 14:37:41 -070077 // internal to RenderEngine
78 EGLDisplay getEGLDisplay() const { return mEGLDisplay; }
79 EGLConfig getEGLConfig() const { return mEGLConfig; }
80
Mathias Agopian3f844832013-08-07 21:24:32 -070081protected:
Peiyong Line5a9a7f2018-08-30 15:32:13 -070082 void dump(String8& result) override;
83 void setViewportAndProjection(size_t vpw, size_t vph, Rect sourceCrop,
84 ui::Transform::orientation_flags rotation) override;
85 void setupLayerBlending(bool premultipliedAlpha, bool opaque, bool disableTexture,
86 const half4& color) override;
Peiyong Line5a9a7f2018-08-30 15:32:13 -070087 void setupLayerTexturing(const Texture& texture) override;
88 void setupLayerBlackedOut() override;
89 void setupFillWithColor(float r, float g, float b, float a) override;
90 void setupColorTransform(const mat4& colorTransform) override;
91 void disableTexturing() override;
92 void disableBlending() override;
Mathias Agopian3f844832013-08-07 21:24:32 -070093
Peiyong Linf11f39b2018-09-05 14:37:41 -070094 // HDR and color management related functions and state
95 void setSourceY410BT2020(bool enable) override;
96 void setSourceDataSpace(ui::Dataspace source) override;
97 void setOutputDataSpace(ui::Dataspace dataspace) override;
98 void setDisplayMaxLuminance(const float maxLuminance) override;
99
100 // drawing
Peiyong Line5a9a7f2018-08-30 15:32:13 -0700101 void drawMesh(const Mesh& mesh) override;
Mathias Agopian3f844832013-08-07 21:24:32 -0700102
Peiyong Line5a9a7f2018-08-30 15:32:13 -0700103 size_t getMaxTextureSize() const override;
104 size_t getMaxViewportDims() const override;
105
106private:
Peiyong Linf11f39b2018-09-05 14:37:41 -0700107 enum GlesVersion {
108 GLES_VERSION_1_0 = 0x10000,
109 GLES_VERSION_1_1 = 0x10001,
110 GLES_VERSION_2_0 = 0x20000,
111 GLES_VERSION_3_0 = 0x30000,
112 };
113
114 static GlesVersion parseGlesVersion(const char* str);
115
Peiyong Line5a9a7f2018-08-30 15:32:13 -0700116 // A data space is considered HDR data space if it has BT2020 color space
117 // with PQ or HLG transfer function.
118 bool isHdrDataSpace(const ui::Dataspace dataSpace) const;
119 bool needsXYZTransformMatrix() const;
Peiyong Linf11f39b2018-09-05 14:37:41 -0700120 void setEGLHandles(EGLDisplay display, EGLConfig config, EGLContext ctxt);
Peiyong Line5a9a7f2018-08-30 15:32:13 -0700121
Peiyong Linf11f39b2018-09-05 14:37:41 -0700122 EGLDisplay mEGLDisplay;
123 EGLConfig mEGLConfig;
124 EGLContext mEGLContext;
Peiyong Line5a9a7f2018-08-30 15:32:13 -0700125 GLuint mProtectedTexName;
126 GLint mMaxViewportDims[2];
127 GLint mMaxTextureSize;
128 GLuint mVpWidth;
129 GLuint mVpHeight;
130 Description mState;
131
132 mat4 mSrgbToDisplayP3;
133 mat4 mDisplayP3ToSrgb;
Peiyong Lin70b26ce2018-09-18 19:02:39 -0700134 mat4 mSrgbToXyz;
135 mat4 mBt2020ToXyz;
136 mat4 mDisplayP3ToXyz;
Peiyong Line5a9a7f2018-08-30 15:32:13 -0700137 mat4 mXyzToSrgb;
138 mat4 mXyzToDisplayP3;
139 mat4 mXyzToBt2020;
140
141 bool mRenderToFbo = false;
Peiyong Linfb069302018-04-25 14:34:31 -0700142
143 // Current dataspace of layer being rendered
144 ui::Dataspace mDataSpace = ui::Dataspace::UNKNOWN;
145
146 // Current output dataspace of the render engine
147 ui::Dataspace mOutputDataSpace = ui::Dataspace::UNKNOWN;
148
Peiyong Lin13effd12018-07-24 17:01:47 -0700149 // Whether device supports color management, currently color management
150 // supports sRGB, DisplayP3 color spaces.
151 const bool mUseColorManagement = false;
Mathias Agopian3f844832013-08-07 21:24:32 -0700152};
153
Peiyong Lin833074a2018-08-28 11:53:54 -0700154} // namespace gl
155} // namespace renderengine
156} // namespace android
Mathias Agopian3f844832013-08-07 21:24:32 -0700157
158#endif /* SF_GLES20RENDERENGINE_H_ */