From bc359543f2023a325957cdff9153eee11c2af501 Mon Sep 17 00:00:00 2001 From: assiduous Date: Sat, 7 Nov 2020 00:34:35 -0800 Subject: BLASTriangleDesc: fixed VertexValueType and VertexComponentCount handling --- .../src/BottomLevelASD3D12Impl.cpp | 38 +++++++++++++++++++--- 1 file changed, 33 insertions(+), 5 deletions(-) (limited to 'Graphics/GraphicsEngineD3D12') diff --git a/Graphics/GraphicsEngineD3D12/src/BottomLevelASD3D12Impl.cpp b/Graphics/GraphicsEngineD3D12/src/BottomLevelASD3D12Impl.cpp index 5bb182dc..1aecb097 100644 --- a/Graphics/GraphicsEngineD3D12/src/BottomLevelASD3D12Impl.cpp +++ b/Graphics/GraphicsEngineD3D12/src/BottomLevelASD3D12Impl.cpp @@ -76,11 +76,39 @@ BottomLevelASD3D12Impl::BottomLevelASD3D12Impl(IReferenceCounters* pRef // * DXGI_FORMAT_R16G16B16A16_FLOAT - A16 component is ignored, other data can be packed there, such as setting vertex stride to 6 bytes. // * DXGI_FORMAT_R16G16_SNORM - third component is assumed 0 // * DXGI_FORMAT_R16G16B16A16_SNORM - A16 component is ignored, other data can be packed there, such as setting vertex stride to 6 bytes. - dst.Triangles.VertexFormat = TypeToDXGI_Format(src.VertexValueType, src.VertexComponentCount, src.VertexValueType < VT_FLOAT16); - VERIFY(dst.Triangles.VertexFormat == DXGI_FORMAT_R32G32_FLOAT || dst.Triangles.VertexFormat == DXGI_FORMAT_R32G32B32_FLOAT || - dst.Triangles.VertexFormat == DXGI_FORMAT_R16G16_FLOAT || dst.Triangles.VertexFormat == DXGI_FORMAT_R16G16B16A16_FLOAT || - dst.Triangles.VertexFormat == DXGI_FORMAT_R16G16_SNORM || dst.Triangles.VertexFormat == DXGI_FORMAT_R16G16B16A16_SNORM, - "Unsupported vertex format"); + // Note that DXGI_FORMAT_R16G16B16A16_FLOAT and DXGI_FORMAT_R16G16B16A16_SNORM are workarounds for missing 16-bit 3-component DXGI formats + switch (src.VertexValueType) + { + case VT_FLOAT16: + switch (src.VertexComponentCount) + { + case 2: dst.Triangles.VertexFormat = DXGI_FORMAT_R16G16_FLOAT; break; + case 3: dst.Triangles.VertexFormat = DXGI_FORMAT_R16G16B16A16_FLOAT; break; + default: UNEXPECTED("Only 2 and 3 component vertex formats are expected"); + } + break; + + case VT_FLOAT32: + switch (src.VertexComponentCount) + { + case 2: dst.Triangles.VertexFormat = DXGI_FORMAT_R32G32_FLOAT; break; + case 3: dst.Triangles.VertexFormat = DXGI_FORMAT_R32G32B32_FLOAT; break; + default: UNEXPECTED("Only 2 and 3 component vertex formats are expected"); + } + break; + + case VT_INT16: + switch (src.VertexComponentCount) + { + case 2: dst.Triangles.VertexFormat = DXGI_FORMAT_R16G16_SNORM; break; + case 3: dst.Triangles.VertexFormat = DXGI_FORMAT_R16G16B16A16_SNORM; break; + default: UNEXPECTED("Only 2 and 3 component vertex formats are expected"); + } + break; + + default: + UNEXPECTED(GetValueTypeString(src.VertexValueType), " is not a valid vertex component type"); + } dst.Triangles.VertexCount = src.MaxVertexCount; dst.Triangles.IndexCount = src.IndexType == VT_UNDEFINED ? 0 : src.MaxPrimitiveCount * 3; -- cgit v1.2.3