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 // GLES1State.h: Defines the GLES1State class holding the state of 8 // a GLES1 context. 9 10 #ifndef LIBANGLE_GLES1STATE_H_ 11 #define LIBANGLE_GLES1STATE_H_ 12 13 #include <unordered_set> 14 15 #include "common/FixedVector.h" 16 #include "common/angleutils.h" 17 #include "common/bitset_utils.h" 18 #include "common/matrix_utils.h" 19 #include "common/vector_utils.h" 20 #include "libANGLE/Caps.h" 21 #include "libANGLE/angletypes.h" 22 23 namespace gl 24 { 25 26 // State types specific to GLES1 contexts, from the OpenGL ES 1.1 spec "State Tables" section 27 struct TextureCoordF 28 { 29 TextureCoordF(); 30 TextureCoordF(float _s, float _t, float _r, float _q); 31 bool operator==(const TextureCoordF &other) const; 32 33 GLfloat s = 0.0f; 34 GLfloat t = 0.0f; 35 GLfloat r = 0.0f; 36 GLfloat q = 0.0f; 37 }; 38 39 struct MaterialParameters 40 { 41 MaterialParameters(); 42 43 ColorF ambient; 44 ColorF diffuse; 45 ColorF specular; 46 ColorF emissive; 47 GLfloat specularExponent; 48 }; 49 50 struct LightModelParameters 51 { 52 LightModelParameters(); 53 54 ColorF color; 55 bool twoSided; 56 }; 57 58 struct LightParameters 59 { 60 LightParameters(); 61 LightParameters(const LightParameters &other); 62 63 bool enabled = false; 64 ColorF ambient = {0.0f, 0.0f, 0.0f, 1.0f}; 65 ColorF diffuse = {0.0f, 0.0f, 0.0f, 1.0f}; 66 ColorF specular = {0.0f, 0.0f, 0.0f, 1.0f}; 67 angle::Vector4 position = {0.0f, 0.0f, 1.0f, 0.0f}; 68 angle::Vector3 direction = {0.0f, 0.0f, -1.0f}; 69 GLfloat spotlightExponent = 0.0f; 70 GLfloat spotlightCutoffAngle = 180.0f; 71 GLfloat attenuationConst = 1.0f; 72 GLfloat attenuationLinear = 0.0f; 73 GLfloat attenuationQuadratic = 0.0f; 74 }; 75 76 struct FogParameters 77 { 78 FogParameters(); 79 80 FogMode mode; 81 GLfloat density; 82 GLfloat start; 83 GLfloat end; 84 ColorF color; 85 }; 86 87 struct TextureEnvironmentParameters 88 { 89 TextureEnvironmentParameters(); 90 TextureEnvironmentParameters(const TextureEnvironmentParameters &other); 91 92 TextureEnvMode mode = TextureEnvMode::Modulate; 93 TextureCombine combineRgb = TextureCombine::Modulate; 94 TextureCombine combineAlpha = TextureCombine::Modulate; 95 96 TextureSrc src0Rgb = TextureSrc::Texture; 97 TextureSrc src0Alpha = TextureSrc::Texture; 98 99 TextureSrc src1Rgb = TextureSrc::Previous; 100 TextureSrc src1Alpha = TextureSrc::Previous; 101 102 TextureSrc src2Rgb = TextureSrc::Constant; 103 TextureSrc src2Alpha = TextureSrc::Constant; 104 105 TextureOp op0Rgb = TextureOp::SrcColor; 106 TextureOp op0Alpha = TextureOp::SrcAlpha; 107 108 TextureOp op1Rgb = TextureOp::SrcColor; 109 TextureOp op1Alpha = TextureOp::SrcAlpha; 110 111 TextureOp op2Rgb = TextureOp::SrcAlpha; 112 TextureOp op2Alpha = TextureOp::SrcAlpha; 113 114 ColorF color = {0.0f, 0.0f, 0.0f, 0.0f}; 115 GLfloat rgbScale = 1.0f; 116 GLfloat alphaScale = 1.0f; 117 118 bool pointSpriteCoordReplace = false; 119 }; 120 121 struct PointParameters 122 { 123 PointParameters(); 124 PointParameters(const PointParameters &other); 125 126 GLfloat pointSizeMin = 0.0f; 127 GLfloat pointSizeMax = 1.0f; 128 GLfloat pointFadeThresholdSize = 1.0f; 129 angle::Vector3 pointDistanceAttenuation = {1.0f, 0.0f, 0.0f}; 130 GLfloat pointSize = 1.0f; 131 }; 132 133 struct ClipPlaneParameters 134 { 135 ClipPlaneParameters(); 136 ClipPlaneParameters(bool enabled, const angle::Vector4 &equation); 137 ClipPlaneParameters(const ClipPlaneParameters &other); 138 ClipPlaneParameters &operator=(const ClipPlaneParameters &other); 139 140 bool enabled; 141 angle::Vector4 equation; 142 }; 143 144 class Context; 145 class GLES1Renderer; 146 class State; 147 148 class GLES1State final : angle::NonCopyable 149 { 150 public: 151 GLES1State(); 152 ~GLES1State(); 153 154 void initialize(const Context *context, const State *state); 155 156 void setAlphaFunc(AlphaTestFunc func, GLfloat ref); 157 void setClientTextureUnit(unsigned int unit); 158 unsigned int getClientTextureUnit() const; 159 160 void setCurrentColor(const ColorF &color); 161 const ColorF &getCurrentColor() const; 162 163 void setCurrentNormal(const angle::Vector3 &normal); 164 const angle::Vector3 &getCurrentNormal() const; 165 166 void setCurrentTextureCoords(unsigned int unit, const TextureCoordF &coords); 167 const TextureCoordF &getCurrentTextureCoords(unsigned int unit) const; 168 169 void setMatrixMode(MatrixType mode); 170 MatrixType getMatrixMode() const; 171 172 GLint getCurrentMatrixStackDepth(GLenum param) const; 173 174 void pushMatrix(); 175 void popMatrix(); 176 177 using MatrixStack = angle::FixedVector<angle::Mat4, Caps::GlobalMatrixStackDepth>; 178 MatrixStack ¤tMatrixStack(); 179 const MatrixStack ¤tMatrixStack() const; 180 const MatrixStack &getMatrixStack(MatrixType mode) const; 181 182 const angle::Mat4 &getModelviewMatrix() const; 183 184 void loadMatrix(const angle::Mat4 &m); 185 void multMatrix(const angle::Mat4 &m); 186 187 void setLogicOp(LogicalOperation opcodePacked); 188 189 void setClientStateEnabled(ClientVertexArrayType clientState, bool enable); 190 void setTexCoordArrayEnabled(unsigned int unit, bool enable); 191 bool isClientStateEnabled(ClientVertexArrayType clientState) const; 192 bool isTexCoordArrayEnabled(unsigned int unit) const; 193 bool isTextureTargetEnabled(unsigned int unit, const TextureType type) const; 194 195 LightModelParameters &lightModelParameters(); 196 const LightModelParameters &lightModelParameters() const; 197 198 LightParameters &lightParameters(unsigned int light); 199 const LightParameters &lightParameters(unsigned int light) const; 200 201 MaterialParameters &materialParameters(); 202 const MaterialParameters &materialParameters() const; 203 bool isColorMaterialEnabled() const; 204 205 void setShadeModel(ShadingModel model); 206 207 void setClipPlane(unsigned int plane, const GLfloat *equation); 208 void getClipPlane(unsigned int plane, GLfloat *equation) const; 209 210 FogParameters &fogParameters(); 211 const FogParameters &fogParameters() const; 212 213 TextureEnvironmentParameters &textureEnvironment(unsigned int unit); 214 const TextureEnvironmentParameters &textureEnvironment(unsigned int unit) const; 215 216 PointParameters &pointParameters(); 217 const PointParameters &pointParameters() const; 218 219 AttributesMask getVertexArraysAttributeMask() const; 220 AttributesMask getActiveAttributesMask() const; 221 222 bool shouldHandleDirtyProgram(); 223 224 void setHint(GLenum target, GLenum mode); 225 GLenum getHint(GLenum target) const; 226 227 enum DirtyGles1Type 228 { 229 DIRTY_GLES1_TEXTURE_UNIT_ENABLE = 0, 230 DIRTY_GLES1_CLIENT_STATE_ENABLE, 231 DIRTY_GLES1_FEATURE_ENABLE, 232 DIRTY_GLES1_CURRENT_VECTOR, 233 DIRTY_GLES1_CLIENT_ACTIVE_TEXTURE, 234 DIRTY_GLES1_MATRICES, 235 DIRTY_GLES1_TEXTURE_ENVIRONMENT, 236 DIRTY_GLES1_MATERIAL, 237 DIRTY_GLES1_LIGHTS, 238 DIRTY_GLES1_FOG, 239 DIRTY_GLES1_SHADE_MODEL, 240 DIRTY_GLES1_POINT_PARAMETERS, 241 DIRTY_GLES1_ALPHA_TEST, 242 DIRTY_GLES1_LOGIC_OP, 243 DIRTY_GLES1_CLIP_PLANES, 244 DIRTY_GLES1_HINT_SETTING, 245 DIRTY_GLES1_PROGRAM, 246 DIRTY_GLES1_MAX, 247 }; 248 setAllDirty()249 void setAllDirty() { mDirtyBits.set(); } 250 251 private: 252 friend class State; 253 friend class GLES1Renderer; 254 255 // Back pointer for reading from State. 256 const State *mGLState; 257 258 using DirtyBits = angle::BitSet<DIRTY_GLES1_MAX>; 259 DirtyBits mDirtyBits; 260 setDirty(DirtyGles1Type type)261 void setDirty(DirtyGles1Type type) { mDirtyBits.set(type); } clearDirty()262 void clearDirty() { mDirtyBits.reset(); } clearDirtyBits(const DirtyGles1Type & bitset)263 void clearDirtyBits(const DirtyGles1Type &bitset) { mDirtyBits &= ~bitset; } isDirty(DirtyGles1Type type)264 bool isDirty(DirtyGles1Type type) const { return mDirtyBits.test(type); } 265 266 // All initial state values come from the 267 // OpenGL ES 1.1 spec. 268 std::vector<angle::PackedEnumBitSet<TextureType>> mTexUnitEnables; 269 270 // Table 6.4, 6.5 (IsEnabled) 271 bool mVertexArrayEnabled; 272 bool mNormalArrayEnabled; 273 bool mColorArrayEnabled; 274 bool mPointSizeArrayEnabled; 275 std::vector<bool> mTexCoordArrayEnabled; 276 277 // Table 6.7-6.16 (IsEnabled) 278 bool mLineSmoothEnabled; 279 bool mPointSmoothEnabled; 280 bool mPointSpriteEnabled; 281 bool mAlphaTestEnabled; 282 bool mLogicOpEnabled; 283 bool mLightingEnabled; 284 bool mFogEnabled; 285 bool mRescaleNormalEnabled; 286 bool mNormalizeEnabled; 287 bool mColorMaterialEnabled; 288 bool mReflectionMapEnabled; 289 290 // Table 6.3 291 ColorF mCurrentColor; 292 angle::Vector3 mCurrentNormal; 293 // Invariant: mCurrentTextureCoords size is == GL_MAX_TEXTURE_UNITS. 294 std::vector<TextureCoordF> mCurrentTextureCoords; 295 296 // Table 6.4 297 unsigned int mClientActiveTexture; 298 299 // Table 6.7 300 MatrixType mMatrixMode; 301 MatrixStack mProjectionMatrices; 302 MatrixStack mModelviewMatrices; 303 std::vector<MatrixStack> mTextureMatrices; 304 305 // Table 6.15 306 using TextureEnvironments = std::vector<TextureEnvironmentParameters>; 307 TextureEnvironments mTextureEnvironments; 308 309 // Table 6.9, 2.8 310 MaterialParameters mMaterial; 311 LightModelParameters mLightModel; 312 313 // Table 6.10 314 std::vector<LightParameters> mLights; 315 316 // Table 6.8 317 FogParameters mFog; 318 ShadingModel mShadeModel; 319 320 // Table 6.11 321 PointParameters mPointParameters; 322 323 // Table 6.16 324 AlphaTestFunc mAlphaTestFunc; 325 GLfloat mAlphaTestRef; 326 LogicalOperation mLogicOp; 327 328 // Table 6.7 329 std::vector<ClipPlaneParameters> mClipPlanes; 330 331 // Table 6.19 332 HintSetting mLineSmoothHint; 333 HintSetting mPointSmoothHint; 334 HintSetting mPerspectiveCorrectionHint; 335 HintSetting mFogHint; 336 }; 337 338 } // namespace gl 339 340 #endif // LIBANGLE_GLES1STATE_H_ 341