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