Fix decoding of integer vertex attributes

This commit is contained in:
baldurk
2020-05-21 15:43:45 +01:00
parent b468be50d3
commit e17532c4ed
2 changed files with 40 additions and 5 deletions
+35 -5
View File
@@ -3480,12 +3480,42 @@ ShaderDebugTrace *VulkanReplay::DebugVertex(uint32_t eventId, uint32_t vertid, u
}
else
{
FloatVector decoded = ConvertComponents(MakeResourceFormat(attr.format), data.data());
ResourceFormat fmt = MakeResourceFormat(attr.format);
val.f.x = decoded.x;
val.f.y = decoded.y;
val.f.z = decoded.z;
val.f.w = decoded.w;
// integer formats need to be read as-is, rather than converted to floats
if(fmt.compType == CompType::UInt || fmt.compType == CompType::SInt)
{
if(fmt.type == ResourceFormatType::R10G10B10A2)
{
// this is the only packed UINT format
Vec4u decoded = ConvertFromR10G10B10A2UInt(*(uint32_t *)data.data());
val.u.x = decoded.x;
val.u.y = decoded.y;
val.u.z = decoded.z;
val.u.w = decoded.w;
}
else
{
for(uint32_t i = 0; i < fmt.compCount; i++)
{
const byte *src = data.data() + i * fmt.compByteWidth;
if(fmt.compByteWidth == 8)
memcpy(&val.u64v[i], src, fmt.compByteWidth);
else
memcpy(&val.uv[i], src, fmt.compByteWidth);
}
}
}
else
{
FloatVector decoded = ConvertComponents(fmt, data.data());
val.f.x = decoded.x;
val.f.y = decoded.y;
val.f.z = decoded.z;
val.f.w = decoded.w;
}
}
}
+5
View File
@@ -36,6 +36,11 @@ inline Vec4f ConvertFromR10G10B10A2(uint32_t data)
float((data >> 20) & 0x3ff) / 1023.0f, float((data >> 30) & 0x003) / 3.0f);
}
inline Vec4u ConvertFromR10G10B10A2UInt(uint32_t data)
{
return Vec4u((data >> 0) & 0x3ff, (data >> 10) & 0x3ff, (data >> 20) & 0x3ff, (data >> 30) & 0x003);
}
inline Vec4f ConvertFromR10G10B10A2SNorm(uint32_t data)
{
int r = int(data >> 0) & 0x3ff;