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