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 "GrAllocator.h" 12 #include "GrSamplerState.h" 13 #include "GrShaderVar.h" 14 #include "GrVkSampler.h" 15 #include "glsl/GrGLSLUniformHandler.h" 16 #include "vk/GrVkTypes.h" 17 18 class GrVkUniformHandler : public GrGLSLUniformHandler { 19 public: 20 static const int kUniformsPerBlock = 8; 21 22 enum { 23 /** 24 * Binding a descriptor set invalidates all higher index descriptor sets. We must bind 25 * in the order of this enumeration. Samplers are after Uniforms because GrOps can specify 26 * GP textures as dynamic state, meaning they get rebound for each GrMesh in a draw while 27 * uniforms are bound once before all the draws. 28 */ 29 kUniformBufferDescSet = 0, 30 kSamplerDescSet = 1, 31 }; 32 enum { 33 kGeometryBinding = 0, 34 kFragBinding = 1, 35 }; 36 37 struct UniformInfo { 38 GrShaderVar fVariable; 39 uint32_t fVisibility; 40 // fUBOffset is only valid if the GrSLType of the fVariable is not a sampler 41 uint32_t fUBOffset; 42 // The SamplerState, maxMipLevel, and ycbcrInfo are only valid if the GrSLType is a sampler 43 // and that sampler is used for sampling an external image with a ycbcr conversion. 44 const GrVkSampler* fImmutableSampler = nullptr; 45 }; 46 typedef GrTAllocator<UniformInfo> UniformInfoArray; 47 48 const GrShaderVar& getUniformVariable(UniformHandle u) const override { 49 return fUniforms[u.toIndex()].fVariable; 50 } 51 52 const char* getUniformCStr(UniformHandle u) const override { 53 return this->getUniformVariable(u).c_str(); 54 } 55 56 private: 57 explicit GrVkUniformHandler(GrGLSLProgramBuilder* program) 58 : INHERITED(program) 59 , fUniforms(kUniformsPerBlock) 60 , fSamplers(kUniformsPerBlock) 61 , fCurrentGeometryUBOOffset(0) 62 , fCurrentFragmentUBOOffset(0) { 63 } 64 65 UniformHandle internalAddUniformArray(uint32_t visibility, 66 GrSLType type, 67 GrSLPrecision precision, 68 const char* name, 69 bool mangleName, 70 int arrayCount, 71 const char** outName) override; 72 73 SamplerHandle addSampler(const GrTexture* texture, 74 const GrSamplerState&, 75 const char* name, 76 const GrShaderCaps*) override; 77 78 int numSamplers() const { return fSamplers.count(); } 79 const GrShaderVar& samplerVariable(SamplerHandle handle) const override { 80 return fSamplers[handle.toIndex()].fVariable; 81 } 82 GrSwizzle samplerSwizzle(SamplerHandle handle) const override { 83 return fSamplerSwizzles[handle.toIndex()]; 84 } 85 uint32_t samplerVisibility(SamplerHandle handle) const { 86 return fSamplers[handle.toIndex()].fVisibility; 87 } 88 89 const GrVkSampler* immutableSampler(UniformHandle u) const { 90 return fSamplers[u.toIndex()].fImmutableSampler; 91 } 92 93 void appendUniformDecls(GrShaderFlags, SkString*) const override; 94 95 bool hasGeometryUniforms() const { return fCurrentGeometryUBOOffset > 0; } 96 bool hasFragmentUniforms() const { return fCurrentFragmentUBOOffset > 0; } 97 98 99 const UniformInfo& getUniformInfo(UniformHandle u) const { 100 return fUniforms[u.toIndex()]; 101 } 102 103 104 UniformInfoArray fUniforms; 105 UniformInfoArray fSamplers; 106 SkTArray<GrSwizzle> fSamplerSwizzles; 107 108 uint32_t fCurrentGeometryUBOOffset; 109 uint32_t fCurrentFragmentUBOOffset; 110 111 friend class GrVkPipelineStateBuilder; 112 friend class GrVkDescriptorSetManager; 113 114 typedef GrGLSLUniformHandler INHERITED; 115 }; 116 117 #endif 118