SPV: Implement GLSL interpolation built-in functions.
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index 0fff30e..4ed3af7 100755
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -822,7 +822,8 @@
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 @@
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 @@
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 @@
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
index 0000000..d23891b
--- /dev/null
+++ b/Test/baseResults/spv.interpOps.frag.out
@@ -0,0 +1,141 @@
+spv.interpOps.frag
+Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+
+
+Linked fragment stage:
+
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 101
+
+ Capability Shader
+ 1: ExtInstImport "GLSL.std.450"
+ MemoryModel Logical GLSL450
+ EntryPoint Fragment 4 "main" 13 24 33 41 99
+ ExecutionMode 4 OriginLowerLeft
+ Source GLSL 450
+ Name 4 "main"
+ Name 9 "f4"
+ Name 13 "if1"
+ Name 24 "if2"
+ Name 33 "if3"
+ Name 41 "if4"
+ Name 47 "samp"
+ Name 73 "offset"
+ Name 99 "fragColor"
+ 2: TypeVoid
+ 3: TypeFunction 2
+ 6: TypeFloat 32
+ 7: TypeVector 6(float) 4
+ 8: TypePointer Function 7(fvec4)
+ 10: 6(float) Constant 0
+ 11: 7(fvec4) ConstantComposite 10 10 10 10
+ 12: TypePointer Input 6(float)
+ 13(if1): 12(ptr) Variable Input
+ 15: TypeInt 32 0
+ 16: 15(int) Constant 0
+ 17: TypePointer Function 6(float)
+ 22: TypeVector 6(float) 2
+ 23: TypePointer Input 22(fvec2)
+ 24(if2): 23(ptr) Variable Input
+ 31: TypeVector 6(float) 3
+ 32: TypePointer Input 31(fvec3)
+ 33(if3): 32(ptr) Variable Input
+ 40: TypePointer Input 7(fvec4)
+ 41(if4): 40(ptr) Variable Input
+ 45: TypeInt 32 1
+ 46: TypePointer UniformConstant 45(int)
+ 47(samp): 46(ptr) Variable UniformConstant
+ 72: TypePointer UniformConstant 22(fvec2)
+ 73(offset): 72(ptr) Variable UniformConstant
+ 98: TypePointer Output 7(fvec4)
+ 99(fragColor): 98(ptr) Variable Output
+ 4(main): 2 Function None 3
+ 5: Label
+ 9(f4): 8(ptr) Variable Function
+ Store 9(f4) 11
+ 14: 6(float) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 13(if1)
+ 18: 17(ptr) AccessChain 9(f4) 16
+ 19: 6(float) Load 18
+ 20: 6(float) FAdd 19 14
+ 21: 17(ptr) AccessChain 9(f4) 16
+ Store 21 20
+ 25: 22(fvec2) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 24(if2)
+ 26: 7(fvec4) Load 9(f4)
+ 27: 22(fvec2) VectorShuffle 26 26 0 1
+ 28: 22(fvec2) FAdd 27 25
+ 29: 7(fvec4) Load 9(f4)
+ 30: 7(fvec4) VectorShuffle 29 28 4 5 2 3
+ Store 9(f4) 30
+ 34: 31(fvec3) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 33(if3)
+ 35: 7(fvec4) Load 9(f4)
+ 36: 31(fvec3) VectorShuffle 35 35 0 1 2
+ 37: 31(fvec3) FAdd 36 34
+ 38: 7(fvec4) Load 9(f4)
+ 39: 7(fvec4) VectorShuffle 38 37 4 5 6 3
+ Store 9(f4) 39
+ 42: 7(fvec4) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 41(if4)
+ 43: 7(fvec4) Load 9(f4)
+ 44: 7(fvec4) FAdd 43 42
+ Store 9(f4) 44
+ 48: 45(int) Load 47(samp)
+ 49: 6(float) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 13(if1) 48
+ 50: 17(ptr) AccessChain 9(f4) 16
+ 51: 6(float) Load 50
+ 52: 6(float) FAdd 51 49
+ 53: 17(ptr) AccessChain 9(f4) 16
+ Store 53 52
+ 54: 45(int) Load 47(samp)
+ 55: 22(fvec2) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 24(if2) 54
+ 56: 7(fvec4) Load 9(f4)
+ 57: 22(fvec2) VectorShuffle 56 56 0 1
+ 58: 22(fvec2) FAdd 57 55
+ 59: 7(fvec4) Load 9(f4)
+ 60: 7(fvec4) VectorShuffle 59 58 4 5 2 3
+ Store 9(f4) 60
+ 61: 45(int) Load 47(samp)
+ 62: 31(fvec3) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 33(if3) 61
+ 63: 7(fvec4) Load 9(f4)
+ 64: 31(fvec3) VectorShuffle 63 63 0 1 2
+ 65: 31(fvec3) FAdd 64 62
+ 66: 7(fvec4) Load 9(f4)
+ 67: 7(fvec4) VectorShuffle 66 65 4 5 6 3
+ Store 9(f4) 67
+ 68: 45(int) Load 47(samp)
+ 69: 7(fvec4) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 41(if4) 68
+ 70: 7(fvec4) Load 9(f4)
+ 71: 7(fvec4) FAdd 70 69
+ Store 9(f4) 71
+ 74: 22(fvec2) Load 73(offset)
+ 75: 6(float) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 13(if1) 74
+ 76: 17(ptr) AccessChain 9(f4) 16
+ 77: 6(float) Load 76
+ 78: 6(float) FAdd 77 75
+ 79: 17(ptr) AccessChain 9(f4) 16
+ Store 79 78
+ 80: 22(fvec2) Load 73(offset)
+ 81: 22(fvec2) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 24(if2) 80
+ 82: 7(fvec4) Load 9(f4)
+ 83: 22(fvec2) VectorShuffle 82 82 0 1
+ 84: 22(fvec2) FAdd 83 81
+ 85: 7(fvec4) Load 9(f4)
+ 86: 7(fvec4) VectorShuffle 85 84 4 5 2 3
+ Store 9(f4) 86
+ 87: 22(fvec2) Load 73(offset)
+ 88: 31(fvec3) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 33(if3) 87
+ 89: 7(fvec4) Load 9(f4)
+ 90: 31(fvec3) VectorShuffle 89 89 0 1 2
+ 91: 31(fvec3) FAdd 90 88
+ 92: 7(fvec4) Load 9(f4)
+ 93: 7(fvec4) VectorShuffle 92 91 4 5 6 3
+ Store 9(f4) 93
+ 94: 22(fvec2) Load 73(offset)
+ 95: 7(fvec4) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 41(if4) 94
+ 96: 7(fvec4) Load 9(f4)
+ 97: 7(fvec4) FAdd 96 95
+ Store 9(f4) 97
+ 100: 7(fvec4) Load 9(f4)
+ Store 99(fragColor) 100
+ Return
+ FunctionEnd
diff --git a/Test/spv.interpOps.frag b/Test/spv.interpOps.frag
new file mode 100644
index 0000000..fccf304
--- /dev/null
+++ b/Test/spv.interpOps.frag
@@ -0,0 +1,32 @@
+#version 450
+
+in float if1;
+in vec2 if2;
+in vec3 if3;
+in vec4 if4;
+
+uniform int samp;
+uniform vec2 offset;
+
+out vec4 fragColor;
+
+void main()
+{
+ vec4 f4 = vec4(0.0);
+ f4.x += interpolateAtCentroid(if1);
+ f4.xy += interpolateAtCentroid(if2);
+ f4.xyz += interpolateAtCentroid(if3);
+ f4 += interpolateAtCentroid(if4);
+
+ f4.x += interpolateAtSample(if1, samp);
+ f4.xy += interpolateAtSample(if2, samp);
+ f4.xyz += interpolateAtSample(if3, samp);
+ f4 += interpolateAtSample(if4, samp);
+
+ f4.x += interpolateAtOffset(if1, offset);
+ f4.xy += interpolateAtOffset(if2, offset);
+ f4.xyz += interpolateAtOffset(if3, offset);
+ f4 += interpolateAtOffset(if4, offset);
+
+ fragColor = f4;
+}
diff --git a/Test/test-spirv-list b/Test/test-spirv-list
index 1efcfcb..136a9a6 100644
--- a/Test/test-spirv-list
+++ b/Test/test-spirv-list
@@ -45,6 +45,7 @@
spv.forwardFun.frag
spv.functionCall.frag
spv.functionSemantics.frag
+spv.interpOps.frag
spv.length.frag
spv.localAggregates.frag
spv.loops.frag