SPV: Implement GLSL interpolation built-in functions.
authorRex Xu <rex.xu@amd.com>
Tue, 8 Dec 2015 09:12:09 +0000 (17:12 +0800)
committerRex Xu <rex.xu@amd.com>
Tue, 8 Dec 2015 09:40:11 +0000 (17:40 +0800)
SPIRV/GlslangToSpv.cpp
Test/baseResults/spv.interpOps.frag.out [new file with mode: 0644]
Test/spv.interpOps.frag [new file with mode: 0644]
Test/test-spirv-list

index 0fff30e..4ed3af7 100755 (executable)
@@ -822,7 +822,8 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI
 
     if (node->getOp() == glslang::EOpAtomicCounterIncrement ||
         node->getOp() == glslang::EOpAtomicCounterDecrement ||
-        node->getOp() == glslang::EOpAtomicCounter)
+        node->getOp() == glslang::EOpAtomicCounter          ||
+        node->getOp() == glslang::EOpInterpolateAtCentroid)
         operand = builder.accessChainGetLValue(); // Special case l-value operands
     else
         operand = builder.accessChainLoad(convertGlslangToSpvType(node->getOperand()->getType()));
@@ -1174,6 +1175,11 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
             if (arg == 1)
                 lvalue = true;
             break;
+        case glslang::EOpInterpolateAtSample:
+        case glslang::EOpInterpolateAtOffset:
+            if (arg == 0)
+                lvalue = true;
+            break;
         case glslang::EOpAtomicAdd:
         case glslang::EOpAtomicMin:
         case glslang::EOpAtomicMax:
@@ -2508,7 +2514,9 @@ spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, spv:
     case glslang::EOpFwidthCoarse:
         unaryOp = spv::OpFwidthCoarse;
         break;
-
+    case glslang::EOpInterpolateAtCentroid:
+        libCall = spv::GLSLstd450InterpolateAtCentroid;
+        break;
     case glslang::EOpAny:
         unaryOp = spv::OpAny;
         break;
@@ -2840,7 +2848,12 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::
     case glslang::EOpRefract:
         libCall = spv::GLSLstd450Refract;
         break;
-
+    case glslang::EOpInterpolateAtSample:
+        libCall = spv::GLSLstd450InterpolateAtSample;
+        break;
+    case glslang::EOpInterpolateAtOffset:
+        libCall = spv::GLSLstd450InterpolateAtOffset;
+        break;
     case glslang::EOpAddCarry:
         opCode = spv::OpIAddCarry;
         typeId = builder.makeStructResultType(typeId0, typeId0);
diff --git a/Test/baseResults/spv.interpOps.frag.out b/Test/baseResults/spv.interpOps.frag.out
new file mode 100644 (file)
index 0000000..d23891b
--- /dev/null
@@ -0,0 +1,141 @@
+spv.interpOps.frag\r
+Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.\r
+\r
+\r
+Linked fragment stage:\r
+\r
+\r
+// Module Version 10000\r
+// Generated by (magic number): 80001\r
+// Id's are bound by 101\r
+\r
+                              Capability Shader\r
+               1:             ExtInstImport  "GLSL.std.450"\r
+                              MemoryModel Logical GLSL450\r
+                              EntryPoint Fragment 4  "main" 13 24 33 41 99\r
+                              ExecutionMode 4 OriginLowerLeft\r
+                              Source GLSL 450\r
+                              Name 4  "main"\r
+                              Name 9  "f4"\r
+                              Name 13  "if1"\r
+                              Name 24  "if2"\r
+                              Name 33  "if3"\r
+                              Name 41  "if4"\r
+                              Name 47  "samp"\r
+                              Name 73  "offset"\r
+                              Name 99  "fragColor"\r
+               2:             TypeVoid\r
+               3:             TypeFunction 2\r
+               6:             TypeFloat 32\r
+               7:             TypeVector 6(float) 4\r
+               8:             TypePointer Function 7(fvec4)\r
+              10:    6(float) Constant 0\r
+              11:    7(fvec4) ConstantComposite 10 10 10 10\r
+              12:             TypePointer Input 6(float)\r
+         13(if1):     12(ptr) Variable Input\r
+              15:             TypeInt 32 0\r
+              16:     15(int) Constant 0\r
+              17:             TypePointer Function 6(float)\r
+              22:             TypeVector 6(float) 2\r
+              23:             TypePointer Input 22(fvec2)\r
+         24(if2):     23(ptr) Variable Input\r
+              31:             TypeVector 6(float) 3\r
+              32:             TypePointer Input 31(fvec3)\r
+         33(if3):     32(ptr) Variable Input\r
+              40:             TypePointer Input 7(fvec4)\r
+         41(if4):     40(ptr) Variable Input\r
+              45:             TypeInt 32 1\r
+              46:             TypePointer UniformConstant 45(int)\r
+        47(samp):     46(ptr) Variable UniformConstant\r
+              72:             TypePointer UniformConstant 22(fvec2)\r
+      73(offset):     72(ptr) Variable UniformConstant\r
+              98:             TypePointer Output 7(fvec4)\r
+   99(fragColor):     98(ptr) Variable Output\r
+         4(main):           2 Function None 3\r
+               5:             Label\r
+           9(f4):      8(ptr) Variable Function\r
+                              Store 9(f4) 11\r
+              14:    6(float) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 13(if1)\r
+              18:     17(ptr) AccessChain 9(f4) 16\r
+              19:    6(float) Load 18\r
+              20:    6(float) FAdd 19 14\r
+              21:     17(ptr) AccessChain 9(f4) 16\r
+                              Store 21 20\r
+              25:   22(fvec2) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 24(if2)\r
+              26:    7(fvec4) Load 9(f4)\r
+              27:   22(fvec2) VectorShuffle 26 26 0 1\r
+              28:   22(fvec2) FAdd 27 25\r
+              29:    7(fvec4) Load 9(f4)\r
+              30:    7(fvec4) VectorShuffle 29 28 4 5 2 3\r
+                              Store 9(f4) 30\r
+              34:   31(fvec3) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 33(if3)\r
+              35:    7(fvec4) Load 9(f4)\r
+              36:   31(fvec3) VectorShuffle 35 35 0 1 2\r
+              37:   31(fvec3) FAdd 36 34\r
+              38:    7(fvec4) Load 9(f4)\r
+              39:    7(fvec4) VectorShuffle 38 37 4 5 6 3\r
+                              Store 9(f4) 39\r
+              42:    7(fvec4) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 41(if4)\r
+              43:    7(fvec4) Load 9(f4)\r
+              44:    7(fvec4) FAdd 43 42\r
+                              Store 9(f4) 44\r
+              48:     45(int) Load 47(samp)\r
+              49:    6(float) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 13(if1) 48\r
+              50:     17(ptr) AccessChain 9(f4) 16\r
+              51:    6(float) Load 50\r
+              52:    6(float) FAdd 51 49\r
+              53:     17(ptr) AccessChain 9(f4) 16\r
+                              Store 53 52\r
+              54:     45(int) Load 47(samp)\r
+              55:   22(fvec2) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 24(if2) 54\r
+              56:    7(fvec4) Load 9(f4)\r
+              57:   22(fvec2) VectorShuffle 56 56 0 1\r
+              58:   22(fvec2) FAdd 57 55\r
+              59:    7(fvec4) Load 9(f4)\r
+              60:    7(fvec4) VectorShuffle 59 58 4 5 2 3\r
+                              Store 9(f4) 60\r
+              61:     45(int) Load 47(samp)\r
+              62:   31(fvec3) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 33(if3) 61\r
+              63:    7(fvec4) Load 9(f4)\r
+              64:   31(fvec3) VectorShuffle 63 63 0 1 2\r
+              65:   31(fvec3) FAdd 64 62\r
+              66:    7(fvec4) Load 9(f4)\r
+              67:    7(fvec4) VectorShuffle 66 65 4 5 6 3\r
+                              Store 9(f4) 67\r
+              68:     45(int) Load 47(samp)\r
+              69:    7(fvec4) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 41(if4) 68\r
+              70:    7(fvec4) Load 9(f4)\r
+              71:    7(fvec4) FAdd 70 69\r
+                              Store 9(f4) 71\r
+              74:   22(fvec2) Load 73(offset)\r
+              75:    6(float) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 13(if1) 74\r
+              76:     17(ptr) AccessChain 9(f4) 16\r
+              77:    6(float) Load 76\r
+              78:    6(float) FAdd 77 75\r
+              79:     17(ptr) AccessChain 9(f4) 16\r
+                              Store 79 78\r
+              80:   22(fvec2) Load 73(offset)\r
+              81:   22(fvec2) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 24(if2) 80\r
+              82:    7(fvec4) Load 9(f4)\r
+              83:   22(fvec2) VectorShuffle 82 82 0 1\r
+              84:   22(fvec2) FAdd 83 81\r
+              85:    7(fvec4) Load 9(f4)\r
+              86:    7(fvec4) VectorShuffle 85 84 4 5 2 3\r
+                              Store 9(f4) 86\r
+              87:   22(fvec2) Load 73(offset)\r
+              88:   31(fvec3) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 33(if3) 87\r
+              89:    7(fvec4) Load 9(f4)\r
+              90:   31(fvec3) VectorShuffle 89 89 0 1 2\r
+              91:   31(fvec3) FAdd 90 88\r
+              92:    7(fvec4) Load 9(f4)\r
+              93:    7(fvec4) VectorShuffle 92 91 4 5 6 3\r
+                              Store 9(f4) 93\r
+              94:   22(fvec2) Load 73(offset)\r
+              95:    7(fvec4) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 41(if4) 94\r
+              96:    7(fvec4) Load 9(f4)\r
+              97:    7(fvec4) FAdd 96 95\r
+                              Store 9(f4) 97\r
+             100:    7(fvec4) Load 9(f4)\r
+                              Store 99(fragColor) 100\r
+                              Return\r
+                              FunctionEnd\r
diff --git a/Test/spv.interpOps.frag b/Test/spv.interpOps.frag
new file mode 100644 (file)
index 0000000..fccf304
--- /dev/null
@@ -0,0 +1,32 @@
+#version 450\r
+\r
+in float if1;\r
+in vec2  if2;\r
+in vec3  if3;\r
+in vec4  if4;\r
+\r
+uniform int samp;\r
+uniform vec2 offset;\r
+\r
+out vec4 fragColor;\r
+\r
+void main()\r
+{\r
+    vec4 f4 = vec4(0.0);\r
+    f4.x    += interpolateAtCentroid(if1);\r
+    f4.xy   += interpolateAtCentroid(if2);\r
+    f4.xyz  += interpolateAtCentroid(if3);\r
+    f4      += interpolateAtCentroid(if4);\r
+\r
+    f4.x    += interpolateAtSample(if1, samp);\r
+    f4.xy   += interpolateAtSample(if2, samp);\r
+    f4.xyz  += interpolateAtSample(if3, samp);\r
+    f4      += interpolateAtSample(if4, samp);\r
+\r
+    f4.x    += interpolateAtOffset(if1, offset);\r
+    f4.xy   += interpolateAtOffset(if2, offset);\r
+    f4.xyz  += interpolateAtOffset(if3, offset);\r
+    f4      += interpolateAtOffset(if4, offset);\r
+\r
+    fragColor = f4;\r
+}\r
index 1efcfcb..136a9a6 100644 (file)
@@ -45,6 +45,7 @@ spv.forLoop.frag
 spv.forwardFun.frag
 spv.functionCall.frag
 spv.functionSemantics.frag
+spv.interpOps.frag
 spv.length.frag
 spv.localAggregates.frag
 spv.loops.frag