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