diff options
| author | assiduous <assiduous@diligentgraphics.com> | 2020-11-07 17:35:22 +0000 |
|---|---|---|
| committer | assiduous <assiduous@diligentgraphics.com> | 2020-11-07 17:35:22 +0000 |
| commit | fee27bd45c5451d1a3b7ef35f1c83f45f7e60f7c (patch) | |
| tree | 5e7b900387c28e2d709b550cae0483bbadc5b6ec /Graphics/GraphicsEngineD3D12 | |
| parent | BLASTriangleDesc: fixed VertexValueType and VertexComponentCount handling (diff) | |
| download | DiligentCore-fee27bd45c5451d1a3b7ef35f1c83f45f7e60f7c.tar.gz DiligentCore-fee27bd45c5451d1a3b7ef35f1c83f45f7e60f7c.zip | |
Corrected ray rtacing vertex format handling in D3D12
Diffstat (limited to 'Graphics/GraphicsEngineD3D12')
4 files changed, 60 insertions, 43 deletions
diff --git a/Graphics/GraphicsEngineD3D12/include/D3D12TypeConversions.hpp b/Graphics/GraphicsEngineD3D12/include/D3D12TypeConversions.hpp index 8b1818f2..774fefcd 100644 --- a/Graphics/GraphicsEngineD3D12/include/D3D12TypeConversions.hpp +++ b/Graphics/GraphicsEngineD3D12/include/D3D12TypeConversions.hpp @@ -86,4 +86,6 @@ D3D12_RAYTRACING_INSTANCE_FLAGS InstanceFlagsToD3D12RTInstanceFlags(RAYTRACING_I D3D12_RAYTRACING_ACCELERATION_STRUCTURE_BUILD_FLAGS BuildASFlagsToD3D12ASBuildFlags(RAYTRACING_BUILD_AS_FLAGS Flags); D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE CopyASModeToD3D12ASCopyMode(COPY_AS_MODE Mode); +DXGI_FORMAT TypeToRayTracingVertexFormat(VALUE_TYPE ValueType, Uint32 ComponentCount); + } // namespace Diligent diff --git a/Graphics/GraphicsEngineD3D12/src/BottomLevelASD3D12Impl.cpp b/Graphics/GraphicsEngineD3D12/src/BottomLevelASD3D12Impl.cpp index 1aecb097..fa82ee9a 100644 --- a/Graphics/GraphicsEngineD3D12/src/BottomLevelASD3D12Impl.cpp +++ b/Graphics/GraphicsEngineD3D12/src/BottomLevelASD3D12Impl.cpp @@ -68,48 +68,8 @@ BottomLevelASD3D12Impl::BottomLevelASD3D12Impl(IReferenceCounters* pRef dst.Flags = D3D12_RAYTRACING_GEOMETRY_FLAG_NONE; dst.Triangles.VertexBuffer.StartAddress = 0; dst.Triangles.VertexBuffer.StrideInBytes = 0; - - // Vertex format must be one of the following (https://docs.microsoft.com/en-us/windows/win32/api/d3d12/ns-d3d12-d3d12_raytracing_geometry_triangles_desc): - // * DXGI_FORMAT_R32G32_FLOAT - third component is assumed 0 - // * DXGI_FORMAT_R32G32B32_FLOAT - // * DXGI_FORMAT_R16G16_FLOAT - third component is assumed 0 - // * 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. - // 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.VertexFormat = TypeToRayTracingVertexFormat(src.VertexValueType, src.VertexComponentCount); + VERIFY(dst.Triangles.VertexFormat != DXGI_FORMAT_UNKNOWN, "Unsupported combination of vertex value type and component count"); dst.Triangles.VertexCount = src.MaxVertexCount; dst.Triangles.IndexCount = src.IndexType == VT_UNDEFINED ? 0 : src.MaxPrimitiveCount * 3; dst.Triangles.IndexFormat = ValueTypeToIndexType(src.IndexType); diff --git a/Graphics/GraphicsEngineD3D12/src/D3D12TypeConversions.cpp b/Graphics/GraphicsEngineD3D12/src/D3D12TypeConversions.cpp index 12ece1da..e9ae5af6 100644 --- a/Graphics/GraphicsEngineD3D12/src/D3D12TypeConversions.cpp +++ b/Graphics/GraphicsEngineD3D12/src/D3D12TypeConversions.cpp @@ -695,4 +695,58 @@ D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE CopyASModeToD3D12ASCopyMode(CO } } +DXGI_FORMAT TypeToRayTracingVertexFormat(VALUE_TYPE ValueType, Uint32 ComponentCount) +{ + // Vertex format must be one of the following (https://docs.microsoft.com/en-us/windows/win32/api/d3d12/ns-d3d12-d3d12_raytracing_geometry_triangles_desc): + // * DXGI_FORMAT_R32G32_FLOAT - third component is assumed 0 + // * DXGI_FORMAT_R32G32B32_FLOAT + // * DXGI_FORMAT_R16G16_FLOAT - third component is assumed 0 + // * 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. + // Note that DXGI_FORMAT_R16G16B16A16_FLOAT and DXGI_FORMAT_R16G16B16A16_SNORM are merely workarounds for missing 16-bit 3-component DXGI formats + switch (ValueType) + { + case VT_FLOAT16: + switch (ComponentCount) + { + case 2: return DXGI_FORMAT_R16G16_FLOAT; + case 3: return DXGI_FORMAT_R16G16B16A16_FLOAT; + + default: + UNEXPECTED("Only 2 and 3 component vertex formats are expected"); + return DXGI_FORMAT_UNKNOWN; + } + break; + + case VT_FLOAT32: + switch (ComponentCount) + { + case 2: return DXGI_FORMAT_R32G32_FLOAT; + case 3: return DXGI_FORMAT_R32G32B32_FLOAT; + + default: + UNEXPECTED("Only 2 and 3 component vertex formats are expected"); + return DXGI_FORMAT_UNKNOWN; + } + break; + + case VT_INT16: + switch (ComponentCount) + { + case 2: return DXGI_FORMAT_R16G16_SNORM; + case 3: return DXGI_FORMAT_R16G16B16A16_SNORM; + + default: + UNEXPECTED("Only 2 and 3 component vertex formats are expected"); + return DXGI_FORMAT_UNKNOWN; + } + break; + + default: + UNEXPECTED(GetValueTypeString(ValueType), " is not a valid vertex component type"); + return DXGI_FORMAT_UNKNOWN; + } +} + } // namespace Diligent diff --git a/Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp b/Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp index 125c4d81..c78976ea 100644 --- a/Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp +++ b/Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp @@ -2315,7 +2315,8 @@ void DeviceContextD3D12Impl::BuildBLAS(const BuildBLASAttribs& Attribs) auto* const pVB = ValidatedCast<BufferD3D12Impl>(SrcTris.pVertexBuffer); // vertex format in SrcTris may be undefined, so use vertex format from description - d3d12Tris.VertexFormat = TypeToDXGI_Format(TriDesc.VertexValueType, TriDesc.VertexComponentCount, TriDesc.VertexValueType < VT_FLOAT16); + d3d12Tris.VertexFormat = TypeToRayTracingVertexFormat(TriDesc.VertexValueType, TriDesc.VertexComponentCount); + VERIFY(d3d12Tris.VertexFormat != DXGI_FORMAT_UNKNOWN, "Unsupported combination of vertex value type and component count"); d3d12Tris.VertexCount = SrcTris.VertexCount; d3d12Tris.VertexBuffer.StartAddress = pVB->GetGPUAddress() + SrcTris.VertexOffset; d3d12Tris.VertexBuffer.StrideInBytes = SrcTris.VertexStride; |
