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