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