xref: /aosp_15_r20/external/angle/src/libANGLE/GLES1Renderer.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1 //
2 // Copyright 2018 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 
7 // GLES1Renderer.h: Defines GLES1 emulation rendering operations on top of a GLES3
8 // context. Used by Context.h.
9 
10 #ifndef LIBANGLE_GLES1_RENDERER_H_
11 #define LIBANGLE_GLES1_RENDERER_H_
12 
13 #include "GLES1State.h"
14 #include "angle_gl.h"
15 #include "common/angleutils.h"
16 #include "common/hash_containers.h"
17 #include "libANGLE/angletypes.h"
18 
19 #include <memory>
20 #include <string>
21 #include <unordered_map>
22 
23 namespace gl
24 {
25 class Context;
26 class GLES1State;
27 class Program;
28 class State;
29 class Shader;
30 class ShaderProgramManager;
31 
32 enum class GLES1StateEnables : uint64_t
33 {
34     Lighting                       = 0,
35     Fog                            = 1,
36     ClipPlanes                     = 2,
37     DrawTexture                    = 3,
38     PointRasterization             = 4,
39     PointSprite                    = 5,
40     RescaleNormal                  = 6,
41     Normalize                      = 7,
42     AlphaTest                      = 8,
43     ShadeModelFlat                 = 9,
44     ColorMaterial                  = 10,
45     LightModelTwoSided             = 11,
46     LogicOpThroughFramebufferFetch = 12,
47 
48     InvalidEnum = 13,
49     EnumCount   = 13,
50 };
51 
52 constexpr int kClipPlaneCount = 6;
53 constexpr int kTexUnitCount   = 4;
54 constexpr int kLightCount     = 8;
55 
56 using GLES1StateEnabledBitSet = angle::PackedEnumBitSet<GLES1StateEnables, uint64_t>;
57 
58 struct GLES1ShaderState
59 {
60     GLES1ShaderState();
61     ~GLES1ShaderState();
62     GLES1ShaderState(const GLES1ShaderState &other);
63 
64     size_t hash() const;
65 
66     GLES1StateEnabledBitSet mGLES1StateEnabled;
67 
68     using BoolLightArray     = bool[kLightCount];
69     using BoolTexArray       = bool[kTexUnitCount];
70     using BoolClipPlaneArray = bool[kClipPlaneCount];
71     using UintTexArray       = uint16_t[kTexUnitCount];
72 
73     BoolTexArray tex2DEnables   = {false, false, false, false};
74     BoolTexArray texCubeEnables = {false, false, false, false};
75 
76     UintTexArray tex2DFormats = {GL_RGBA, GL_RGBA, GL_RGBA, GL_RGBA};
77 
78     UintTexArray texEnvModes          = {};
79     UintTexArray texCombineRgbs       = {};
80     UintTexArray texCombineAlphas     = {};
81     UintTexArray texCombineSrc0Rgbs   = {};
82     UintTexArray texCombineSrc0Alphas = {};
83     UintTexArray texCombineSrc1Rgbs   = {};
84     UintTexArray texCombineSrc1Alphas = {};
85     UintTexArray texCombineSrc2Rgbs   = {};
86     UintTexArray texCombineSrc2Alphas = {};
87     UintTexArray texCombineOp0Rgbs    = {};
88     UintTexArray texCombineOp0Alphas  = {};
89     UintTexArray texCombineOp1Rgbs    = {};
90     UintTexArray texCombineOp1Alphas  = {};
91     UintTexArray texCombineOp2Rgbs    = {};
92     UintTexArray texCombineOp2Alphas  = {};
93 
94     BoolTexArray pointSpriteCoordReplaces = {};
95 
96     BoolLightArray lightEnables = {};
97 
98     BoolClipPlaneArray clipPlaneEnables = {};
99 
100     AlphaTestFunc alphaTestFunc = {};
101 
102     FogMode fogMode = {};
103 };
104 
105 bool operator==(const GLES1ShaderState &a, const GLES1ShaderState &b);
106 bool operator!=(const GLES1ShaderState &a, const GLES1ShaderState &b);
107 
108 }  // namespace gl
109 
110 namespace std
111 {
112 template <>
113 struct hash<gl::GLES1ShaderState>
114 {
115     size_t operator()(const gl::GLES1ShaderState &key) const { return key.hash(); }
116 };
117 }  // namespace std
118 
119 namespace gl
120 {
121 
122 class GLES1Renderer final : angle::NonCopyable
123 {
124   public:
125     GLES1Renderer();
126     ~GLES1Renderer();
127 
128     void onDestroy(Context *context, State *state);
129 
130     angle::Result prepareForDraw(PrimitiveMode mode,
131                                  Context *context,
132                                  State *glState,
133                                  GLES1State *gles1State);
134 
135     static int VertexArrayIndex(ClientVertexArrayType type, const GLES1State &gles1);
136     static ClientVertexArrayType VertexArrayType(int attribIndex);
137     static int TexCoordArrayIndex(unsigned int unit);
138 
139     void drawTexture(Context *context,
140                      State *glState,
141                      GLES1State *gles1State,
142                      float x,
143                      float y,
144                      float z,
145                      float width,
146                      float height);
147 
148   private:
149     using Mat4Uniform = float[16];
150     using Vec4Uniform = float[4];
151     using Vec3Uniform = float[3];
152 
153     Shader *getShader(ShaderProgramID handle) const;
154     Program *getProgram(ShaderProgramID handle) const;
155 
156     angle::Result compileShader(Context *context,
157                                 ShaderType shaderType,
158                                 const char *src,
159                                 ShaderProgramID *shaderOut);
160     angle::Result linkProgram(Context *context,
161                               State *glState,
162                               ShaderProgramID vshader,
163                               ShaderProgramID fshader,
164                               const angle::HashMap<GLint, std::string> &attribLocs,
165                               ShaderProgramID *programOut);
166     angle::Result initializeRendererProgram(Context *context,
167                                             State *glState,
168                                             GLES1State *gles1State);
169 
170     void setUniform1i(Context *context,
171                       ProgramExecutable *executable,
172                       UniformLocation location,
173                       GLint value);
174     void setUniform1ui(ProgramExecutable *executable, UniformLocation location, GLuint value);
175     void setUniform1iv(Context *context,
176                        ProgramExecutable *executable,
177                        UniformLocation location,
178                        GLint count,
179                        const GLint *value);
180     void setUniformMatrix4fv(ProgramExecutable *executable,
181                              UniformLocation location,
182                              GLint count,
183                              GLboolean transpose,
184                              const GLfloat *value);
185     void setUniform4fv(ProgramExecutable *executable,
186 
187                        UniformLocation location,
188                        GLint count,
189                        const GLfloat *value);
190     void setUniform3fv(ProgramExecutable *executable,
191 
192                        UniformLocation location,
193                        GLint count,
194                        const GLfloat *value);
195     void setUniform2fv(ProgramExecutable *executable,
196                        UniformLocation location,
197                        GLint count,
198                        const GLfloat *value);
199     void setUniform1f(ProgramExecutable *executable, UniformLocation location, GLfloat value);
200     void setUniform1fv(ProgramExecutable *executable,
201                        UniformLocation location,
202                        GLint count,
203                        const GLfloat *value);
204 
205     void setAttributesEnabled(Context *context,
206                               State *glState,
207                               GLES1State *gles1State,
208                               AttributesMask mask);
209 
210     static constexpr int kVertexAttribIndex           = 0;
211     static constexpr int kNormalAttribIndex           = 1;
212     static constexpr int kColorAttribIndex            = 2;
213     static constexpr int kPointSizeAttribIndex        = 3;
214     static constexpr int kTextureCoordAttribIndexBase = 4;
215 
216     bool mRendererProgramInitialized;
217     ShaderProgramManager *mShaderPrograms;
218 
219     GLES1ShaderState mShaderState = {};
220 
221     const char *getShaderBool(GLES1StateEnables state);
222     void addShaderDefine(std::stringstream &outStream,
223                          GLES1StateEnables state,
224                          const char *enableString);
225     void addShaderUint(std::stringstream &outStream, const char *name, uint16_t value);
226     void addShaderUintTexArray(std::stringstream &outStream,
227                                const char *texString,
228                                GLES1ShaderState::UintTexArray &texState);
229     void addShaderBoolTexArray(std::stringstream &outStream,
230                                const char *texString,
231                                GLES1ShaderState::BoolTexArray &texState);
232     void addShaderBoolLightArray(std::stringstream &outStream,
233                                  const char *name,
234                                  GLES1ShaderState::BoolLightArray &value);
235     void addShaderBoolClipPlaneArray(std::stringstream &outStream,
236                                      const char *name,
237                                      GLES1ShaderState::BoolClipPlaneArray &value);
238     void addVertexShaderDefs(std::stringstream &outStream);
239     void addFragmentShaderDefs(std::stringstream &outStream);
240 
241     struct GLES1ProgramState
242     {
243         ShaderProgramID program;
244 
245         UniformLocation projMatrixLoc;
246         UniformLocation modelviewMatrixLoc;
247         UniformLocation textureMatrixLoc;
248         UniformLocation modelviewInvTrLoc;
249 
250         // Texturing
251         std::array<UniformLocation, kTexUnitCount> tex2DSamplerLocs;
252         std::array<UniformLocation, kTexUnitCount> texCubeSamplerLocs;
253 
254         UniformLocation textureEnvColorLoc;
255         UniformLocation rgbScaleLoc;
256         UniformLocation alphaScaleLoc;
257 
258         // Alpha test
259         UniformLocation alphaTestRefLoc;
260 
261         // Shading, materials, and lighting
262         UniformLocation materialAmbientLoc;
263         UniformLocation materialDiffuseLoc;
264         UniformLocation materialSpecularLoc;
265         UniformLocation materialEmissiveLoc;
266         UniformLocation materialSpecularExponentLoc;
267 
268         UniformLocation lightModelSceneAmbientLoc;
269 
270         UniformLocation lightAmbientsLoc;
271         UniformLocation lightDiffusesLoc;
272         UniformLocation lightSpecularsLoc;
273         UniformLocation lightPositionsLoc;
274         UniformLocation lightDirectionsLoc;
275         UniformLocation lightSpotlightExponentsLoc;
276         UniformLocation lightSpotlightCutoffAnglesLoc;
277         UniformLocation lightAttenuationConstsLoc;
278         UniformLocation lightAttenuationLinearsLoc;
279         UniformLocation lightAttenuationQuadraticsLoc;
280 
281         // Fog
282         UniformLocation fogDensityLoc;
283         UniformLocation fogStartLoc;
284         UniformLocation fogEndLoc;
285         UniformLocation fogColorLoc;
286 
287         // Clip planes
288         UniformLocation clipPlanesLoc;
289 
290         // Logic op
291         UniformLocation logicOpLoc;
292 
293         // Point rasterization
294         UniformLocation pointSizeMinLoc;
295         UniformLocation pointSizeMaxLoc;
296         UniformLocation pointDistanceAttenuationLoc;
297 
298         // Draw texture
299         UniformLocation drawTextureCoordsLoc;
300         UniformLocation drawTextureDimsLoc;
301         UniformLocation drawTextureNormalizedCropRectLoc;
302     };
303 
304     struct GLES1UniformBuffers
305     {
306         std::array<Mat4Uniform, kTexUnitCount> textureMatrices;
307 
308         std::array<Vec4Uniform, kTexUnitCount> texEnvColors;
309         std::array<GLfloat, kTexUnitCount> texEnvRgbScales;
310         std::array<GLfloat, kTexUnitCount> texEnvAlphaScales;
311 
312         // Lighting
313         std::array<Vec4Uniform, kLightCount> lightAmbients;
314         std::array<Vec4Uniform, kLightCount> lightDiffuses;
315         std::array<Vec4Uniform, kLightCount> lightSpeculars;
316         std::array<Vec4Uniform, kLightCount> lightPositions;
317         std::array<Vec3Uniform, kLightCount> lightDirections;
318         std::array<GLfloat, kLightCount> spotlightExponents;
319         std::array<GLfloat, kLightCount> spotlightCutoffAngles;
320         std::array<GLfloat, kLightCount> attenuationConsts;
321         std::array<GLfloat, kLightCount> attenuationLinears;
322         std::array<GLfloat, kLightCount> attenuationQuadratics;
323 
324         // Clip planes
325         std::array<Vec4Uniform, kClipPlaneCount> clipPlanes;
326 
327         // Texture crop rectangles
328         std::array<Vec4Uniform, kTexUnitCount> texCropRects;
329     };
330 
331     struct GLES1UberShaderState
332     {
333         GLES1UniformBuffers uniformBuffers;
334         GLES1ProgramState programState;
335     };
336 
337     GLES1UberShaderState &getUberShaderState()
338     {
339         ASSERT(mUberShaderState.find(mShaderState) != mUberShaderState.end());
340         return mUberShaderState[mShaderState];
341     }
342 
343     angle::HashMap<GLES1ShaderState, GLES1UberShaderState> mUberShaderState;
344 
345     bool mDrawTextureEnabled      = false;
346     GLfloat mDrawTextureCoords[4] = {0.0f, 0.0f, 0.0f, 0.0f};
347     GLfloat mDrawTextureDims[2]   = {0.0f, 0.0f};
348 };
349 
350 }  // namespace gl
351 
352 #endif  // LIBANGLE_GLES1_RENDERER_H_
353