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