Edit

kc3-lang/angle/src/libGLESv2/Program.h

Branch :

  • Show log

    Commit

  • Author : jbauman@chromium.org
    Date : 2011-10-18 23:01:46
    Hash : b6e7222c
    Message : Avoid iterating over unused samplers. Keep track of the maximum used sampler to avoid expensive iterations in applyTextures and validateSamplers. BUG= TEST=webgl conformance tests Review URL: http://codereview.appspot.com/5246061 git-svn-id: https://angleproject.googlecode.com/svn/trunk@795 736b8ea6-26fd-11df-bfd4-992fa37f6226

  • src/libGLESv2/Program.h
  • //
    // Copyright (c) 2002-2011 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.
    //
    
    // Program.h: Defines the gl::Program class. Implements GL program objects
    // and related functionality. [OpenGL ES 2.0.24] section 2.10.3 page 28.
    
    #ifndef LIBGLESV2_PROGRAM_H_
    #define LIBGLESV2_PROGRAM_H_
    
    #include <d3dx9.h>
    #include <d3dcompiler.h>
    #include <string>
    #include <vector>
    #include <set>
    
    #include "libGLESv2/Shader.h"
    #include "libGLESv2/Context.h"
    
    namespace gl
    {
    class ResourceManager;
    class FragmentShader;
    class VertexShader;
    
    // Helper struct representing a single shader uniform
    struct Uniform
    {
        Uniform(GLenum type, const std::string &_name, unsigned int arraySize);
    
        ~Uniform();
    
        bool isArray();
    
        const GLenum type;
        const std::string _name;   // Decorated name
        const std::string name;    // Undecorated name
        const unsigned int arraySize;
    
        unsigned char *data;
        bool dirty;
    
        D3DXHANDLE vsHandle;
        D3DXHANDLE psHandle;
        bool handlesSet;
    };
    
    // Struct used for correlating uniforms/elements of uniform arrays to handles
    struct UniformLocation
    {
        UniformLocation(const std::string &_name, unsigned int element, unsigned int index);
    
        std::string name;
        unsigned int element;
        unsigned int index;
    };
    
    class Program
    {
      public:
        Program(ResourceManager *manager, GLuint handle);
    
        ~Program();
    
        bool attachShader(Shader *shader);
        bool detachShader(Shader *shader);
        int getAttachedShadersCount() const;
    
        IDirect3DPixelShader9 *getPixelShader();
        IDirect3DVertexShader9 *getVertexShader();
    
        void bindAttributeLocation(GLuint index, const char *name);
        GLuint getAttributeLocation(const char *name);
        int getSemanticIndex(int attributeIndex);
    
        GLint getSamplerMapping(SamplerType type, unsigned int samplerIndex);
        TextureType getSamplerTextureType(SamplerType type, unsigned int samplerIndex);
        GLint getUsedSamplerRange(SamplerType type);
    
        GLint getUniformLocation(std::string name);
        bool setUniform1fv(GLint location, GLsizei count, const GLfloat *v);
        bool setUniform2fv(GLint location, GLsizei count, const GLfloat *v);
        bool setUniform3fv(GLint location, GLsizei count, const GLfloat *v);
        bool setUniform4fv(GLint location, GLsizei count, const GLfloat *v);
        bool setUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value);
        bool setUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value);
        bool setUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value);
        bool setUniform1iv(GLint location, GLsizei count, const GLint *v);
        bool setUniform2iv(GLint location, GLsizei count, const GLint *v);
        bool setUniform3iv(GLint location, GLsizei count, const GLint *v);
        bool setUniform4iv(GLint location, GLsizei count, const GLint *v);
    
        bool getUniformfv(GLint location, GLfloat *params);
        bool getUniformiv(GLint location, GLint *params);
    
        GLint getDxDepthRangeLocation() const;
        GLint getDxDepthLocation() const;
        GLint getDxViewportLocation() const;
        GLint getDxHalfPixelSizeLocation() const;
        GLint getDxFrontCCWLocation() const;
        GLint getDxPointsOrLinesLocation() const;
    
        void dirtyAllUniforms();
        void applyUniforms();
    
        void link();
        bool isLinked();
        int getInfoLogLength() const;
        void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog);
        void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders);
    
        void getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
        GLint getActiveAttributeCount();
        GLint getActiveAttributeMaxLength();
    
        void getActiveUniform(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
        GLint getActiveUniformCount();
        GLint getActiveUniformMaxLength();
    
        void addRef();
        void release();
        unsigned int getRefCount() const;
        void flagForDeletion();
        bool isFlaggedForDeletion() const;
    
        void validate();
        bool validateSamplers(bool logErrors);
        bool isValidated() const;
    
        unsigned int getSerial() const;
    
        static std::string decorateAttribute(const std::string &name);    // Prepend an underscore
        static std::string undecorateUniform(const std::string &_name);   // Remove leading underscore
    
      private:
        DISALLOW_COPY_AND_ASSIGN(Program);
    
        ID3D10Blob *compileToBinary(const char *hlsl, const char *profile, ID3DXConstantTable **constantTable);
        void unlink(bool destroy = false);
    
        int packVaryings(const Varying *packing[][4]);
        bool linkVaryings();
    
        bool linkAttributes();
        int getAttributeBinding(const std::string &name);
    
        bool linkUniforms(ID3DXConstantTable *constantTable);
        bool defineUniform(const D3DXHANDLE &constantHandle, const D3DXCONSTANT_DESC &constantDescription, std::string name = "");
        bool defineUniform(const D3DXCONSTANT_DESC &constantDescription, std::string &name);
        Uniform *createUniform(const D3DXCONSTANT_DESC &constantDescription, std::string &name);
        bool applyUniform1bv(Uniform *targetUniform, GLsizei count, const GLboolean *v);
        bool applyUniform2bv(Uniform *targetUniform, GLsizei count, const GLboolean *v);
        bool applyUniform3bv(Uniform *targetUniform, GLsizei count, const GLboolean *v);
        bool applyUniform4bv(Uniform *targetUniform, GLsizei count, const GLboolean *v);
        bool applyUniform1fv(Uniform *targetUniform, GLsizei count, const GLfloat *v);
        bool applyUniform2fv(Uniform *targetUniform, GLsizei count, const GLfloat *v);
        bool applyUniform3fv(Uniform *targetUniform, GLsizei count, const GLfloat *v);
        bool applyUniform4fv(Uniform *targetUniform, GLsizei count, const GLfloat *v);
        bool applyUniformMatrix2fv(Uniform *targetUniform, GLsizei count, const GLfloat *value);
        bool applyUniformMatrix3fv(Uniform *targetUniform, GLsizei count, const GLfloat *value);
        bool applyUniformMatrix4fv(Uniform *targetUniform, GLsizei count, const GLfloat *value);
        bool applyUniform1iv(Uniform *targetUniform, GLsizei count, const GLint *v);
        bool applyUniform2iv(Uniform *targetUniform, GLsizei count, const GLint *v);
        bool applyUniform3iv(Uniform *targetUniform, GLsizei count, const GLint *v);
        bool applyUniform4iv(Uniform *targetUniform, GLsizei count, const GLint *v);
    
        void getConstantHandles(Uniform *targetUniform, D3DXHANDLE *constantPS, D3DXHANDLE *constantVS);
    
        void appendToInfoLogSanitized(const char *message);
        void appendToInfoLog(const char *info, ...);
        void resetInfoLog();
    
        static unsigned int issueSerial();
    
        FragmentShader *mFragmentShader;
        VertexShader *mVertexShader;
    
        std::string mPixelHLSL;
        std::string mVertexHLSL;
    
        IDirect3DPixelShader9 *mPixelExecutable;
        IDirect3DVertexShader9 *mVertexExecutable;
        ID3DXConstantTable *mConstantTablePS;
        ID3DXConstantTable *mConstantTableVS;
    
        std::set<std::string> mAttributeBinding[MAX_VERTEX_ATTRIBS];
        Attribute mLinkedAttribute[MAX_VERTEX_ATTRIBS];
        int mSemanticIndex[MAX_VERTEX_ATTRIBS];
    
        struct Sampler
        {
            bool active;
            GLint logicalTextureUnit;
            TextureType textureType;
        };
    
        Sampler mSamplersPS[MAX_TEXTURE_IMAGE_UNITS];
        Sampler mSamplersVS[MAX_VERTEX_TEXTURE_IMAGE_UNITS_VTF];
        GLuint mUsedVertexSamplerRange;
        GLuint mUsedPixelSamplerRange;
    
        typedef std::vector<Uniform*> UniformArray;
        UniformArray mUniforms;
        typedef std::vector<UniformLocation> UniformIndex;
        UniformIndex mUniformIndex;
    
        GLint mDxDepthRangeLocation;
        GLint mDxDepthLocation;
        GLint mDxViewportLocation;
        GLint mDxHalfPixelSizeLocation;
        GLint mDxFrontCCWLocation;
        GLint mDxPointsOrLinesLocation;
    
        bool mLinked;
        bool mDeleteStatus;   // Flag to indicate that the program can be deleted when no longer in use
        char *mInfoLog;
        bool mValidated;
    
        unsigned int mRefCount;
    
        const unsigned int mSerial;
    
        static unsigned int mCurrentSerial;
    
        ResourceManager *mResourceManager;
        const GLuint mHandle;
    };
    }
    
    #endif   // LIBGLESV2_PROGRAM_H_