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     void setImageStorages(const UniformInfoArray& images) const;
     50 
     51     /** Functions for uploading uniform values. The varities ending in v can be used to upload to an
     52     *  array of uniforms. arrayCount must be <= the array count of the uniform.
     53     */
     54     void set1i(UniformHandle, int32_t) const override;
     55     void set1iv(UniformHandle, int arrayCount, const int v[]) const override;
     56     void set1f(UniformHandle, float v0) const override;
     57     void set1fv(UniformHandle, int arrayCount, const float v[]) const override;
     58     void set2f(UniformHandle, float, float) const override;
     59     void set2fv(UniformHandle, int arrayCount, const float v[]) const override;
     60     void set3f(UniformHandle, float, float, float) const override;
     61     void set3fv(UniformHandle, int arrayCount, const float v[]) const override;
     62     void set4f(UniformHandle, float, float, float, float) const override;
     63     void set4fv(UniformHandle, int arrayCount, const float v[]) const override;
     64     // matrices are column-major, the first three upload a single matrix, the latter three upload
     65     // arrayCount matrices into a uniform array.
     66     void setMatrix2f(UniformHandle, const float matrix[]) const override;
     67     void setMatrix3f(UniformHandle, const float matrix[]) const override;
     68     void setMatrix4f(UniformHandle, const float matrix[]) const override;
     69     void setMatrix2fv(UniformHandle, int arrayCount, const float matrices[]) const override;
     70     void setMatrix3fv(UniformHandle, int arrayCount, const float matrices[]) const override;
     71     void setMatrix4fv(UniformHandle, int arrayCount, const float matrices[]) const override;
     72 
     73     // for nvpr only
     74     void setPathFragmentInputTransform(VaryingHandle u, int components,
     75                                        const SkMatrix& matrix) const override;
     76 
     77 private:
     78     enum {
     79         kUnusedUniform = -1,
     80     };
     81 
     82     struct Uniform {
     83         GrGLint     fLocation;
     84 #ifdef SK_DEBUG
     85         GrSLType    fType;
     86         int         fArrayCount;
     87 #endif
     88     };
     89 
     90     enum {
     91         kUnusedPathProcVarying = -1,
     92     };
     93     struct PathProcVarying {
     94         GrGLint     fLocation;
     95         SkDEBUGCODE(
     96             GrSLType    fType;
     97             int         fArrayCount;
     98         );
     99     };
    100 
    101     template<int N> inline void setMatrices(UniformHandle, int arrayCount,
    102                                             const float matrices[]) const;
    103 
    104     SkTArray<Uniform, true> fUniforms;
    105     SkTArray<PathProcVarying, true> fPathProcVaryings;
    106     GrGLGpu* fGpu;
    107     GrGLuint fProgramID;
    108 
    109     typedef GrGLSLProgramDataManager INHERITED;
    110 };
    111 
    112 #endif
    113