summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineD3D12
diff options
context:
space:
mode:
authorassiduous <assiduous@diligentgraphics.com>2020-11-07 17:35:22 +0000
committerassiduous <assiduous@diligentgraphics.com>2020-11-07 17:35:22 +0000
commitfee27bd45c5451d1a3b7ef35f1c83f45f7e60f7c (patch)
tree5e7b900387c28e2d709b550cae0483bbadc5b6ec /Graphics/GraphicsEngineD3D12
parentBLASTriangleDesc: fixed VertexValueType and VertexComponentCount handling (diff)
downloadDiligentCore-fee27bd45c5451d1a3b7ef35f1c83f45f7e60f7c.tar.gz
DiligentCore-fee27bd45c5451d1a3b7ef35f1c83f45f7e60f7c.zip
Corrected ray rtacing vertex format handling in D3D12
Diffstat (limited to 'Graphics/GraphicsEngineD3D12')
-rw-r--r--Graphics/GraphicsEngineD3D12/include/D3D12TypeConversions.hpp2
-rw-r--r--Graphics/GraphicsEngineD3D12/src/BottomLevelASD3D12Impl.cpp44
-rw-r--r--Graphics/GraphicsEngineD3D12/src/D3D12TypeConversions.cpp54
-rw-r--r--Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp3
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;