mirror of
https://github.com/KhronosGroup/glslang
synced 2024-11-12 21:20:06 +00:00
Fix SPIR-V for HLSL EvaluateAttribute* of interpolants in structs
Generate load of interpolant for first operand to GLSLstd450 InterpolateAt* SPIR-V ops. This allows the interpolants to propagate from the input struct in the wrapper around main into the shader during HLSL legalization. A new pass has been added to legalization which will remove the load and replace with the pointer of the load to create valid external interpolate op. Fixes #2584
This commit is contained in:
parent
6dc24ffa47
commit
7fbaca0d06
@ -2301,7 +2301,8 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI
|
|||||||
if (node->getOp() == glslang::EOpAtomicCounterIncrement ||
|
if (node->getOp() == glslang::EOpAtomicCounterIncrement ||
|
||||||
node->getOp() == glslang::EOpAtomicCounterDecrement ||
|
node->getOp() == glslang::EOpAtomicCounterDecrement ||
|
||||||
node->getOp() == glslang::EOpAtomicCounter ||
|
node->getOp() == glslang::EOpAtomicCounter ||
|
||||||
node->getOp() == glslang::EOpInterpolateAtCentroid ||
|
(node->getOp() == glslang::EOpInterpolateAtCentroid &&
|
||||||
|
glslangIntermediate->getSource() != glslang::EShSourceHlsl) ||
|
||||||
node->getOp() == glslang::EOpRayQueryProceed ||
|
node->getOp() == glslang::EOpRayQueryProceed ||
|
||||||
node->getOp() == glslang::EOpRayQueryGetRayTMin ||
|
node->getOp() == glslang::EOpRayQueryGetRayTMin ||
|
||||||
node->getOp() == glslang::EOpRayQueryGetRayFlags ||
|
node->getOp() == glslang::EOpRayQueryGetRayFlags ||
|
||||||
@ -2977,7 +2978,13 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
|
|||||||
case glslang::EOpInterpolateAtOffset:
|
case glslang::EOpInterpolateAtOffset:
|
||||||
case glslang::EOpInterpolateAtVertex:
|
case glslang::EOpInterpolateAtVertex:
|
||||||
if (arg == 0) {
|
if (arg == 0) {
|
||||||
lvalue = true;
|
// If GLSL, use the address of the interpolant argument.
|
||||||
|
// If HLSL, use an internal version of OpInterolates that takes
|
||||||
|
// the rvalue of the interpolant. A fixup pass in spirv-opt
|
||||||
|
// legalization will remove the OpLoad and convert to an lvalue.
|
||||||
|
// Had to do this because legalization will only propagate a
|
||||||
|
// builtin into an rvalue.
|
||||||
|
lvalue = glslangIntermediate->getSource() != glslang::EShSourceHlsl;
|
||||||
|
|
||||||
// Does it need a swizzle inversion? If so, evaluation is inverted;
|
// Does it need a swizzle inversion? If so, evaluation is inverted;
|
||||||
// operate first on the swizzle base, then apply the swizzle.
|
// operate first on the swizzle base, then apply the swizzle.
|
||||||
|
@ -207,6 +207,7 @@ void SpirvToolsTransform(const glslang::TIntermediate& intermediate, std::vector
|
|||||||
optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass());
|
optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass());
|
||||||
optimizer.RegisterPass(spvtools::CreateVectorDCEPass());
|
optimizer.RegisterPass(spvtools::CreateVectorDCEPass());
|
||||||
optimizer.RegisterPass(spvtools::CreateDeadInsertElimPass());
|
optimizer.RegisterPass(spvtools::CreateDeadInsertElimPass());
|
||||||
|
optimizer.RegisterPass(spvtools::CreateInterpolateFixupPass());
|
||||||
if (options->optimizeSize) {
|
if (options->optimizeSize) {
|
||||||
optimizer.RegisterPass(spvtools::CreateRedundancyEliminationPass());
|
optimizer.RegisterPass(spvtools::CreateRedundancyEliminationPass());
|
||||||
}
|
}
|
||||||
|
110
Test/baseLegalResults/hlsl.intrinsics.evalfns.frag.out
Normal file
110
Test/baseLegalResults/hlsl.intrinsics.evalfns.frag.out
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
hlsl.intrinsics.evalfns.frag
|
||||||
|
// Module Version 10000
|
||||||
|
// Generated by (magic number): 8000a
|
||||||
|
// Id's are bound by 274
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
Capability InterpolationFunction
|
||||||
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint Fragment 4 "main" 138 142 146 150 154 157 161
|
||||||
|
ExecutionMode 4 OriginUpperLeft
|
||||||
|
Source HLSL 500
|
||||||
|
Name 4 "main"
|
||||||
|
Name 138 "inF1"
|
||||||
|
Name 142 "inF2"
|
||||||
|
Name 146 "inF3"
|
||||||
|
Name 150 "inF4"
|
||||||
|
Name 154 "inI2"
|
||||||
|
Name 157 "i.vPos"
|
||||||
|
Name 161 "@entryPointOutput"
|
||||||
|
Decorate 138(inF1) Location 0
|
||||||
|
Decorate 142(inF2) Location 1
|
||||||
|
Decorate 146(inF3) Location 2
|
||||||
|
Decorate 150(inF4) Location 3
|
||||||
|
Decorate 154(inI2) Flat
|
||||||
|
Decorate 154(inI2) Location 4
|
||||||
|
Decorate 157(i.vPos) Location 5
|
||||||
|
Decorate 161(@entryPointOutput) Location 0
|
||||||
|
2: TypeVoid
|
||||||
|
3: TypeFunction 2
|
||||||
|
6: TypeFloat 32
|
||||||
|
8: TypeVector 6(float) 2
|
||||||
|
10: TypeVector 6(float) 3
|
||||||
|
12: TypeVector 6(float) 4
|
||||||
|
14: TypeInt 32 1
|
||||||
|
15: TypeVector 14(int) 2
|
||||||
|
30: 6(float) Constant 3204448256
|
||||||
|
31: 6(float) Constant 3179282432
|
||||||
|
32: 8(fvec2) ConstantComposite 30 31
|
||||||
|
36: 6(float) Constant 0
|
||||||
|
37: 6(float) Constant 1031798784
|
||||||
|
38: 8(fvec2) ConstantComposite 36 37
|
||||||
|
42: 6(float) Constant 1044381696
|
||||||
|
43: 6(float) Constant 3200253952
|
||||||
|
44: 8(fvec2) ConstantComposite 42 43
|
||||||
|
48: 6(float) Constant 1054867456
|
||||||
|
49: 8(fvec2) ConstantComposite 48 30
|
||||||
|
53: 14(int) Constant 28
|
||||||
|
64: TypeInt 32 0
|
||||||
|
65: 64(int) Constant 3
|
||||||
|
137: TypePointer Input 6(float)
|
||||||
|
138(inF1): 137(ptr) Variable Input
|
||||||
|
141: TypePointer Input 8(fvec2)
|
||||||
|
142(inF2): 141(ptr) Variable Input
|
||||||
|
145: TypePointer Input 10(fvec3)
|
||||||
|
146(inF3): 145(ptr) Variable Input
|
||||||
|
149: TypePointer Input 12(fvec4)
|
||||||
|
150(inF4): 149(ptr) Variable Input
|
||||||
|
153: TypePointer Input 15(ivec2)
|
||||||
|
154(inI2): 153(ptr) Variable Input
|
||||||
|
157(i.vPos): 141(ptr) Variable Input
|
||||||
|
160: TypePointer Output 12(fvec4)
|
||||||
|
161(@entryPointOutput): 160(ptr) Variable Output
|
||||||
|
273: 15(ivec2) ConstantComposite 53 53
|
||||||
|
4(main): 2 Function None 3
|
||||||
|
5: Label
|
||||||
|
155: 15(ivec2) Load 154(inI2)
|
||||||
|
183: 6(float) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 138(inF1) 32
|
||||||
|
185: 8(fvec2) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 142(inF2) 38
|
||||||
|
187: 10(fvec3) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 146(inF3) 44
|
||||||
|
189: 12(fvec4) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 150(inF4) 49
|
||||||
|
193: 15(ivec2) ShiftLeftLogical 155 273
|
||||||
|
195: 15(ivec2) ShiftRightArithmetic 193 273
|
||||||
|
196: 8(fvec2) ConvertSToF 195
|
||||||
|
197: 8(fvec2) VectorTimesScalar 196 37
|
||||||
|
198: 6(float) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 138(inF1) 197
|
||||||
|
200: 6(float) FAdd 183 198
|
||||||
|
202: 6(float) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 138(inF1) 65
|
||||||
|
204: 6(float) FAdd 200 202
|
||||||
|
206: 8(fvec2) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 142(inF2) 65
|
||||||
|
208: 8(fvec2) FAdd 185 206
|
||||||
|
210: 10(fvec3) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 146(inF3) 65
|
||||||
|
212: 10(fvec3) FAdd 187 210
|
||||||
|
214: 12(fvec4) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 150(inF4) 65
|
||||||
|
216: 12(fvec4) FAdd 189 214
|
||||||
|
219: 14(int) CompositeExtract 155 0
|
||||||
|
220: 64(int) Bitcast 219
|
||||||
|
221: 6(float) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 138(inF1) 220
|
||||||
|
223: 6(float) FAdd 204 221
|
||||||
|
225: 6(float) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 138(inF1)
|
||||||
|
227: 6(float) FAdd 223 225
|
||||||
|
229: 8(fvec2) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 142(inF2)
|
||||||
|
231: 8(fvec2) FAdd 208 229
|
||||||
|
233: 10(fvec3) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 146(inF3)
|
||||||
|
235: 10(fvec3) FAdd 212 233
|
||||||
|
237: 12(fvec4) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 150(inF4)
|
||||||
|
239: 12(fvec4) FAdd 216 237
|
||||||
|
242: 8(fvec2) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 157(i.vPos) 38
|
||||||
|
244: 8(fvec2) FAdd 231 242
|
||||||
|
247: 8(fvec2) ExtInst 1(GLSL.std.450) 77(InterpolateAtSample) 157(i.vPos) 65
|
||||||
|
249: 8(fvec2) FAdd 244 247
|
||||||
|
252: 8(fvec2) ExtInst 1(GLSL.std.450) 76(InterpolateAtCentroid) 157(i.vPos)
|
||||||
|
254: 8(fvec2) FAdd 249 252
|
||||||
|
257: 6(float) CompositeExtract 254 1
|
||||||
|
259: 6(float) CompositeExtract 235 2
|
||||||
|
261: 6(float) CompositeExtract 239 3
|
||||||
|
262: 12(fvec4) CompositeConstruct 227 257 259 261
|
||||||
|
Store 161(@entryPointOutput) 262
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
@ -1,287 +0,0 @@
|
|||||||
hlsl.intrinsics.evalfns.frag
|
|
||||||
Shader version: 500
|
|
||||||
gl_FragCoord origin is upper left
|
|
||||||
0:? Sequence
|
|
||||||
0:3 Function Definition: @main(f1;vf2;vf3;vf4;vi2; ( temp void)
|
|
||||||
0:3 Function Parameters:
|
|
||||||
0:3 'inF1' ( in float)
|
|
||||||
0:3 'inF2' ( in 2-component vector of float)
|
|
||||||
0:3 'inF3' ( in 3-component vector of float)
|
|
||||||
0:3 'inF4' ( in 4-component vector of float)
|
|
||||||
0:3 'inI2' ( in 2-component vector of int)
|
|
||||||
0:? Sequence
|
|
||||||
0:4 interpolateAtOffset ( temp float)
|
|
||||||
0:4 'inF1' ( in float)
|
|
||||||
0:? Constant:
|
|
||||||
0:? -0.500000
|
|
||||||
0:? -0.062500
|
|
||||||
0:5 interpolateAtOffset ( temp 2-component vector of float)
|
|
||||||
0:5 'inF2' ( in 2-component vector of float)
|
|
||||||
0:? Constant:
|
|
||||||
0:? 0.000000
|
|
||||||
0:? 0.062500
|
|
||||||
0:6 interpolateAtOffset ( temp 3-component vector of float)
|
|
||||||
0:6 'inF3' ( in 3-component vector of float)
|
|
||||||
0:? Constant:
|
|
||||||
0:? 0.187500
|
|
||||||
0:? -0.375000
|
|
||||||
0:7 interpolateAtOffset ( temp 4-component vector of float)
|
|
||||||
0:7 'inF4' ( in 4-component vector of float)
|
|
||||||
0:? Constant:
|
|
||||||
0:? 0.437500
|
|
||||||
0:? -0.500000
|
|
||||||
0:9 interpolateAtOffset ( temp float)
|
|
||||||
0:9 'inF1' ( in float)
|
|
||||||
0:9 vector-scale ( temp 2-component vector of float)
|
|
||||||
0:9 Convert int to float ( temp 2-component vector of float)
|
|
||||||
0:9 right-shift ( temp 2-component vector of int)
|
|
||||||
0:9 left-shift ( temp 2-component vector of int)
|
|
||||||
0:9 'inI2' ( in 2-component vector of int)
|
|
||||||
0:9 Constant:
|
|
||||||
0:9 28 (const int)
|
|
||||||
0:9 Constant:
|
|
||||||
0:9 28 (const int)
|
|
||||||
0:9 Constant:
|
|
||||||
0:9 0.062500
|
|
||||||
0:3 Function Definition: main( ( temp void)
|
|
||||||
0:3 Function Parameters:
|
|
||||||
0:? Sequence
|
|
||||||
0:3 move second child to first child ( temp float)
|
|
||||||
0:? 'inF1' ( temp float)
|
|
||||||
0:? 'inF1' (layout( location=0) in float)
|
|
||||||
0:3 move second child to first child ( temp 2-component vector of float)
|
|
||||||
0:? 'inF2' ( temp 2-component vector of float)
|
|
||||||
0:? 'inF2' (layout( location=1) in 2-component vector of float)
|
|
||||||
0:3 move second child to first child ( temp 3-component vector of float)
|
|
||||||
0:? 'inF3' ( temp 3-component vector of float)
|
|
||||||
0:? 'inF3' (layout( location=2) in 3-component vector of float)
|
|
||||||
0:3 move second child to first child ( temp 4-component vector of float)
|
|
||||||
0:? 'inF4' ( temp 4-component vector of float)
|
|
||||||
0:? 'inF4' (layout( location=3) in 4-component vector of float)
|
|
||||||
0:3 move second child to first child ( temp 2-component vector of int)
|
|
||||||
0:? 'inI2' ( temp 2-component vector of int)
|
|
||||||
0:? 'inI2' (layout( location=4) flat in 2-component vector of int)
|
|
||||||
0:3 Function Call: @main(f1;vf2;vf3;vf4;vi2; ( temp void)
|
|
||||||
0:? 'inF1' ( temp float)
|
|
||||||
0:? 'inF2' ( temp 2-component vector of float)
|
|
||||||
0:? 'inF3' ( temp 3-component vector of float)
|
|
||||||
0:? 'inF4' ( temp 4-component vector of float)
|
|
||||||
0:? 'inI2' ( temp 2-component vector of int)
|
|
||||||
0:? Linker Objects
|
|
||||||
0:? 'inF1' (layout( location=0) in float)
|
|
||||||
0:? 'inF2' (layout( location=1) in 2-component vector of float)
|
|
||||||
0:? 'inF3' (layout( location=2) in 3-component vector of float)
|
|
||||||
0:? 'inF4' (layout( location=3) in 4-component vector of float)
|
|
||||||
0:? 'inI2' (layout( location=4) flat in 2-component vector of int)
|
|
||||||
|
|
||||||
|
|
||||||
Linked fragment stage:
|
|
||||||
|
|
||||||
|
|
||||||
Shader version: 500
|
|
||||||
gl_FragCoord origin is upper left
|
|
||||||
0:? Sequence
|
|
||||||
0:3 Function Definition: @main(f1;vf2;vf3;vf4;vi2; ( temp void)
|
|
||||||
0:3 Function Parameters:
|
|
||||||
0:3 'inF1' ( in float)
|
|
||||||
0:3 'inF2' ( in 2-component vector of float)
|
|
||||||
0:3 'inF3' ( in 3-component vector of float)
|
|
||||||
0:3 'inF4' ( in 4-component vector of float)
|
|
||||||
0:3 'inI2' ( in 2-component vector of int)
|
|
||||||
0:? Sequence
|
|
||||||
0:4 interpolateAtOffset ( temp float)
|
|
||||||
0:4 'inF1' ( in float)
|
|
||||||
0:? Constant:
|
|
||||||
0:? -0.500000
|
|
||||||
0:? -0.062500
|
|
||||||
0:5 interpolateAtOffset ( temp 2-component vector of float)
|
|
||||||
0:5 'inF2' ( in 2-component vector of float)
|
|
||||||
0:? Constant:
|
|
||||||
0:? 0.000000
|
|
||||||
0:? 0.062500
|
|
||||||
0:6 interpolateAtOffset ( temp 3-component vector of float)
|
|
||||||
0:6 'inF3' ( in 3-component vector of float)
|
|
||||||
0:? Constant:
|
|
||||||
0:? 0.187500
|
|
||||||
0:? -0.375000
|
|
||||||
0:7 interpolateAtOffset ( temp 4-component vector of float)
|
|
||||||
0:7 'inF4' ( in 4-component vector of float)
|
|
||||||
0:? Constant:
|
|
||||||
0:? 0.437500
|
|
||||||
0:? -0.500000
|
|
||||||
0:9 interpolateAtOffset ( temp float)
|
|
||||||
0:9 'inF1' ( in float)
|
|
||||||
0:9 vector-scale ( temp 2-component vector of float)
|
|
||||||
0:9 Convert int to float ( temp 2-component vector of float)
|
|
||||||
0:9 right-shift ( temp 2-component vector of int)
|
|
||||||
0:9 left-shift ( temp 2-component vector of int)
|
|
||||||
0:9 'inI2' ( in 2-component vector of int)
|
|
||||||
0:9 Constant:
|
|
||||||
0:9 28 (const int)
|
|
||||||
0:9 Constant:
|
|
||||||
0:9 28 (const int)
|
|
||||||
0:9 Constant:
|
|
||||||
0:9 0.062500
|
|
||||||
0:3 Function Definition: main( ( temp void)
|
|
||||||
0:3 Function Parameters:
|
|
||||||
0:? Sequence
|
|
||||||
0:3 move second child to first child ( temp float)
|
|
||||||
0:? 'inF1' ( temp float)
|
|
||||||
0:? 'inF1' (layout( location=0) in float)
|
|
||||||
0:3 move second child to first child ( temp 2-component vector of float)
|
|
||||||
0:? 'inF2' ( temp 2-component vector of float)
|
|
||||||
0:? 'inF2' (layout( location=1) in 2-component vector of float)
|
|
||||||
0:3 move second child to first child ( temp 3-component vector of float)
|
|
||||||
0:? 'inF3' ( temp 3-component vector of float)
|
|
||||||
0:? 'inF3' (layout( location=2) in 3-component vector of float)
|
|
||||||
0:3 move second child to first child ( temp 4-component vector of float)
|
|
||||||
0:? 'inF4' ( temp 4-component vector of float)
|
|
||||||
0:? 'inF4' (layout( location=3) in 4-component vector of float)
|
|
||||||
0:3 move second child to first child ( temp 2-component vector of int)
|
|
||||||
0:? 'inI2' ( temp 2-component vector of int)
|
|
||||||
0:? 'inI2' (layout( location=4) flat in 2-component vector of int)
|
|
||||||
0:3 Function Call: @main(f1;vf2;vf3;vf4;vi2; ( temp void)
|
|
||||||
0:? 'inF1' ( temp float)
|
|
||||||
0:? 'inF2' ( temp 2-component vector of float)
|
|
||||||
0:? 'inF3' ( temp 3-component vector of float)
|
|
||||||
0:? 'inF4' ( temp 4-component vector of float)
|
|
||||||
0:? 'inI2' ( temp 2-component vector of int)
|
|
||||||
0:? Linker Objects
|
|
||||||
0:? 'inF1' (layout( location=0) in float)
|
|
||||||
0:? 'inF2' (layout( location=1) in 2-component vector of float)
|
|
||||||
0:? 'inF3' (layout( location=2) in 3-component vector of float)
|
|
||||||
0:? 'inF4' (layout( location=3) in 4-component vector of float)
|
|
||||||
0:? 'inI2' (layout( location=4) flat in 2-component vector of int)
|
|
||||||
|
|
||||||
Validation failed
|
|
||||||
// Module Version 10000
|
|
||||||
// Generated by (magic number): 8000a
|
|
||||||
// Id's are bound by 80
|
|
||||||
|
|
||||||
Capability Shader
|
|
||||||
Capability InterpolationFunction
|
|
||||||
1: ExtInstImport "GLSL.std.450"
|
|
||||||
MemoryModel Logical GLSL450
|
|
||||||
EntryPoint Fragment 4 "main" 51 55 59 63 67
|
|
||||||
ExecutionMode 4 OriginUpperLeft
|
|
||||||
Source HLSL 500
|
|
||||||
Name 4 "main"
|
|
||||||
Name 23 "@main(f1;vf2;vf3;vf4;vi2;"
|
|
||||||
Name 18 "inF1"
|
|
||||||
Name 19 "inF2"
|
|
||||||
Name 20 "inF3"
|
|
||||||
Name 21 "inF4"
|
|
||||||
Name 22 "inI2"
|
|
||||||
Name 49 "inF1"
|
|
||||||
Name 51 "inF1"
|
|
||||||
Name 53 "inF2"
|
|
||||||
Name 55 "inF2"
|
|
||||||
Name 57 "inF3"
|
|
||||||
Name 59 "inF3"
|
|
||||||
Name 61 "inF4"
|
|
||||||
Name 63 "inF4"
|
|
||||||
Name 65 "inI2"
|
|
||||||
Name 67 "inI2"
|
|
||||||
Name 69 "param"
|
|
||||||
Name 71 "param"
|
|
||||||
Name 73 "param"
|
|
||||||
Name 75 "param"
|
|
||||||
Name 77 "param"
|
|
||||||
Decorate 51(inF1) Location 0
|
|
||||||
Decorate 55(inF2) Location 1
|
|
||||||
Decorate 59(inF3) Location 2
|
|
||||||
Decorate 63(inF4) Location 3
|
|
||||||
Decorate 67(inI2) Flat
|
|
||||||
Decorate 67(inI2) Location 4
|
|
||||||
2: TypeVoid
|
|
||||||
3: TypeFunction 2
|
|
||||||
6: TypeFloat 32
|
|
||||||
7: TypePointer Function 6(float)
|
|
||||||
8: TypeVector 6(float) 2
|
|
||||||
9: TypePointer Function 8(fvec2)
|
|
||||||
10: TypeVector 6(float) 3
|
|
||||||
11: TypePointer Function 10(fvec3)
|
|
||||||
12: TypeVector 6(float) 4
|
|
||||||
13: TypePointer Function 12(fvec4)
|
|
||||||
14: TypeInt 32 1
|
|
||||||
15: TypeVector 14(int) 2
|
|
||||||
16: TypePointer Function 15(ivec2)
|
|
||||||
17: TypeFunction 2 7(ptr) 9(ptr) 11(ptr) 13(ptr) 16(ptr)
|
|
||||||
25: 6(float) Constant 3204448256
|
|
||||||
26: 6(float) Constant 3179282432
|
|
||||||
27: 8(fvec2) ConstantComposite 25 26
|
|
||||||
29: 6(float) Constant 0
|
|
||||||
30: 6(float) Constant 1031798784
|
|
||||||
31: 8(fvec2) ConstantComposite 29 30
|
|
||||||
33: 6(float) Constant 1044381696
|
|
||||||
34: 6(float) Constant 3200253952
|
|
||||||
35: 8(fvec2) ConstantComposite 33 34
|
|
||||||
37: 6(float) Constant 1054867456
|
|
||||||
38: 8(fvec2) ConstantComposite 37 25
|
|
||||||
41: 14(int) Constant 28
|
|
||||||
50: TypePointer Input 6(float)
|
|
||||||
51(inF1): 50(ptr) Variable Input
|
|
||||||
54: TypePointer Input 8(fvec2)
|
|
||||||
55(inF2): 54(ptr) Variable Input
|
|
||||||
58: TypePointer Input 10(fvec3)
|
|
||||||
59(inF3): 58(ptr) Variable Input
|
|
||||||
62: TypePointer Input 12(fvec4)
|
|
||||||
63(inF4): 62(ptr) Variable Input
|
|
||||||
66: TypePointer Input 15(ivec2)
|
|
||||||
67(inI2): 66(ptr) Variable Input
|
|
||||||
4(main): 2 Function None 3
|
|
||||||
5: Label
|
|
||||||
49(inF1): 7(ptr) Variable Function
|
|
||||||
53(inF2): 9(ptr) Variable Function
|
|
||||||
57(inF3): 11(ptr) Variable Function
|
|
||||||
61(inF4): 13(ptr) Variable Function
|
|
||||||
65(inI2): 16(ptr) Variable Function
|
|
||||||
69(param): 7(ptr) Variable Function
|
|
||||||
71(param): 9(ptr) Variable Function
|
|
||||||
73(param): 11(ptr) Variable Function
|
|
||||||
75(param): 13(ptr) Variable Function
|
|
||||||
77(param): 16(ptr) Variable Function
|
|
||||||
52: 6(float) Load 51(inF1)
|
|
||||||
Store 49(inF1) 52
|
|
||||||
56: 8(fvec2) Load 55(inF2)
|
|
||||||
Store 53(inF2) 56
|
|
||||||
60: 10(fvec3) Load 59(inF3)
|
|
||||||
Store 57(inF3) 60
|
|
||||||
64: 12(fvec4) Load 63(inF4)
|
|
||||||
Store 61(inF4) 64
|
|
||||||
68: 15(ivec2) Load 67(inI2)
|
|
||||||
Store 65(inI2) 68
|
|
||||||
70: 6(float) Load 49(inF1)
|
|
||||||
Store 69(param) 70
|
|
||||||
72: 8(fvec2) Load 53(inF2)
|
|
||||||
Store 71(param) 72
|
|
||||||
74: 10(fvec3) Load 57(inF3)
|
|
||||||
Store 73(param) 74
|
|
||||||
76: 12(fvec4) Load 61(inF4)
|
|
||||||
Store 75(param) 76
|
|
||||||
78: 15(ivec2) Load 65(inI2)
|
|
||||||
Store 77(param) 78
|
|
||||||
79: 2 FunctionCall 23(@main(f1;vf2;vf3;vf4;vi2;) 69(param) 71(param) 73(param) 75(param) 77(param)
|
|
||||||
Return
|
|
||||||
FunctionEnd
|
|
||||||
23(@main(f1;vf2;vf3;vf4;vi2;): 2 Function None 17
|
|
||||||
18(inF1): 7(ptr) FunctionParameter
|
|
||||||
19(inF2): 9(ptr) FunctionParameter
|
|
||||||
20(inF3): 11(ptr) FunctionParameter
|
|
||||||
21(inF4): 13(ptr) FunctionParameter
|
|
||||||
22(inI2): 16(ptr) FunctionParameter
|
|
||||||
24: Label
|
|
||||||
28: 6(float) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 18(inF1) 27
|
|
||||||
32: 8(fvec2) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 19(inF2) 31
|
|
||||||
36: 10(fvec3) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 20(inF3) 35
|
|
||||||
39: 12(fvec4) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 21(inF4) 38
|
|
||||||
40: 15(ivec2) Load 22(inI2)
|
|
||||||
42: 15(ivec2) CompositeConstruct 41 41
|
|
||||||
43: 15(ivec2) ShiftLeftLogical 40 42
|
|
||||||
44: 15(ivec2) CompositeConstruct 41 41
|
|
||||||
45: 15(ivec2) ShiftRightArithmetic 43 44
|
|
||||||
46: 8(fvec2) ConvertSToF 45
|
|
||||||
47: 8(fvec2) VectorTimesScalar 46 30
|
|
||||||
48: 6(float) ExtInst 1(GLSL.std.450) 78(InterpolateAtOffset) 18(inF1) 47
|
|
||||||
Return
|
|
||||||
FunctionEnd
|
|
@ -1,10 +1,33 @@
|
|||||||
|
struct PS_INPUT
|
||||||
void main(float inF1, float2 inF2, float3 inF3, float4 inF4, int2 inI2) : COLOR
|
|
||||||
{
|
{
|
||||||
EvaluateAttributeSnapped(inF1, int2(8,15));
|
float2 vPos: TEXCOORD0;
|
||||||
EvaluateAttributeSnapped(inF2, int2(0,1));
|
};
|
||||||
EvaluateAttributeSnapped(inF3, int2(3,10));
|
|
||||||
EvaluateAttributeSnapped(inF4, int2(7,8));
|
|
||||||
|
|
||||||
EvaluateAttributeSnapped(inF1, inI2);
|
float4 main(float inF1, float2 inF2, float3 inF3, float4 inF4, int2 inI2, PS_INPUT i) : COLOR
|
||||||
|
{
|
||||||
|
float oF1 = EvaluateAttributeSnapped(inF1, int2(8,15));
|
||||||
|
float2 oF2 = EvaluateAttributeSnapped(inF2, int2(0,1));
|
||||||
|
float3 oF3 = EvaluateAttributeSnapped(inF3, int2(3,10));
|
||||||
|
float4 oF4 = EvaluateAttributeSnapped(inF4, int2(7,8));
|
||||||
|
|
||||||
|
oF1 += EvaluateAttributeSnapped(inF1, inI2);
|
||||||
|
|
||||||
|
oF1 += EvaluateAttributeAtSample(inF1, 3);
|
||||||
|
oF2 += EvaluateAttributeAtSample(inF2, 3);
|
||||||
|
oF3 += EvaluateAttributeAtSample(inF3, 3);
|
||||||
|
oF4 += EvaluateAttributeAtSample(inF4, 3);
|
||||||
|
|
||||||
|
oF1 += EvaluateAttributeAtSample(inF1, inI2.x);
|
||||||
|
|
||||||
|
oF1 += EvaluateAttributeAtCentroid(inF1);
|
||||||
|
oF2 += EvaluateAttributeAtCentroid(inF2);
|
||||||
|
oF3 += EvaluateAttributeAtCentroid(inF3);
|
||||||
|
oF4 += EvaluateAttributeAtCentroid(inF4);
|
||||||
|
|
||||||
|
oF2 += EvaluateAttributeSnapped(i.vPos, int2(0,1));
|
||||||
|
oF2 += EvaluateAttributeAtSample(i.vPos, 3);
|
||||||
|
oF2 += EvaluateAttributeAtCentroid(i.vPos);
|
||||||
|
|
||||||
|
float4 color = float4(oF1, oF2.y, oF3.z, oF4.w);
|
||||||
|
return color;
|
||||||
}
|
}
|
||||||
|
@ -6075,8 +6075,12 @@ void HlslParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fn
|
|||||||
case EOpInterpolateAtCentroid:
|
case EOpInterpolateAtCentroid:
|
||||||
case EOpInterpolateAtSample:
|
case EOpInterpolateAtSample:
|
||||||
case EOpInterpolateAtOffset:
|
case EOpInterpolateAtOffset:
|
||||||
|
// TODO(greg-lunarg): Re-enable this check. It currently gives false errors for builtins
|
||||||
|
// defined and passed as members of a struct. In this case the storage class is showing to be
|
||||||
|
// Function. See glslang #2584
|
||||||
|
|
||||||
// Make sure the first argument is an interpolant, or an array element of an interpolant
|
// Make sure the first argument is an interpolant, or an array element of an interpolant
|
||||||
if (arg0->getType().getQualifier().storage != EvqVaryingIn) {
|
// if (arg0->getType().getQualifier().storage != EvqVaryingIn) {
|
||||||
// It might still be an array element.
|
// It might still be an array element.
|
||||||
//
|
//
|
||||||
// We could check more, but the semantics of the first argument are already met; the
|
// We could check more, but the semantics of the first argument are already met; the
|
||||||
@ -6084,11 +6088,11 @@ void HlslParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fn
|
|||||||
//
|
//
|
||||||
// ES and desktop 4.3 and earlier: swizzles may not be used
|
// ES and desktop 4.3 and earlier: swizzles may not be used
|
||||||
// desktop 4.4 and later: swizzles may be used
|
// desktop 4.4 and later: swizzles may be used
|
||||||
const TIntermTyped* base = TIntermediate::findLValueBase(arg0, true);
|
// const TIntermTyped* base = TIntermediate::findLValueBase(arg0, true);
|
||||||
if (base == nullptr || base->getType().getQualifier().storage != EvqVaryingIn)
|
// if (base == nullptr || base->getType().getQualifier().storage != EvqVaryingIn)
|
||||||
error(loc, "first argument must be an interpolant, or interpolant-array element",
|
// error(loc, "first argument must be an interpolant, or interpolant-array element",
|
||||||
fnCandidate.getName().c_str(), "");
|
// fnCandidate.getName().c_str(), "");
|
||||||
}
|
// }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -245,7 +245,6 @@ INSTANTIATE_TEST_SUITE_P(
|
|||||||
{"hlsl.isfinite.frag", "main"},
|
{"hlsl.isfinite.frag", "main"},
|
||||||
{"hlsl.intrinsics.barriers.comp", "ComputeShaderFunction"},
|
{"hlsl.intrinsics.barriers.comp", "ComputeShaderFunction"},
|
||||||
{"hlsl.intrinsics.comp", "ComputeShaderFunction"},
|
{"hlsl.intrinsics.comp", "ComputeShaderFunction"},
|
||||||
{"hlsl.intrinsics.evalfns.frag", "main"},
|
|
||||||
{"hlsl.intrinsics.d3dcolortoubyte4.frag", "main"},
|
{"hlsl.intrinsics.d3dcolortoubyte4.frag", "main"},
|
||||||
{"hlsl.intrinsics.double.frag", "PixelShaderFunction"},
|
{"hlsl.intrinsics.double.frag", "PixelShaderFunction"},
|
||||||
{"hlsl.intrinsics.f1632.frag", "main"},
|
{"hlsl.intrinsics.f1632.frag", "main"},
|
||||||
@ -471,6 +470,7 @@ INSTANTIATE_TEST_SUITE_P(
|
|||||||
{"hlsl.flattenOpaqueInitMix.vert", "main"},
|
{"hlsl.flattenOpaqueInitMix.vert", "main"},
|
||||||
{"hlsl.flattenSubset.frag", "main"},
|
{"hlsl.flattenSubset.frag", "main"},
|
||||||
{"hlsl.flattenSubset2.frag", "main"},
|
{"hlsl.flattenSubset2.frag", "main"},
|
||||||
|
{"hlsl.intrinsics.evalfns.frag", "main"},
|
||||||
{"hlsl.partialFlattenLocal.vert", "main"},
|
{"hlsl.partialFlattenLocal.vert", "main"},
|
||||||
{"hlsl.partialFlattenMixed.vert", "main"}
|
{"hlsl.partialFlattenMixed.vert", "main"}
|
||||||
}),
|
}),
|
||||||
|
@ -5,14 +5,14 @@
|
|||||||
"site" : "github",
|
"site" : "github",
|
||||||
"subrepo" : "KhronosGroup/SPIRV-Tools",
|
"subrepo" : "KhronosGroup/SPIRV-Tools",
|
||||||
"subdir" : "External/spirv-tools",
|
"subdir" : "External/spirv-tools",
|
||||||
"commit" : "c79edd260c2b503f0eca57310057b4a100999cc5"
|
"commit" : "48007a5c7f7cc671b391bebd46e87fd6edc6c24b"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name" : "spirv-tools/external/spirv-headers",
|
"name" : "spirv-tools/external/spirv-headers",
|
||||||
"site" : "github",
|
"site" : "github",
|
||||||
"subrepo" : "KhronosGroup/SPIRV-Headers",
|
"subrepo" : "KhronosGroup/SPIRV-Headers",
|
||||||
"subdir" : "External/spirv-tools/external/spirv-headers",
|
"subdir" : "External/spirv-tools/external/spirv-headers",
|
||||||
"commit" : "75b30a659c8a4979104986652c54cc421fc51129"
|
"commit" : "f88a1f98fa7a44ccfcf33d810c72b200e7d9a78a"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user