1 /* 2 * Copyright 2016 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 GrVkUniformHandler_DEFINED 9 #define GrVkUniformHandler_DEFINED 10 11 #include "glsl/GrGLSLUniformHandler.h" 12 13 #include "GrAllocator.h" 14 #include "glsl/GrGLSLShaderVar.h" 15 16 static const int kUniformsPerBlock = 8; 17 18 class GrVkUniformHandler : public GrGLSLUniformHandler { 19 public: 20 enum { 21 kSamplerDescSet = 0, 22 kUniformBufferDescSet = 1, 23 }; 24 enum { 25 kVertexBinding = 0, 26 kFragBinding = 1, 27 }; 28 29 // fUBOffset is only valid if the GrSLType of the fVariable is not a sampler 30 struct UniformInfo { 31 GrGLSLShaderVar fVariable; 32 uint32_t fVisibility; 33 uint32_t fSetNumber; 34 uint32_t fBinding; 35 uint32_t fUBOffset; 36 }; 37 typedef GrTAllocator<UniformInfo> UniformInfoArray; 38 getUniformVariable(UniformHandle u)39 const GrGLSLShaderVar& getUniformVariable(UniformHandle u) const override { 40 return fUniforms[u.toIndex()].fVariable; 41 } 42 getUniformCStr(UniformHandle u)43 const char* getUniformCStr(UniformHandle u) const override { 44 return this->getUniformVariable(u).c_str(); 45 } 46 47 private: GrVkUniformHandler(GrGLSLProgramBuilder * program)48 explicit GrVkUniformHandler(GrGLSLProgramBuilder* program) 49 : INHERITED(program) 50 , fUniforms(kUniformsPerBlock) 51 , fCurrentVertexUBOOffset(0) 52 , fCurrentFragmentUBOOffset(0) 53 , fCurrentSamplerBinding(0) { 54 } 55 56 UniformHandle internalAddUniformArray(uint32_t visibility, 57 GrSLType type, 58 GrSLPrecision precision, 59 const char* name, 60 bool mangleName, 61 int arrayCount, 62 const char** outName) override; 63 64 void appendUniformDecls(GrShaderFlags, SkString*) const override; 65 hasVertexUniforms()66 bool hasVertexUniforms() const { return fCurrentVertexUBOOffset > 0; } hasFragmentUniforms()67 bool hasFragmentUniforms() const { return fCurrentFragmentUBOOffset > 0; } 68 69 getUniformInfo(UniformHandle u)70 const UniformInfo& getUniformInfo(UniformHandle u) const { 71 return fUniforms[u.toIndex()]; 72 } 73 74 75 UniformInfoArray fUniforms; 76 uint32_t fCurrentVertexUBOOffset; 77 uint32_t fCurrentFragmentUBOOffset; 78 uint32_t fCurrentSamplerBinding; 79 80 friend class GrVkProgramBuilder; 81 82 typedef GrGLSLUniformHandler INHERITED; 83 }; 84 85 #endif