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