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 18class GrGLGpu; 19class SkMatrix; 20class 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 */ 26class GrGLProgramDataManager : public GrGLSLProgramDataManager { 27public: 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 76private: 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