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 15class GrGLCaps; 16 17class GrGLUniformHandler : public GrGLSLUniformHandler { 18public: 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 } 28private: 29 explicit GrGLUniformHandler(GrGLSLProgramBuilder* program) 30 : INHERITED(program) 31 , fUniforms(kUniformsPerBlock) 32 , fSamplers(kUniformsPerBlock) 33 , fTexelBuffers(kUniformsPerBlock) {} 34 35 UniformHandle internalAddUniformArray(uint32_t visibility, 36 GrSLType type, 37 GrSLPrecision precision, 38 const char* name, 39 bool mangleName, 40 int arrayCount, 41 const char** outName) override; 42 43 SamplerHandle addSampler(uint32_t visibility, GrSwizzle, GrSLType, GrSLPrecision, 44 const char* name) override; 45 46 const GrShaderVar& samplerVariable(SamplerHandle handle) const override { 47 return fSamplers[handle.toIndex()].fVariable; 48 } 49 50 GrSwizzle samplerSwizzle(SamplerHandle handle) const override { 51 return fSamplerSwizzles[handle.toIndex()]; 52 } 53 54 TexelBufferHandle addTexelBuffer(uint32_t visibility, GrSLPrecision, 55 const char* name) override; 56 57 const GrShaderVar& texelBufferVariable(TexelBufferHandle handle) const override { 58 return fTexelBuffers[handle.toIndex()].fVariable; 59 } 60 61 void appendUniformDecls(GrShaderFlags visibility, SkString*) const override; 62 63 // Manually set uniform locations for all our uniforms. 64 void bindUniformLocations(GrGLuint programID, const GrGLCaps& caps); 65 66 // Updates the loction of the Uniforms if we cannot bind uniform locations manually 67 void getUniformLocations(GrGLuint programID, const GrGLCaps& caps); 68 69 const GrGLGpu* glGpu() const; 70 71 typedef GrGLProgramDataManager::UniformInfo UniformInfo; 72 typedef GrGLProgramDataManager::UniformInfoArray UniformInfoArray; 73 74 UniformInfoArray fUniforms; 75 UniformInfoArray fSamplers; 76 SkTArray<GrSwizzle> fSamplerSwizzles; 77 UniformInfoArray fTexelBuffers; 78 79 friend class GrGLProgramBuilder; 80 81 typedef GrGLSLUniformHandler INHERITED; 82}; 83 84#endif 85