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