/* * Copyright 2018 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrMtlUniformHandler_DEFINED #define GrMtlUniformHandler_DEFINED #include "src/core/SkTBlockList.h" #include "src/gpu/GrShaderVar.h" #include "src/gpu/glsl/GrGLSLUniformHandler.h" #include // TODO: this class is basically copy and pasted from GrVkUniformHandler so that we can have // some shaders working. The SkSL Metal code generator was written to work with GLSL generated for // the Ganesh Vulkan backend, so it should all work. There might be better ways to do things in // Metal and/or some Vulkan GLSLisms left in. class GrMtlUniformHandler : public GrGLSLUniformHandler { public: static const int kUniformsPerBlock = 8; enum { kUniformBinding = 0, kLastUniformBinding = kUniformBinding, }; static constexpr int kUniformBindingCount = kLastUniformBinding + 1; // fUBOffset is only valid if the GrSLType of the fVariable is not a sampler struct MtlUniformInfo : public UniformInfo { uint32_t fUBOffset; }; typedef SkTBlockList UniformInfoArray; const GrShaderVar& getUniformVariable(UniformHandle u) const override { return fUniforms.item(u.toIndex()).fVariable; } const char* getUniformCStr(UniformHandle u) const override { return this->getUniformVariable(u).c_str(); } int numUniforms() const override { return fUniforms.count(); } UniformInfo& uniform(int idx) override { return fUniforms.item(idx); } const UniformInfo& uniform(int idx) const override { return fUniforms.item(idx); } private: explicit GrMtlUniformHandler(GrGLSLProgramBuilder* program) : INHERITED(program) , fUniforms(kUniformsPerBlock) , fSamplers(kUniformsPerBlock) , fCurrentUBOOffset(0) , fCurrentUBOMaxAlignment(0x0) { } UniformHandle internalAddUniformArray(const GrFragmentProcessor* owner, uint32_t visibility, GrSLType type, const char* name, bool mangleName, int arrayCount, const char** outName) override; SamplerHandle addSampler(const GrBackendFormat&, GrSamplerState, const GrSwizzle&, const char* name, const GrShaderCaps*) override; int numSamplers() const { return fSamplers.count(); } const char* samplerVariable(SamplerHandle handle) const override { return fSamplers.item(handle.toIndex()).fVariable.c_str(); } GrSwizzle samplerSwizzle(SamplerHandle handle) const override { return fSamplerSwizzles[handle.toIndex()]; } uint32_t samplerVisibility(SamplerHandle handle) const { return fSamplers.item(handle.toIndex()).fVisibility; } void appendUniformDecls(GrShaderFlags, SkString*) const override; const UniformInfo& getUniformInfo(UniformHandle u) const { return fUniforms.item(u.toIndex()); } UniformInfoArray fUniforms; UniformInfoArray fSamplers; SkTArray fSamplerSwizzles; uint32_t fCurrentUBOOffset; uint32_t fCurrentUBOMaxAlignment; friend class GrMtlPipelineStateBuilder; using INHERITED = GrGLSLUniformHandler; }; #endif