Fix vulkan postvs output with components

This commit is contained in:
baldurk
2020-04-24 16:39:26 +01:00
parent 4dc0d799db
commit 76a866a5c2
3 changed files with 46 additions and 13 deletions
+13 -4
View File
@@ -165,7 +165,14 @@ static void ConvertToMeshOutputCompute(const ShaderReflection &refl, const SPIRV
{
editor.Remove(it);
}
else if(decorate.decoration == rdcspv::Decoration::Location)
// same with flat/noperspective
else if(decorate.decoration == rdcspv::Decoration::Flat ||
decorate.decoration == rdcspv::Decoration::NoPerspective)
{
editor.Remove(it);
}
else if(decorate.decoration == rdcspv::Decoration::Location ||
decorate.decoration == rdcspv::Decoration::Component)
{
// we don't have to do anything, the ID mapping is in the rdcspv::PatchData, so just discard
// the location information
@@ -1025,6 +1032,8 @@ static void ConvertToMeshOutputCompute(const ShaderReflection &refl, const SPIRV
rdcspv::Id result =
ops.add(rdcspv::OpImageFetch(ins[i].vec4ID, editor.MakeId(), rawimg, idx));
uint32_t comp = Bits::CountTrailingZeroes(uint32_t(refl.inputSignature[i].regChannelMask));
if(refl.inputSignature[i].compType == CompType::Double)
{
// since doubles are packed into two uints, we now need to fetch more data and do
@@ -1081,8 +1090,8 @@ static void ConvertToMeshOutputCompute(const ShaderReflection &refl, const SPIRV
// for one component, extract x
// baseType value = result.x;
result =
ops.add(rdcspv::OpCompositeExtract(ins[i].basetypeID, editor.MakeId(), result, {0}));
result = ops.add(
rdcspv::OpCompositeExtract(ins[i].basetypeID, editor.MakeId(), result, {comp}));
}
else if(refl.inputSignature[i].compCount != 4)
{
@@ -1091,7 +1100,7 @@ static void ConvertToMeshOutputCompute(const ShaderReflection &refl, const SPIRV
rdcarray<uint32_t> swizzle;
for(uint32_t c = 0; c < refl.inputSignature[i].compCount; c++)
swizzle.push_back(c);
swizzle.push_back(c + comp);
// baseTypeN value = result.xyz;
result = ops.add(rdcspv::OpVectorShuffle(ins[i].basetypeID, editor.MakeId(), result,
+20 -6
View File
@@ -48,7 +48,9 @@ RD_TEST(VK_Vertex_Attr_Zoo, VulkanGraphicsTest)
layout(location = 0) in vec4 InSNorm;
layout(location = 1) in vec4 InUNorm;
layout(location = 2) in vec4 InUScaled;
layout(location = 3) in uvec4 InUInt;
layout(location = 3) in uvec2 InUInt;
layout(location = 3, component = 2) in uint InUInt1;
layout(location = 3, component = 3) in uint InUInt2;
layout(location = 4) in dvec2 InDouble;
layout(location = 5) in vec2 InArray[2];
layout(location = 7) in mat2x2 InMatrix;
@@ -56,7 +58,9 @@ layout(location = 7) in mat2x2 InMatrix;
layout(location = 0) out vec4 OutSNorm;
layout(location = 1) out vec4 OutUNorm;
layout(location = 2) out vec4 OutUScaled;
layout(location = 3) out uvec4 OutUInt;
layout(location = 3) flat out uvec2 OutUInt;
layout(location = 3, component = 2) flat out uint OutUInt1;
layout(location = 3, component = 3) flat out uint OutUInt2;
layout(location = 4) out dvec2 OutDouble;
layout(location = 5) out vec2 OutArray[2];
layout(location = 7) out mat2x2 OutMatrix;
@@ -72,6 +76,8 @@ void main()
OutUScaled = InUScaled;
OutDouble = InDouble;
OutUInt = InUInt;
OutUInt1 = InUInt1;
OutUInt2 = InUInt2;
OutUNorm = InUNorm;
OutArray = InArray;
OutMatrix = InMatrix;
@@ -85,7 +91,9 @@ void main()
layout(location = 0) in vec4 InSNorm;
layout(location = 1) in vec4 InUNorm;
layout(location = 2) in vec4 InUScaled;
layout(location = 3) flat in uvec4 InUInt;
layout(location = 3) flat in uvec2 InUInt;
layout(location = 3, component = 2) flat in uint InUInt1;
layout(location = 3, component = 3) flat in uint InUInt2;
layout(location = 4) flat in dvec2 InDouble;
layout(location = 5) in vec2 InArray[2];
layout(location = 7) in mat2x2 InMatrix;
@@ -111,7 +119,7 @@ void main()
Color = vec4(0.3f, 0, 0, 1);
// Similar for UInt
if(InUInt.x > 65535 || InUInt.y > 65535 || InUInt.z > 65535 || InUInt.w > 65535)
if(InUInt.x > 65535 || InUInt.y > 65535 || InUInt1.x > 65535 || InUInt2.x > 65535)
Color = vec4(0.4f, 0, 0, 1);
// doubles are all in range [-10, 10]
@@ -130,7 +138,9 @@ layout(triangle_strip, max_vertices = 3) out;
layout(location = 0) in vec4 InSNorm[3];
layout(location = 1) in vec4 InUNorm[3];
layout(location = 2) in vec4 InUScaled[3];
layout(location = 3) in uvec4 InUInt[3];
layout(location = 3) flat in uvec2 InUInt[3];
layout(location = 3, component = 2) flat in uint InUInt1[3];
layout(location = 3, component = 3) flat in uint InUInt2[3];
layout(location = 4) in dvec2 InDouble[3];
layout(location = 5) in vec2 InArray[3][2];
layout(location = 7) in mat2x2 InMatrix[3];
@@ -138,7 +148,9 @@ layout(location = 7) in mat2x2 InMatrix[3];
layout(location = 0) out vec4 OutSNorm;
layout(location = 1) out vec4 OutUNorm;
layout(location = 2) out vec4 OutUScaled;
layout(location = 3) out uvec4 OutUInt;
layout(location = 3) flat out uvec2 OutUInt;
layout(location = 3, component = 2) flat out uint OutUInt1;
layout(location = 3, component = 3) flat out uint OutUInt2;
layout(location = 4) out dvec2 OutDouble;
layout(location = 5) out vec2 OutArray[2];
layout(location = 7) out mat2x2 OutMatrix;
@@ -153,6 +165,8 @@ void main()
OutUScaled = InUScaled[i];
OutDouble = InDouble[i];
OutUInt = InUInt[i];
OutUInt1 = InUInt1[i];
OutUInt2 = InUInt2[i];
OutUNorm = InUNorm[i];
OutArray = InArray[i];
OutMatrix = InMatrix[i];
+13 -3
View File
@@ -18,7 +18,9 @@ class VK_Vertex_Attr_Zoo(rdtest.TestCase):
'SNorm': [1.0, -1.0, 1.0, -1.0],
'UNorm': [12345.0/65535.0, 6789.0/65535.0, 1234.0/65535.0, 567.0/65535.0],
'UScaled': [12345.0, 6789.0, 1234.0, 567.0],
'UInt': [12345, 6789, 1234, 567],
'UInt': [12345, 6789],
'UInt1': [1234],
'UInt2': [567],
'Double': [9.8765432109, -5.6789012345],
'Array[0]': [1.0, 2.0],
'Array[1]': [3.0, 4.0],
@@ -29,7 +31,9 @@ class VK_Vertex_Attr_Zoo(rdtest.TestCase):
'SNorm': [32766.0/32767.0, -32766.0/32767.0, 16000.0/32767.0, -16000.0/32767.0],
'UNorm': [56.0/65535.0, 7890.0/65535.0, 123.0/65535.0, 4567.0/65535.0],
'UScaled': [56.0, 7890.0, 123.0, 4567.0],
'UInt': [56, 7890, 123, 4567],
'UInt': [56, 7890],
'UInt1': [123],
'UInt2': [4567],
'Double': [-7.89012345678, 6.54321098765],
'Array[0]': [11.0, 12.0],
'Array[1]': [13.0, 14.0],
@@ -40,7 +44,9 @@ class VK_Vertex_Attr_Zoo(rdtest.TestCase):
'SNorm': [5.0/32767.0, -5.0/32767.0, 0.0, 0.0],
'UNorm': [8765.0/65535.0, 43210.0/65535.0, 987.0/65535.0, 65432.0/65535.0],
'UScaled': [8765.0, 43210.0, 987.0, 65432.0],
'UInt': [8765, 43210, 987, 65432],
'UInt': [8765, 43210],
'UInt1': [987],
'UInt2': [65432],
'Double': [0.1234567890123, 4.5678901234],
'Array[0]': [21.0, 22.0],
'Array[1]': [23.0, 24.0],
@@ -54,8 +60,12 @@ class VK_Vertex_Attr_Zoo(rdtest.TestCase):
for idx in ref:
in_ref[idx] = {}
for key in ref[idx]:
if 'UInt' in key:
continue
in_ref[idx]['In' + key] = ref[idx][key]
in_ref[idx]['InUInt2'] = ref[idx]['UInt'] + ref[idx]['UInt1'] + ref[idx]['UInt2']
# Copy the ref values and prepend 'Out'
out_ref = {}
for idx in ref: