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