Edit

kc3-lang/angle/src/libANGLE/GLES1Renderer.h

Branch :

  • Show log

    Commit

  • Author : Tim Van Patten
    Date : 2020-11-24 17:21:38
    Hash : c859c0ac
    Message : Batch replace std::unordered_map with angle::HashMap in src/ There are a few places that will remain std::unordered_map due to build or run-time errors, which will need to be evaluated more closely to determine if they should remain std::unordered_map or if there is another Abseil data structure that would be more efficient while still working correctly. Bug: angleproject:4873 Change-Id: Ib04253e3ad6398e63f4cc2bfe12c0f9e57cb112b Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2558873 Commit-Queue: Tim Van Patten <timvp@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Charlie Lao <cclao@google.com>

  • src/libANGLE/GLES1Renderer.h
  • //
    // Copyright 2018 The ANGLE Project Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    //
    
    // GLES1Renderer.h: Defines GLES1 emulation rendering operations on top of a GLES3
    // context. Used by Context.h.
    
    #ifndef LIBANGLE_GLES1_RENDERER_H_
    #define LIBANGLE_GLES1_RENDERER_H_
    
    #include "angle_gl.h"
    #include "common/angleutils.h"
    #include "libANGLE/angletypes.h"
    
    #include <memory>
    #include <string>
    #include <unordered_map>
    
    namespace gl
    {
    class Context;
    class GLES1State;
    class Program;
    class State;
    class Shader;
    class ShaderProgramManager;
    
    class GLES1Renderer final : angle::NonCopyable
    {
      public:
        GLES1Renderer();
        ~GLES1Renderer();
    
        void onDestroy(Context *context, State *state);
    
        angle::Result prepareForDraw(PrimitiveMode mode, Context *context, State *glState);
    
        static int VertexArrayIndex(ClientVertexArrayType type, const GLES1State &gles1);
        static int TexCoordArrayIndex(unsigned int unit);
    
        void drawTexture(Context *context,
                         State *glState,
                         float x,
                         float y,
                         float z,
                         float width,
                         float height);
    
        static constexpr int kTexUnitCount = 4;
    
      private:
        using Mat4Uniform = float[16];
        using Vec4Uniform = float[4];
        using Vec3Uniform = float[3];
    
        Shader *getShader(ShaderProgramID handle) const;
        Program *getProgram(ShaderProgramID handle) const;
    
        angle::Result compileShader(Context *context,
                                    ShaderType shaderType,
                                    const char *src,
                                    ShaderProgramID *shaderOut);
        angle::Result linkProgram(Context *context,
                                  State *glState,
                                  ShaderProgramID vshader,
                                  ShaderProgramID fshader,
                                  const angle::HashMap<GLint, std::string> &attribLocs,
                                  ShaderProgramID *programOut);
        angle::Result initializeRendererProgram(Context *context, State *glState);
    
        void setUniform1i(Context *context,
                          Program *programObject,
                          UniformLocation location,
                          GLint value);
        void setUniform1iv(Context *context,
                           Program *programObject,
                           UniformLocation location,
                           GLint count,
                           const GLint *value);
        void setUniformMatrix4fv(Program *programObject,
                                 UniformLocation location,
                                 GLint count,
                                 GLboolean transpose,
                                 const GLfloat *value);
        void setUniform4fv(Program *programObject,
                           UniformLocation location,
                           GLint count,
                           const GLfloat *value);
        void setUniform3fv(Program *programObject,
                           UniformLocation location,
                           GLint count,
                           const GLfloat *value);
        void setUniform2fv(Program *programObject,
                           UniformLocation location,
                           GLint count,
                           const GLfloat *value);
        void setUniform1f(Program *programObject, UniformLocation location, GLfloat value);
        void setUniform1fv(Program *programObject,
                           UniformLocation location,
                           GLint count,
                           const GLfloat *value);
    
        void setAttributesEnabled(Context *context, State *glState, AttributesMask mask);
    
        static constexpr int kLightCount     = 8;
        static constexpr int kClipPlaneCount = 6;
    
        static constexpr int kVertexAttribIndex           = 0;
        static constexpr int kNormalAttribIndex           = 1;
        static constexpr int kColorAttribIndex            = 2;
        static constexpr int kPointSizeAttribIndex        = 3;
        static constexpr int kTextureCoordAttribIndexBase = 4;
    
        bool mRendererProgramInitialized;
        ShaderProgramManager *mShaderPrograms;
    
        struct GLES1ProgramState
        {
            ShaderProgramID program;
    
            UniformLocation projMatrixLoc;
            UniformLocation modelviewMatrixLoc;
            UniformLocation textureMatrixLoc;
            UniformLocation modelviewInvTrLoc;
    
            // Texturing
            UniformLocation enableTexture2DLoc;
            UniformLocation enableTextureCubeMapLoc;
            std::array<UniformLocation, kTexUnitCount> tex2DSamplerLocs;
            std::array<UniformLocation, kTexUnitCount> texCubeSamplerLocs;
    
            UniformLocation textureFormatLoc;
    
            UniformLocation textureEnvModeLoc;
            UniformLocation combineRgbLoc;
            UniformLocation combineAlphaLoc;
            UniformLocation src0rgbLoc;
            UniformLocation src0alphaLoc;
            UniformLocation src1rgbLoc;
            UniformLocation src1alphaLoc;
            UniformLocation src2rgbLoc;
            UniformLocation src2alphaLoc;
            UniformLocation op0rgbLoc;
            UniformLocation op0alphaLoc;
            UniformLocation op1rgbLoc;
            UniformLocation op1alphaLoc;
            UniformLocation op2rgbLoc;
            UniformLocation op2alphaLoc;
            UniformLocation textureEnvColorLoc;
            UniformLocation rgbScaleLoc;
            UniformLocation alphaScaleLoc;
            UniformLocation pointSpriteCoordReplaceLoc;
    
            // Alpha test
            UniformLocation enableAlphaTestLoc;
            UniformLocation alphaFuncLoc;
            UniformLocation alphaTestRefLoc;
    
            // Shading, materials, and lighting
            UniformLocation shadeModelFlatLoc;
            UniformLocation enableLightingLoc;
            UniformLocation enableRescaleNormalLoc;
            UniformLocation enableNormalizeLoc;
            UniformLocation enableColorMaterialLoc;
    
            UniformLocation materialAmbientLoc;
            UniformLocation materialDiffuseLoc;
            UniformLocation materialSpecularLoc;
            UniformLocation materialEmissiveLoc;
            UniformLocation materialSpecularExponentLoc;
    
            UniformLocation lightModelSceneAmbientLoc;
            UniformLocation lightModelTwoSidedLoc;
    
            UniformLocation lightEnablesLoc;
            UniformLocation lightAmbientsLoc;
            UniformLocation lightDiffusesLoc;
            UniformLocation lightSpecularsLoc;
            UniformLocation lightPositionsLoc;
            UniformLocation lightDirectionsLoc;
            UniformLocation lightSpotlightExponentsLoc;
            UniformLocation lightSpotlightCutoffAnglesLoc;
            UniformLocation lightAttenuationConstsLoc;
            UniformLocation lightAttenuationLinearsLoc;
            UniformLocation lightAttenuationQuadraticsLoc;
    
            // Fog
            UniformLocation fogEnableLoc;
            UniformLocation fogModeLoc;
            UniformLocation fogDensityLoc;
            UniformLocation fogStartLoc;
            UniformLocation fogEndLoc;
            UniformLocation fogColorLoc;
    
            // Clip planes
            UniformLocation enableClipPlanesLoc;
            UniformLocation clipPlaneEnablesLoc;
            UniformLocation clipPlanesLoc;
    
            // Point rasterization
            UniformLocation pointRasterizationLoc;
            UniformLocation pointSizeMinLoc;
            UniformLocation pointSizeMaxLoc;
            UniformLocation pointDistanceAttenuationLoc;
            UniformLocation pointSpriteEnabledLoc;
    
            // Draw texture
            UniformLocation enableDrawTextureLoc;
            UniformLocation drawTextureCoordsLoc;
            UniformLocation drawTextureDimsLoc;
            UniformLocation drawTextureNormalizedCropRectLoc;
        };
    
        struct GLES1UniformBuffers
        {
            std::array<Mat4Uniform, kTexUnitCount> textureMatrices;
            std::array<GLint, kTexUnitCount> tex2DEnables;
            std::array<GLint, kTexUnitCount> texCubeEnables;
    
            std::array<GLint, kTexUnitCount> texEnvModes;
            std::array<GLint, kTexUnitCount> texCombineRgbs;
            std::array<GLint, kTexUnitCount> texCombineAlphas;
    
            std::array<GLint, kTexUnitCount> texCombineSrc0Rgbs;
            std::array<GLint, kTexUnitCount> texCombineSrc0Alphas;
            std::array<GLint, kTexUnitCount> texCombineSrc1Rgbs;
            std::array<GLint, kTexUnitCount> texCombineSrc1Alphas;
            std::array<GLint, kTexUnitCount> texCombineSrc2Rgbs;
            std::array<GLint, kTexUnitCount> texCombineSrc2Alphas;
            std::array<GLint, kTexUnitCount> texCombineOp0Rgbs;
            std::array<GLint, kTexUnitCount> texCombineOp0Alphas;
            std::array<GLint, kTexUnitCount> texCombineOp1Rgbs;
            std::array<GLint, kTexUnitCount> texCombineOp1Alphas;
            std::array<GLint, kTexUnitCount> texCombineOp2Rgbs;
            std::array<GLint, kTexUnitCount> texCombineOp2Alphas;
            std::array<Vec4Uniform, kTexUnitCount> texEnvColors;
            std::array<GLfloat, kTexUnitCount> texEnvRgbScales;
            std::array<GLfloat, kTexUnitCount> texEnvAlphaScales;
            std::array<GLint, kTexUnitCount> pointSpriteCoordReplaces;
    
            // Lighting
            std::array<GLint, kLightCount> lightEnables;
            std::array<Vec4Uniform, kLightCount> lightAmbients;
            std::array<Vec4Uniform, kLightCount> lightDiffuses;
            std::array<Vec4Uniform, kLightCount> lightSpeculars;
            std::array<Vec4Uniform, kLightCount> lightPositions;
            std::array<Vec3Uniform, kLightCount> lightDirections;
            std::array<GLfloat, kLightCount> spotlightExponents;
            std::array<GLfloat, kLightCount> spotlightCutoffAngles;
            std::array<GLfloat, kLightCount> attenuationConsts;
            std::array<GLfloat, kLightCount> attenuationLinears;
            std::array<GLfloat, kLightCount> attenuationQuadratics;
    
            // Clip planes
            std::array<GLint, kClipPlaneCount> clipPlaneEnables;
            std::array<Vec4Uniform, kClipPlaneCount> clipPlanes;
    
            // Texture crop rectangles
            std::array<Vec4Uniform, kTexUnitCount> texCropRects;
        };
    
        GLES1UniformBuffers mUniformBuffers;
        GLES1ProgramState mProgramState;
    
        bool mDrawTextureEnabled      = false;
        GLfloat mDrawTextureCoords[4] = {0.0f, 0.0f, 0.0f, 0.0f};
        GLfloat mDrawTextureDims[2]   = {0.0f, 0.0f};
    };
    
    }  // namespace gl
    
    #endif  // LIBANGLE_GLES1_RENDERER_H_