tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

GLES1State.h (10268B)


      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    auto tie() const
    121    {
    122        return std::tie(mode, combineRgb, combineAlpha, src0Rgb, src0Alpha, src1Rgb, src1Alpha,
    123                        src2Rgb, src2Alpha, op0Rgb, op0Alpha, op1Rgb, op1Alpha, op2Rgb, op2Alpha,
    124                        color, rgbScale, alphaScale, pointSpriteCoordReplace);
    125    }
    126 };
    127 
    128 bool operator==(const TextureEnvironmentParameters &a, const TextureEnvironmentParameters &b);
    129 bool operator!=(const TextureEnvironmentParameters &a, const TextureEnvironmentParameters &b);
    130 
    131 struct PointParameters
    132 {
    133    PointParameters();
    134    PointParameters(const PointParameters &other);
    135 
    136    GLfloat pointSizeMin                    = 0.0f;
    137    GLfloat pointSizeMax                    = 1.0f;
    138    GLfloat pointFadeThresholdSize          = 1.0f;
    139    angle::Vector3 pointDistanceAttenuation = {1.0f, 0.0f, 0.0f};
    140    GLfloat pointSize                       = 1.0f;
    141 };
    142 
    143 struct ClipPlaneParameters
    144 {
    145    ClipPlaneParameters();
    146    ClipPlaneParameters(bool enabled, const angle::Vector4 &equation);
    147    ClipPlaneParameters(const ClipPlaneParameters &other);
    148    ClipPlaneParameters &operator=(const ClipPlaneParameters &other);
    149 
    150    bool enabled;
    151    angle::Vector4 equation;
    152 };
    153 
    154 class Context;
    155 class GLES1Renderer;
    156 class State;
    157 
    158 class GLES1State final : angle::NonCopyable
    159 {
    160  public:
    161    GLES1State();
    162    ~GLES1State();
    163 
    164    void initialize(const Context *context, const State *state);
    165 
    166    void setAlphaFunc(AlphaTestFunc func, GLfloat ref);
    167    void setClientTextureUnit(unsigned int unit);
    168    unsigned int getClientTextureUnit() const;
    169 
    170    void setCurrentColor(const ColorF &color);
    171    const ColorF &getCurrentColor() const;
    172 
    173    void setCurrentNormal(const angle::Vector3 &normal);
    174    const angle::Vector3 &getCurrentNormal() const;
    175 
    176    void setCurrentTextureCoords(unsigned int unit, const TextureCoordF &coords);
    177    const TextureCoordF &getCurrentTextureCoords(unsigned int unit) const;
    178 
    179    void setMatrixMode(MatrixType mode);
    180    MatrixType getMatrixMode() const;
    181 
    182    GLint getCurrentMatrixStackDepth(GLenum param) const;
    183 
    184    void pushMatrix();
    185    void popMatrix();
    186 
    187    using MatrixStack = angle::FixedVector<angle::Mat4, Caps::GlobalMatrixStackDepth>;
    188    MatrixStack &currentMatrixStack();
    189    const MatrixStack &currentMatrixStack() const;
    190    const MatrixStack &getMatrixStack(MatrixType mode) const;
    191 
    192    const angle::Mat4 &getModelviewMatrix() const;
    193 
    194    void loadMatrix(const angle::Mat4 &m);
    195    void multMatrix(const angle::Mat4 &m);
    196 
    197    void setLogicOpEnabled(bool enabled);
    198    void setLogicOp(LogicalOperation opcodePacked);
    199 
    200    void setClientStateEnabled(ClientVertexArrayType clientState, bool enable);
    201    void setTexCoordArrayEnabled(unsigned int unit, bool enable);
    202    bool isClientStateEnabled(ClientVertexArrayType clientState) const;
    203    bool isTexCoordArrayEnabled(unsigned int unit) const;
    204    bool isTextureTargetEnabled(unsigned int unit, const TextureType type) const;
    205 
    206    LightModelParameters &lightModelParameters();
    207    const LightModelParameters &lightModelParameters() const;
    208 
    209    LightParameters &lightParameters(unsigned int light);
    210    const LightParameters &lightParameters(unsigned int light) const;
    211 
    212    MaterialParameters &materialParameters();
    213    const MaterialParameters &materialParameters() const;
    214    bool isColorMaterialEnabled() const;
    215 
    216    void setShadeModel(ShadingModel model);
    217 
    218    void setClipPlane(unsigned int plane, const GLfloat *equation);
    219    void getClipPlane(unsigned int plane, GLfloat *equation) const;
    220 
    221    FogParameters &fogParameters();
    222    const FogParameters &fogParameters() const;
    223 
    224    TextureEnvironmentParameters &textureEnvironment(unsigned int unit);
    225    const TextureEnvironmentParameters &textureEnvironment(unsigned int unit) const;
    226 
    227    PointParameters &pointParameters();
    228    const PointParameters &pointParameters() const;
    229 
    230    AttributesMask getVertexArraysAttributeMask() const;
    231    AttributesMask getActiveAttributesMask() const;
    232 
    233    bool shouldHandleDirtyProgram();
    234 
    235    void setHint(GLenum target, GLenum mode);
    236    GLenum getHint(GLenum target) const;
    237 
    238    enum DirtyGles1Type
    239    {
    240        DIRTY_GLES1_TEXTURE_UNIT_ENABLE = 0,
    241        DIRTY_GLES1_CLIENT_STATE_ENABLE,
    242        DIRTY_GLES1_FEATURE_ENABLE,
    243        DIRTY_GLES1_CURRENT_VECTOR,
    244        DIRTY_GLES1_CLIENT_ACTIVE_TEXTURE,
    245        DIRTY_GLES1_MATRICES,
    246        DIRTY_GLES1_TEXTURE_ENVIRONMENT,
    247        DIRTY_GLES1_MATERIAL,
    248        DIRTY_GLES1_LIGHTS,
    249        DIRTY_GLES1_FOG,
    250        DIRTY_GLES1_SHADE_MODEL,
    251        DIRTY_GLES1_POINT_PARAMETERS,
    252        DIRTY_GLES1_ALPHA_TEST,
    253        DIRTY_GLES1_LOGIC_OP,
    254        DIRTY_GLES1_CLIP_PLANES,
    255        DIRTY_GLES1_HINT_SETTING,
    256        DIRTY_GLES1_PROGRAM,
    257        DIRTY_GLES1_MAX,
    258    };
    259 
    260    void setAllDirty() { mDirtyBits.set(); }
    261 
    262  private:
    263    friend class State;
    264    friend class GLES1Renderer;
    265 
    266    // Back pointer for reading from State.
    267    const State *mGLState;
    268 
    269    using DirtyBits = angle::BitSet<DIRTY_GLES1_MAX>;
    270    DirtyBits mDirtyBits;
    271 
    272    void setDirty(DirtyGles1Type type) { mDirtyBits.set(type); }
    273    void clearDirty() { mDirtyBits.reset(); }
    274    void clearDirtyBits(const DirtyGles1Type &bitset) { mDirtyBits &= ~bitset; }
    275    bool isDirty(DirtyGles1Type type) const { return mDirtyBits.test(type); }
    276 
    277    // All initial state values come from the
    278    // OpenGL ES 1.1 spec.
    279    std::vector<angle::PackedEnumBitSet<TextureType>> mTexUnitEnables;
    280 
    281    // Table 6.4, 6.5 (IsEnabled)
    282    bool mVertexArrayEnabled;
    283    bool mNormalArrayEnabled;
    284    bool mColorArrayEnabled;
    285    bool mPointSizeArrayEnabled;
    286    std::vector<bool> mTexCoordArrayEnabled;
    287 
    288    // Table 6.7-6.16 (IsEnabled)
    289    bool mLineSmoothEnabled;
    290    bool mPointSmoothEnabled;
    291    bool mPointSpriteEnabled;
    292    bool mAlphaTestEnabled;
    293    bool mLogicOpEnabled;
    294    bool mLightingEnabled;
    295    bool mFogEnabled;
    296    bool mRescaleNormalEnabled;
    297    bool mNormalizeEnabled;
    298    bool mColorMaterialEnabled;
    299    bool mReflectionMapEnabled;
    300 
    301    // Table 6.3
    302    ColorF mCurrentColor;
    303    angle::Vector3 mCurrentNormal;
    304    // Invariant: mCurrentTextureCoords size is == GL_MAX_TEXTURE_UNITS.
    305    std::vector<TextureCoordF> mCurrentTextureCoords;
    306 
    307    // Table 6.4
    308    unsigned int mClientActiveTexture;
    309 
    310    // Table 6.7
    311    MatrixType mMatrixMode;
    312    MatrixStack mProjectionMatrices;
    313    MatrixStack mModelviewMatrices;
    314    std::vector<MatrixStack> mTextureMatrices;
    315 
    316    // Table 6.15
    317    using TextureEnvironments = std::vector<TextureEnvironmentParameters>;
    318    TextureEnvironments mTextureEnvironments;
    319 
    320    // Table 6.9, 2.8
    321    MaterialParameters mMaterial;
    322    LightModelParameters mLightModel;
    323 
    324    // Table 6.10
    325    std::vector<LightParameters> mLights;
    326 
    327    // Table 6.8
    328    FogParameters mFog;
    329    ShadingModel mShadeModel;
    330 
    331    // Table 6.11
    332    PointParameters mPointParameters;
    333 
    334    // Table 6.16
    335    AlphaTestFunc mAlphaTestFunc;
    336    GLfloat mAlphaTestRef;
    337    LogicalOperation mLogicOp;
    338 
    339    // Table 6.7
    340    std::vector<ClipPlaneParameters> mClipPlanes;
    341 
    342    // Table 6.19
    343    HintSetting mLineSmoothHint;
    344    HintSetting mPointSmoothHint;
    345    HintSetting mPerspectiveCorrectionHint;
    346    HintSetting mFogHint;
    347 };
    348 
    349 }  // namespace gl
    350 
    351 #endif  // LIBANGLE_GLES1STATE_H_