• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 * Copyright 2018 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 GrMtlUniformHandler_DEFINED
9 #define GrMtlUniformHandler_DEFINED
10 
11 #include "include/private/base/SkTArray.h"
12 #include "src/base/SkTBlockList.h"
13 #include "src/gpu/ganesh/GrShaderVar.h"
14 #include "src/gpu/ganesh/glsl/GrGLSLUniformHandler.h"
15 
16 #include <vector>
17 
18 // TODO: this class is basically copy and pasted from GrVkUniformHandler so that we can have
19 // some shaders working. The SkSL Metal code generator was written to work with GLSL generated for
20 // the Ganesh Vulkan backend, so it should all work. There might be better ways to do things in
21 // Metal and/or some Vulkan GLSLisms left in.
22 class GrMtlUniformHandler : public GrGLSLUniformHandler {
23 public:
24     static const int kUniformsPerBlock = 8;
25 
26     enum {
27         kUniformBinding = 0,
28         kLastUniformBinding = kUniformBinding,
29     };
30     static constexpr int kUniformBindingCount = kLastUniformBinding + 1;
31 
32     // fUBOffset is only valid if the SkSLType of the fVariable is not a sampler
33     struct MtlUniformInfo : public UniformInfo {
34         uint32_t fUBOffset;
35     };
36     typedef SkTBlockList<MtlUniformInfo> UniformInfoArray;
37 
getUniformVariable(UniformHandle u)38     const GrShaderVar& getUniformVariable(UniformHandle u) const override {
39         return fUniforms.item(u.toIndex()).fVariable;
40     }
41 
getUniformCStr(UniformHandle u)42     const char* getUniformCStr(UniformHandle u) const override {
43         return this->getUniformVariable(u).c_str();
44     }
45 
numUniforms()46     int numUniforms() const override {
47         return fUniforms.count();
48     }
49 
uniform(int idx)50     UniformInfo& uniform(int idx) override {
51         return fUniforms.item(idx);
52     }
uniform(int idx)53     const UniformInfo& uniform(int idx) const override {
54         return fUniforms.item(idx);
55     }
56 
57 private:
GrMtlUniformHandler(GrGLSLProgramBuilder * program)58     explicit GrMtlUniformHandler(GrGLSLProgramBuilder* program)
59         : INHERITED(program)
60         , fUniforms(kUniformsPerBlock)
61         , fSamplers(kUniformsPerBlock)
62         , fCurrentUBOOffset(0)
63         , fCurrentUBOMaxAlignment(0x0) {
64     }
65 
66     UniformHandle internalAddUniformArray(const GrProcessor* owner,
67                                           uint32_t visibility,
68                                           SkSLType type,
69                                           const char* name,
70                                           bool mangleName,
71                                           int arrayCount,
72                                           const char** outName) override;
73 
74     SamplerHandle addSampler(const GrBackendFormat&,
75                              GrSamplerState,
76                              const skgpu::Swizzle&,
77                              const char* name,
78                              const GrShaderCaps*) override;
79 
numSamplers()80     int numSamplers() const { return fSamplers.count(); }
samplerVariable(SamplerHandle handle)81     const char* samplerVariable(SamplerHandle handle) const override {
82         return fSamplers.item(handle.toIndex()).fVariable.c_str();
83     }
samplerSwizzle(SamplerHandle handle)84     skgpu::Swizzle samplerSwizzle(SamplerHandle handle) const override {
85         return fSamplerSwizzles[handle.toIndex()];
86     }
samplerVisibility(SamplerHandle handle)87     uint32_t samplerVisibility(SamplerHandle handle) const {
88         return fSamplers.item(handle.toIndex()).fVisibility;
89     }
90 
91     void appendUniformDecls(GrShaderFlags, SkString*) const override;
92 
getUniformInfo(UniformHandle u)93     const UniformInfo& getUniformInfo(UniformHandle u) const {
94         return fUniforms.item(u.toIndex());
95     }
96 
97     UniformInfoArray    fUniforms;
98     UniformInfoArray    fSamplers;
99     skia_private::TArray<skgpu::Swizzle> fSamplerSwizzles;
100 
101     uint32_t            fCurrentUBOOffset;
102     uint32_t            fCurrentUBOMaxAlignment;
103 
104     friend class GrMtlPipelineStateBuilder;
105 
106     using INHERITED = GrGLSLUniformHandler;
107 };
108 
109 #endif
110