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 "GrShaderVar.h"
13 #include "glsl/GrGLSLUniformHandler.h"
14 
15 class GrVkUniformHandler : public GrGLSLUniformHandler {
16 public:
17     static const int kUniformsPerBlock = 8;
18 
19     enum {
20         kUniformBufferDescSet = 0,
21         kSamplerDescSet = 1,
22         kTexelBufferDescSet = 2,
23     };
24     enum {
25         kGeometryBinding = 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         GrShaderVar fVariable;
32         uint32_t        fVisibility;
33         uint32_t        fUBOffset;
34     };
35     typedef GrTAllocator<UniformInfo> UniformInfoArray;
36 
getUniformVariable(UniformHandle u)37     const GrShaderVar& getUniformVariable(UniformHandle u) const override {
38         return fUniforms[u.toIndex()].fVariable;
39     }
40 
getUniformCStr(UniformHandle u)41     const char* getUniformCStr(UniformHandle u) const override {
42         return this->getUniformVariable(u).c_str();
43     }
44 
45 private:
GrVkUniformHandler(GrGLSLProgramBuilder * program)46     explicit GrVkUniformHandler(GrGLSLProgramBuilder* program)
47         : INHERITED(program)
48         , fUniforms(kUniformsPerBlock)
49         , fSamplers(kUniformsPerBlock)
50         , fTexelBuffers(kUniformsPerBlock)
51         , fCurrentGeometryUBOOffset(0)
52         , fCurrentFragmentUBOOffset(0) {
53     }
54 
55     UniformHandle internalAddUniformArray(uint32_t visibility,
56                                           GrSLType type,
57                                           GrSLPrecision precision,
58                                           const char* name,
59                                           bool mangleName,
60                                           int arrayCount,
61                                           const char** outName) override;
62 
63     SamplerHandle addSampler(uint32_t visibility,
64                              GrSwizzle swizzle,
65                              GrSLType type,
66                              GrSLPrecision precision,
67                              const char* name) override;
68 
numSamplers()69     int numSamplers() const { return fSamplers.count(); }
samplerVariable(SamplerHandle handle)70     const GrShaderVar& samplerVariable(SamplerHandle handle) const override {
71         return fSamplers[handle.toIndex()].fVariable;
72     }
samplerSwizzle(SamplerHandle handle)73     GrSwizzle samplerSwizzle(SamplerHandle handle) const override {
74         return fSamplerSwizzles[handle.toIndex()];
75     }
samplerVisibility(SamplerHandle handle)76     uint32_t samplerVisibility(SamplerHandle handle) const {
77         return fSamplers[handle.toIndex()].fVisibility;
78     }
79 
80     TexelBufferHandle addTexelBuffer(uint32_t visibility, GrSLPrecision,
81                                      const char* name) override;
82 
numTexelBuffers()83     int numTexelBuffers() const { return fTexelBuffers.count(); }
texelBufferVariable(TexelBufferHandle handle)84     const GrShaderVar& texelBufferVariable(TexelBufferHandle handle) const override {
85         return fTexelBuffers[handle.toIndex()].fVariable;
86     }
texelBufferVisibility(TexelBufferHandle handle)87     uint32_t texelBufferVisibility(TexelBufferHandle handle) const {
88         return fTexelBuffers[handle.toIndex()].fVisibility;
89     }
90 
91     void appendUniformDecls(GrShaderFlags, SkString*) const override;
92 
hasGeometryUniforms()93     bool hasGeometryUniforms() const { return fCurrentGeometryUBOOffset > 0; }
hasFragmentUniforms()94     bool hasFragmentUniforms() const { return fCurrentFragmentUBOOffset > 0; }
95 
96 
getUniformInfo(UniformHandle u)97     const UniformInfo& getUniformInfo(UniformHandle u) const {
98         return fUniforms[u.toIndex()];
99     }
100 
101 
102     UniformInfoArray    fUniforms;
103     UniformInfoArray    fSamplers;
104     SkTArray<GrSwizzle> fSamplerSwizzles;
105     UniformInfoArray    fTexelBuffers;
106 
107     uint32_t            fCurrentGeometryUBOOffset;
108     uint32_t            fCurrentFragmentUBOOffset;
109 
110     friend class GrVkPipelineStateBuilder;
111     friend class GrVkDescriptorSetManager;
112 
113     typedef GrGLSLUniformHandler INHERITED;
114 };
115 
116 #endif
117