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:
Greg Fischer 2021-03-31 15:24:48 -06:00
parent 6dc24ffa47
commit 7fbaca0d06
8 changed files with 163 additions and 305 deletions

View file

@ -1,10 +1,33 @@
void main(float inF1, float2 inF2, float3 inF3, float4 inF4, int2 inI2) : COLOR
struct PS_INPUT
{
EvaluateAttributeSnapped(inF1, int2(8,15));
EvaluateAttributeSnapped(inF2, int2(0,1));
EvaluateAttributeSnapped(inF3, int2(3,10));
EvaluateAttributeSnapped(inF4, int2(7,8));
float2 vPos: TEXCOORD0;
};
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;
}