• 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 "angle_gl.h"
14 #include "common/angleutils.h"
15 #include "libANGLE/angletypes.h"
16 
17 #include <memory>
18 #include <string>
19 #include <unordered_map>
20 
21 namespace gl
22 {
23 class Context;
24 class GLES1State;
25 class Program;
26 class State;
27 class Shader;
28 class ShaderProgramManager;
29 
30 class GLES1Renderer final : angle::NonCopyable
31 {
32   public:
33     GLES1Renderer();
34     ~GLES1Renderer();
35 
36     void onDestroy(Context *context, State *state);
37 
38     angle::Result prepareForDraw(PrimitiveMode mode, Context *context, State *glState);
39 
40     static int VertexArrayIndex(ClientVertexArrayType type, const GLES1State &gles1);
41     static int TexCoordArrayIndex(unsigned int unit);
42 
43     void drawTexture(Context *context,
44                      State *glState,
45                      float x,
46                      float y,
47                      float z,
48                      float width,
49                      float height);
50 
51     static constexpr int kTexUnitCount = 4;
52 
53   private:
54     using Mat4Uniform = float[16];
55     using Vec4Uniform = float[4];
56     using Vec3Uniform = float[3];
57 
58     Shader *getShader(GLuint handle) const;
59     Program *getProgram(GLuint handle) const;
60 
61     angle::Result compileShader(Context *context,
62                                 ShaderType shaderType,
63                                 const char *src,
64                                 GLuint *shaderOut);
65     angle::Result linkProgram(Context *context,
66                               State *glState,
67                               GLuint vshader,
68                               GLuint fshader,
69                               const std::unordered_map<GLint, std::string> &attribLocs,
70                               GLuint *programOut);
71     angle::Result initializeRendererProgram(Context *context, State *glState);
72 
73     void setUniform1i(Context *context, Program *programObject, GLint loc, GLint value);
74     void setUniform1iv(Context *context,
75                        Program *programObject,
76                        GLint loc,
77                        GLint count,
78                        const GLint *value);
79     void setUniformMatrix4fv(Program *programObject,
80                              GLint loc,
81                              GLint count,
82                              GLboolean transpose,
83                              const GLfloat *value);
84     void setUniform4fv(Program *programObject, GLint loc, GLint count, const GLfloat *value);
85     void setUniform3fv(Program *programObject, GLint loc, GLint count, const GLfloat *value);
86     void setUniform2fv(Program *programObject, GLint loc, GLint count, const GLfloat *value);
87     void setUniform1f(Program *programObject, GLint loc, GLfloat value);
88     void setUniform1fv(Program *programObject, GLint loc, GLint count, const GLfloat *value);
89 
90     void setAttributesEnabled(Context *context, State *glState, AttributesMask mask);
91 
92     static constexpr int kLightCount     = 8;
93     static constexpr int kClipPlaneCount = 6;
94 
95     static constexpr int kVertexAttribIndex           = 0;
96     static constexpr int kNormalAttribIndex           = 1;
97     static constexpr int kColorAttribIndex            = 2;
98     static constexpr int kPointSizeAttribIndex        = 3;
99     static constexpr int kTextureCoordAttribIndexBase = 4;
100 
101     bool mRendererProgramInitialized;
102     ShaderProgramManager *mShaderPrograms;
103 
104     struct GLES1ProgramState
105     {
106         GLuint program;
107 
108         GLint projMatrixLoc;
109         GLint modelviewMatrixLoc;
110         GLint textureMatrixLoc;
111         GLint modelviewInvTrLoc;
112 
113         // Texturing
114         GLint enableTexture2DLoc;
115         GLint enableTextureCubeMapLoc;
116         std::array<GLint, kTexUnitCount> tex2DSamplerLocs;
117         std::array<GLint, kTexUnitCount> texCubeSamplerLocs;
118 
119         GLint textureFormatLoc;
120 
121         GLint textureEnvModeLoc;
122         GLint combineRgbLoc;
123         GLint combineAlphaLoc;
124         GLint src0rgbLoc;
125         GLint src0alphaLoc;
126         GLint src1rgbLoc;
127         GLint src1alphaLoc;
128         GLint src2rgbLoc;
129         GLint src2alphaLoc;
130         GLint op0rgbLoc;
131         GLint op0alphaLoc;
132         GLint op1rgbLoc;
133         GLint op1alphaLoc;
134         GLint op2rgbLoc;
135         GLint op2alphaLoc;
136         GLint textureEnvColorLoc;
137         GLint rgbScaleLoc;
138         GLint alphaScaleLoc;
139         GLint pointSpriteCoordReplaceLoc;
140 
141         // Alpha test
142         GLint enableAlphaTestLoc;
143         GLint alphaFuncLoc;
144         GLint alphaTestRefLoc;
145 
146         // Shading, materials, and lighting
147         GLint shadeModelFlatLoc;
148         GLint enableLightingLoc;
149         GLint enableRescaleNormalLoc;
150         GLint enableNormalizeLoc;
151         GLint enableColorMaterialLoc;
152 
153         GLint materialAmbientLoc;
154         GLint materialDiffuseLoc;
155         GLint materialSpecularLoc;
156         GLint materialEmissiveLoc;
157         GLint materialSpecularExponentLoc;
158 
159         GLint lightModelSceneAmbientLoc;
160         GLint lightModelTwoSidedLoc;
161 
162         GLint lightEnablesLoc;
163         GLint lightAmbientsLoc;
164         GLint lightDiffusesLoc;
165         GLint lightSpecularsLoc;
166         GLint lightPositionsLoc;
167         GLint lightDirectionsLoc;
168         GLint lightSpotlightExponentsLoc;
169         GLint lightSpotlightCutoffAnglesLoc;
170         GLint lightAttenuationConstsLoc;
171         GLint lightAttenuationLinearsLoc;
172         GLint lightAttenuationQuadraticsLoc;
173 
174         // Fog
175         GLint fogEnableLoc;
176         GLint fogModeLoc;
177         GLint fogDensityLoc;
178         GLint fogStartLoc;
179         GLint fogEndLoc;
180         GLint fogColorLoc;
181 
182         // Clip planes
183         GLint enableClipPlanesLoc;
184         GLint clipPlaneEnablesLoc;
185         GLint clipPlanesLoc;
186 
187         // Point rasterization
188         GLint pointRasterizationLoc;
189         GLint pointSizeMinLoc;
190         GLint pointSizeMaxLoc;
191         GLint pointDistanceAttenuationLoc;
192         GLint pointSpriteEnabledLoc;
193 
194         // Draw texture
195         GLint enableDrawTextureLoc;
196         GLint drawTextureCoordsLoc;
197         GLint drawTextureDimsLoc;
198         GLint drawTextureNormalizedCropRectLoc;
199     };
200 
201     struct GLES1UniformBuffers
202     {
203         std::array<Mat4Uniform, kTexUnitCount> textureMatrices;
204         std::array<GLint, kTexUnitCount> tex2DEnables;
205         std::array<GLint, kTexUnitCount> texCubeEnables;
206 
207         std::array<GLint, kTexUnitCount> texEnvModes;
208         std::array<GLint, kTexUnitCount> texCombineRgbs;
209         std::array<GLint, kTexUnitCount> texCombineAlphas;
210 
211         std::array<GLint, kTexUnitCount> texCombineSrc0Rgbs;
212         std::array<GLint, kTexUnitCount> texCombineSrc0Alphas;
213         std::array<GLint, kTexUnitCount> texCombineSrc1Rgbs;
214         std::array<GLint, kTexUnitCount> texCombineSrc1Alphas;
215         std::array<GLint, kTexUnitCount> texCombineSrc2Rgbs;
216         std::array<GLint, kTexUnitCount> texCombineSrc2Alphas;
217         std::array<GLint, kTexUnitCount> texCombineOp0Rgbs;
218         std::array<GLint, kTexUnitCount> texCombineOp0Alphas;
219         std::array<GLint, kTexUnitCount> texCombineOp1Rgbs;
220         std::array<GLint, kTexUnitCount> texCombineOp1Alphas;
221         std::array<GLint, kTexUnitCount> texCombineOp2Rgbs;
222         std::array<GLint, kTexUnitCount> texCombineOp2Alphas;
223         std::array<Vec4Uniform, kTexUnitCount> texEnvColors;
224         std::array<GLfloat, kTexUnitCount> texEnvRgbScales;
225         std::array<GLfloat, kTexUnitCount> texEnvAlphaScales;
226         std::array<GLint, kTexUnitCount> pointSpriteCoordReplaces;
227 
228         // Lighting
229         std::array<GLint, kLightCount> lightEnables;
230         std::array<Vec4Uniform, kLightCount> lightAmbients;
231         std::array<Vec4Uniform, kLightCount> lightDiffuses;
232         std::array<Vec4Uniform, kLightCount> lightSpeculars;
233         std::array<Vec4Uniform, kLightCount> lightPositions;
234         std::array<Vec3Uniform, kLightCount> lightDirections;
235         std::array<GLfloat, kLightCount> spotlightExponents;
236         std::array<GLfloat, kLightCount> spotlightCutoffAngles;
237         std::array<GLfloat, kLightCount> attenuationConsts;
238         std::array<GLfloat, kLightCount> attenuationLinears;
239         std::array<GLfloat, kLightCount> attenuationQuadratics;
240 
241         // Clip planes
242         std::array<GLint, kClipPlaneCount> clipPlaneEnables;
243         std::array<Vec4Uniform, kClipPlaneCount> clipPlanes;
244 
245         // Texture crop rectangles
246         std::array<Vec4Uniform, kTexUnitCount> texCropRects;
247     };
248 
249     GLES1UniformBuffers mUniformBuffers;
250     GLES1ProgramState mProgramState;
251 
252     bool mDrawTextureEnabled      = false;
253     GLfloat mDrawTextureCoords[4] = {0.0f, 0.0f, 0.0f, 0.0f};
254     GLfloat mDrawTextureDims[2]   = {0.0f, 0.0f};
255 };
256 
257 }  // namespace gl
258 
259 #endif  // LIBANGLE_GLES1_RENDERER_H_
260