Home | History | Annotate | Download | only in gl
      1 /*
      2  * Copyright 2012 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #ifndef GrGLProgramDataManager_DEFINED
      9 #define GrGLProgramDataManager_DEFINED
     10 
     11 #include "GrAllocator.h"
     12 #include "GrShaderVar.h"
     13 #include "gl/GrGLTypes.h"
     14 #include "glsl/GrGLSLProgramDataManager.h"
     15 
     16 #include "SkTArray.h"
     17 
     18 class GrGLGpu;
     19 class SkMatrix;
     20 class GrGLProgram;
     21 
     22 /** Manages the resources used by a shader program.
     23  * The resources are objects the program uses to communicate with the
     24  * application code.
     25  */
     26 class GrGLProgramDataManager : public GrGLSLProgramDataManager {
     27 public:
     28     struct UniformInfo {
     29         GrShaderVar fVariable;
     30         uint32_t        fVisibility;
     31         GrGLint         fLocation;
     32     };
     33 
     34     struct VaryingInfo {
     35         GrShaderVar fVariable;
     36         GrGLint         fLocation;
     37     };
     38 
     39     // This uses an allocator rather than array so that the GrShaderVars don't move in memory
     40     // after they are inserted. Users of GrGLShaderBuilder get refs to the vars and ptrs to their
     41     // name strings. Otherwise, we'd have to hand out copies.
     42     typedef GrTAllocator<UniformInfo> UniformInfoArray;
     43     typedef GrTAllocator<VaryingInfo> VaryingInfoArray;
     44 
     45     GrGLProgramDataManager(GrGLGpu*, GrGLuint programID, const UniformInfoArray&,
     46                            const VaryingInfoArray&);
     47 
     48     void setSamplerUniforms(const UniformInfoArray& samplers, int startUnit) const;
     49 
     50     /** Functions for uploading uniform values. The varities ending in v can be used to upload to an
     51     *  array of uniforms. arrayCount must be <= the array count of the uniform.
     52     */
     53     void set1i(UniformHandle, int32_t) const override;
     54     void set1iv(UniformHandle, int arrayCount, const int v[]) const override;
     55     void set1f(UniformHandle, float v0) const override;
     56     void set1fv(UniformHandle, int arrayCount, const float v[]) const override;
     57     void set2f(UniformHandle, float, float) const override;
     58     void set2fv(UniformHandle, int arrayCount, const float v[]) const override;
     59     void set3f(UniformHandle, float, float, float) const override;
     60     void set3fv(UniformHandle, int arrayCount, const float v[]) const override;
     61     void set4f(UniformHandle, float, float, float, float) const override;
     62     void set4fv(UniformHandle, int arrayCount, const float v[]) const override;
     63     // matrices are column-major, the first three upload a single matrix, the latter three upload
     64     // arrayCount matrices into a uniform array.
     65     void setMatrix2f(UniformHandle, const float matrix[]) const override;
     66     void setMatrix3f(UniformHandle, const float matrix[]) const override;
     67     void setMatrix4f(UniformHandle, const float matrix[]) const override;
     68     void setMatrix2fv(UniformHandle, int arrayCount, const float matrices[]) const override;
     69     void setMatrix3fv(UniformHandle, int arrayCount, const float matrices[]) const override;
     70     void setMatrix4fv(UniformHandle, int arrayCount, const float matrices[]) const override;
     71 
     72     // for nvpr only
     73     void setPathFragmentInputTransform(VaryingHandle u, int components,
     74                                        const SkMatrix& matrix) const override;
     75 
     76 private:
     77     enum {
     78         kUnusedUniform = -1,
     79     };
     80 
     81     struct Uniform {
     82         GrGLint     fLocation;
     83 #ifdef SK_DEBUG
     84         GrSLType    fType;
     85         int         fArrayCount;
     86 #endif
     87     };
     88 
     89     enum {
     90         kUnusedPathProcVarying = -1,
     91     };
     92     struct PathProcVarying {
     93         GrGLint     fLocation;
     94         SkDEBUGCODE(
     95             GrSLType    fType;
     96             int         fArrayCount;
     97         );
     98     };
     99 
    100     template<int N> inline void setMatrices(UniformHandle, int arrayCount,
    101                                             const float matrices[]) const;
    102 
    103     SkTArray<Uniform, true> fUniforms;
    104     SkTArray<PathProcVarying, true> fPathProcVaryings;
    105     GrGLGpu* fGpu;
    106     GrGLuint fProgramID;
    107 
    108     typedef GrGLSLProgramDataManager INHERITED;
    109 };
    110 
    111 #endif
    112