Added DSL support for interface blocks

Change-Id: I5b770252eb5daa29844ac75ee4be81e503c2907f
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/424039
Reviewed-by: John Stiles <johnstiles@google.com>
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
diff --git a/tests/SkSLDSLTest.cpp b/tests/SkSLDSLTest.cpp
index 25bc2d9..5a4daf6 100644
--- a/tests/SkSLDSLTest.cpp
+++ b/tests/SkSLDSLTest.cpp
@@ -1523,6 +1523,31 @@
     }
 }
 
+DEF_GPUTEST_FOR_MOCK_CONTEXT(DSLInterfaceBlock, r, ctxInfo) {
+    AutoDSLContext context(ctxInfo.directContext()->priv().getGpu());
+    DSLVar intf = InterfaceBlock(kUniform_Modifier, "InterfaceBlock1",
+                                 { Field(kFloat_Type, "a"), Field(kInt_Type, "b") });
+    REPORTER_ASSERT(r, DSLWriter::ProgramElements().size() == 1);
+    EXPECT_EQUAL(*DSLWriter::ProgramElements().back(),
+                 "uniform InterfaceBlock1 { float a; int b; };");
+    EXPECT_EQUAL(intf.field("a"), "InterfaceBlock1.a");
+
+    DSLVar intf2 = InterfaceBlock(kUniform_Modifier, "InterfaceBlock2",
+                                  { Field(kFloat2_Type, "x"), Field(kHalf2x2_Type, "y") },
+                                  "blockVar");
+    REPORTER_ASSERT(r, DSLWriter::ProgramElements().size() == 2);
+    EXPECT_EQUAL(*DSLWriter::ProgramElements().back(),
+                 "uniform InterfaceBlock2 { float2 x; half2x2 y; } blockVar;");
+    EXPECT_EQUAL(intf2.field("x"), "blockVar.x");
+
+    DSLVar intf3 = InterfaceBlock(kUniform_Modifier, "InterfaceBlock3", { Field(kFloat_Type, "z") },
+                                  "arrayVar", 4);
+    REPORTER_ASSERT(r, DSLWriter::ProgramElements().size() == 3);
+    EXPECT_EQUAL(*DSLWriter::ProgramElements().back(),
+                 "uniform InterfaceBlock3 { float z; } arrayVar[4];");
+    EXPECT_EQUAL(intf3[1].field("z"), "arrayVar[1].z");
+}
+
 DEF_GPUTEST_FOR_MOCK_CONTEXT(DSLReturn, r, ctxInfo) {
     AutoDSLContext context(ctxInfo.directContext()->priv().getGpu());