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