attached uniform and varying handlers to GrMtlPipelineStateBuilder
Bug: skia:
Change-Id: I4e8d09052153fa10bf887f07b70abe37d0c7e884
Reviewed-on: https://skia-review.googlesource.com/145159
Commit-Queue: Timothy Liang <timliang@google.com>
Reviewed-by: Greg Daniel <egdaniel@google.com>
diff --git a/src/gpu/mtl/GrMtlUniformHandler.h b/src/gpu/mtl/GrMtlUniformHandler.h
new file mode 100644
index 0000000..4ee5a36
--- /dev/null
+++ b/src/gpu/mtl/GrMtlUniformHandler.h
@@ -0,0 +1,102 @@
+/*
+* 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 "GrAllocator.h"
+#include "GrShaderVar.h"
+#include "glsl/GrGLSLUniformHandler.h"
+
+// 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 {
+ kGeometryBinding = 0,
+ kFragBinding = 1,
+ kLastUniformBinding = kFragBinding,
+ };
+
+ // fUBOffset is only valid if the GrSLType of the fVariable is not a sampler
+ struct UniformInfo {
+ GrShaderVar fVariable;
+ uint32_t fVisibility;
+ uint32_t fUBOffset;
+ };
+ typedef GrTAllocator<UniformInfo> UniformInfoArray;
+
+ const GrShaderVar& getUniformVariable(UniformHandle u) const override {
+ return fUniforms[u.toIndex()].fVariable;
+ }
+
+ const char* getUniformCStr(UniformHandle u) const override {
+ return this->getUniformVariable(u).c_str();
+ }
+
+private:
+ explicit GrMtlUniformHandler(GrGLSLProgramBuilder* program)
+ : INHERITED(program)
+ , fUniforms(kUniformsPerBlock)
+ , fSamplers(kUniformsPerBlock)
+ , fCurrentGeometryUBOOffset(0)
+ , fCurrentFragmentUBOOffset(0) {
+ }
+
+ UniformHandle internalAddUniformArray(uint32_t visibility,
+ GrSLType type,
+ GrSLPrecision precision,
+ const char* name,
+ bool mangleName,
+ int arrayCount,
+ const char** outName) override;
+
+ SamplerHandle addSampler(uint32_t visibility,
+ GrSwizzle swizzle,
+ GrTextureType type,
+ GrSLPrecision precision,
+ const char* name) override;
+
+ int numSamplers() const { return fSamplers.count(); }
+ const GrShaderVar& samplerVariable(SamplerHandle handle) const override {
+ return fSamplers[handle.toIndex()].fVariable;
+ }
+ GrSwizzle samplerSwizzle(SamplerHandle handle) const override {
+ return fSamplerSwizzles[handle.toIndex()];
+ }
+ uint32_t samplerVisibility(SamplerHandle handle) const {
+ return fSamplers[handle.toIndex()].fVisibility;
+ }
+
+ void appendUniformDecls(GrShaderFlags, SkString*) const override;
+
+ bool hasGeometryUniforms() const { return fCurrentGeometryUBOOffset > 0; }
+ bool hasFragmentUniforms() const { return fCurrentFragmentUBOOffset > 0; }
+
+
+ const UniformInfo& getUniformInfo(UniformHandle u) const {
+ return fUniforms[u.toIndex()];
+ }
+
+
+ UniformInfoArray fUniforms;
+ UniformInfoArray fSamplers;
+ SkTArray<GrSwizzle> fSamplerSwizzles;
+
+ uint32_t fCurrentGeometryUBOOffset;
+ uint32_t fCurrentFragmentUBOOffset;
+
+ friend class GrMtlPipelineStateBuilder;
+
+ typedef GrGLSLUniformHandler INHERITED;
+};
+
+#endif