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