fixed interface/in/out struct for mvk integration and added a few missing builtins to skslc msl backend

Bug: skia:
Change-Id: Id514dc6af64bb2a5eb71f2161ceba549a8a6836d
Reviewed-on: https://skia-review.googlesource.com/131881
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
Commit-Queue: Timothy Liang <timliang@google.com>
diff --git a/src/sksl/SkSLMetalCodeGenerator.h b/src/sksl/SkSLMetalCodeGenerator.h
index 517f9f6..3f0bc28 100644
--- a/src/sksl/SkSLMetalCodeGenerator.h
+++ b/src/sksl/SkSLMetalCodeGenerator.h
@@ -53,6 +53,7 @@
 class MetalCodeGenerator : public CodeGenerator {
 public:
     static constexpr const char* SAMPLER_SUFFIX = "Smplr";
+    static constexpr const char* PACKED_PREFIX = "packed_";
 
     enum Precedence {
         kParentheses_Precedence    =  1,
@@ -83,6 +84,7 @@
         this->setupIntrinsics();
     }
 
+    bool generateCode(int shaderNum); // FIXME - remove when done inserting MSL
     bool generateCode() override;
 
 protected:
@@ -129,6 +131,12 @@
 
     void writeOutputStruct();
 
+    void writeInterfaceBlocks();
+
+    int size(const Type* type, bool isPacked) const;
+
+    int alignment(const Type* type, bool isPacked) const;
+
     void writeGlobalStruct();
 
     void writePrecisionModifier();
@@ -221,13 +229,14 @@
 
     Requirements requirements(const Statement& e);
 
-    typedef std::tuple<IntrinsicKind, int32_t, int32_t, int32_t, int32_t> Intrinsic;
+    typedef std::pair<IntrinsicKind, int32_t> Intrinsic;
     std::unordered_map<String, Intrinsic> fIntrinsicMap;
     std::vector<const VarDeclaration*> fInitNonConstGlobalVars;
     std::vector<const Variable*> fTextures;
     std::unordered_map<const Type::Field*, const InterfaceBlock*> fInterfaceBlockMap;
     std::unordered_map<const InterfaceBlock*, String> fInterfaceBlockNameMap;
     int fAnonInterfaceCount = 0;
+    int fPaddingCount = 0;
     bool fNeedsGlobalStructInit = false;
     const char* fLineEnding;
     const Context& fContext;