1 /* 2 * Copyright 2015 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 GrGLUniformHandler_DEFINED 9 #define GrGLUniformHandler_DEFINED 10 11 #include "glsl/GrGLSLUniformHandler.h" 12 13 #include "gl/GrGLProgramDataManager.h" 14 15 class GrGLCaps; 16 17 class GrGLUniformHandler : public GrGLSLUniformHandler { 18 public: 19 static const int kUniformsPerBlock = 8; 20 21 const GrShaderVar& getUniformVariable(UniformHandle u) const override { 22 return fUniforms[u.toIndex()].fVariable; 23 } 24 25 const char* getUniformCStr(UniformHandle u) const override { 26 return this->getUniformVariable(u).c_str(); 27 } 28 private: 29 explicit GrGLUniformHandler(GrGLSLProgramBuilder* program) 30 : INHERITED(program) 31 , fUniforms(kUniformsPerBlock) 32 , fSamplers(kUniformsPerBlock) 33 , fTexelBuffers(kUniformsPerBlock) 34 , fImageStorages(kUniformsPerBlock) {} 35 36 UniformHandle internalAddUniformArray(uint32_t visibility, 37 GrSLType type, 38 GrSLPrecision precision, 39 const char* name, 40 bool mangleName, 41 int arrayCount, 42 const char** outName) override; 43 44 SamplerHandle addSampler(uint32_t visibility, GrSwizzle, GrSLType, GrSLPrecision, 45 const char* name) override; 46 47 const GrShaderVar& samplerVariable(SamplerHandle handle) const override { 48 return fSamplers[handle.toIndex()].fVariable; 49 } 50 51 GrSwizzle samplerSwizzle(SamplerHandle handle) const override { 52 return fSamplerSwizzles[handle.toIndex()]; 53 } 54 55 TexelBufferHandle addTexelBuffer(uint32_t visibility, GrSLPrecision, 56 const char* name) override; 57 58 const GrShaderVar& texelBufferVariable(TexelBufferHandle handle) const override { 59 return fTexelBuffers[handle.toIndex()].fVariable; 60 } 61 62 ImageStorageHandle addImageStorage(uint32_t visibility, GrSLType, GrImageStorageFormat, 63 GrSLMemoryModel, GrSLRestrict, GrIOType, 64 const char* name) override; 65 66 const GrShaderVar& imageStorageVariable(ImageStorageHandle handle) const override { 67 return fImageStorages[handle.toIndex()].fVariable; 68 } 69 70 void appendUniformDecls(GrShaderFlags visibility, SkString*) const override; 71 72 // Manually set uniform locations for all our uniforms. 73 void bindUniformLocations(GrGLuint programID, const GrGLCaps& caps); 74 75 // Updates the loction of the Uniforms if we cannot bind uniform locations manually 76 void getUniformLocations(GrGLuint programID, const GrGLCaps& caps); 77 78 const GrGLGpu* glGpu() const; 79 80 typedef GrGLProgramDataManager::UniformInfo UniformInfo; 81 typedef GrGLProgramDataManager::UniformInfoArray UniformInfoArray; 82 83 UniformInfoArray fUniforms; 84 UniformInfoArray fSamplers; 85 SkTArray<GrSwizzle> fSamplerSwizzles; 86 UniformInfoArray fTexelBuffers; 87 UniformInfoArray fImageStorages; 88 89 friend class GrGLProgramBuilder; 90 91 typedef GrGLSLUniformHandler INHERITED; 92 }; 93 94 #endif 95