diff options
| author | assiduous <assiduous@diligentgraphics.com> | 2020-11-07 06:53:33 +0000 |
|---|---|---|
| committer | assiduous <assiduous@diligentgraphics.com> | 2020-11-07 06:53:33 +0000 |
| commit | 01aad5aee954e7c1e9494dcc98af8eba3901e3d8 (patch) | |
| tree | eb193b9ce8cca95884c804f694ebc3ba2096f7c1 /Graphics | |
| parent | Few more minor updates to parameter validation in device context (diff) | |
| download | DiligentCore-01aad5aee954e7c1e9494dcc98af8eba3901e3d8.tar.gz DiligentCore-01aad5aee954e7c1e9494dcc98af8eba3901e3d8.zip | |
Updated handling of BLASTriangleDesc::VertexValueType and VertexComponentCount
Diffstat (limited to 'Graphics')
| -rw-r--r-- | Graphics/GraphicsEngine/interface/BottomLevelAS.h | 13 | ||||
| -rw-r--r-- | Graphics/GraphicsEngine/src/BottomLevelASBase.cpp | 10 | ||||
| -rw-r--r-- | Graphics/GraphicsEngineD3D12/src/BottomLevelASD3D12Impl.cpp | 25 |
3 files changed, 35 insertions, 13 deletions
diff --git a/Graphics/GraphicsEngine/interface/BottomLevelAS.h b/Graphics/GraphicsEngine/interface/BottomLevelAS.h index bd80e3e4..c93319da 100644 --- a/Graphics/GraphicsEngine/interface/BottomLevelAS.h +++ b/Graphics/GraphicsEngine/interface/BottomLevelAS.h @@ -58,15 +58,24 @@ struct BLASTriangleDesc Uint32 MaxVertexCount DEFAULT_INITIALIZER(0); /// The type of vertices in this geometry, see Diligent::VALUE_TYPE. + + /// \remarks Only the following combinations of VertexValueType and VertexComponentCount + /// are allowed: + /// * FLOAT32 x 2 (third component is assumed 0) + /// * FLOAT32 x 3 + /// * FLOAT16 x 2 (third component is assumed 0) + /// * FLOAT16 x 4 (fourth component is ignored) + /// * INT16 x 2 (16-bit signed-normalized, third component is assumed 0) + /// * INT16 x 4 (16-bit signed-normalized, fourth component is ignored) VALUE_TYPE VertexValueType DEFAULT_INITIALIZER(VT_UNDEFINED); /// The number of components in the vertex. - /// 2 and 3 are supported. + /// See VertexValueType for the list of allowed VertexValueType and VertexComponentCount combinations. Uint8 VertexComponentCount DEFAULT_INITIALIZER(0); /// The maximum primitive count in this geometry. /// The current number of primitives is defined in BLASBuildTriangleData::PrimitiveCount. - Uint32 MaxPrimitiveCount DEFAULT_INITIALIZER(0); + Uint32 MaxPrimitiveCount DEFAULT_INITIALIZER(0); /// Index type of this geometry, see Diligent::VALUE_TYPE. /// Must be VT_UINT16, VT_UINT32 or VT_UNDEFINED. diff --git a/Graphics/GraphicsEngine/src/BottomLevelASBase.cpp b/Graphics/GraphicsEngine/src/BottomLevelASBase.cpp index 46d82244..c0e8f058 100644 --- a/Graphics/GraphicsEngine/src/BottomLevelASBase.cpp +++ b/Graphics/GraphicsEngine/src/BottomLevelASBase.cpp @@ -63,11 +63,11 @@ void ValidateBottomLevelASDesc(const BottomLevelASDesc& Desc) noexcept(false) if (tri.GeometryName == nullptr) LOG_BLAS_ERROR_AND_THROW("pTriangles[", i, "].GeometryName must not be null"); - if (tri.VertexValueType >= VT_NUM_TYPES) - LOG_BLAS_ERROR_AND_THROW("pTriangles[", i, "].VertexValueType must be a valid type"); - - if (tri.VertexComponentCount != 2 && tri.VertexComponentCount != 3) - LOG_BLAS_ERROR_AND_THROW("pTriangles[", i, "].VertexComponentCount must be 2 or 3"); + if (!((tri.VertexValueType == VT_FLOAT32 && (tri.VertexComponentCount == 2 || tri.VertexComponentCount == 3)) || + (tri.VertexValueType == VT_FLOAT16 && (tri.VertexComponentCount == 2 || tri.VertexComponentCount == 4)) || + (tri.VertexValueType == VT_INT16 && (tri.VertexComponentCount == 2 || tri.VertexComponentCount == 4)))) + LOG_BLAS_ERROR_AND_THROW("pTriangles[", i, "].VertexValueType (", GetValueTypeString(tri.VertexValueType), + ") and .VertexComponentCount (", tri.VertexComponentCount, ") is not a valid combination"); if (tri.MaxVertexCount == 0) LOG_BLAS_ERROR_AND_THROW("pTriangles[", i, "].MaxVertexCount must be greater than 0"); diff --git a/Graphics/GraphicsEngineD3D12/src/BottomLevelASD3D12Impl.cpp b/Graphics/GraphicsEngineD3D12/src/BottomLevelASD3D12Impl.cpp index 02e45b0e..5bb182dc 100644 --- a/Graphics/GraphicsEngineD3D12/src/BottomLevelASD3D12Impl.cpp +++ b/Graphics/GraphicsEngineD3D12/src/BottomLevelASD3D12Impl.cpp @@ -68,12 +68,25 @@ BottomLevelASD3D12Impl::BottomLevelASD3D12Impl(IReferenceCounters* pRef dst.Flags = D3D12_RAYTRACING_GEOMETRY_FLAG_NONE; dst.Triangles.VertexBuffer.StartAddress = 0; dst.Triangles.VertexBuffer.StrideInBytes = 0; - dst.Triangles.VertexFormat = TypeToDXGI_Format(src.VertexValueType, src.VertexComponentCount, src.VertexValueType < VT_FLOAT16); - dst.Triangles.VertexCount = src.MaxVertexCount; - dst.Triangles.IndexCount = src.IndexType == VT_UNDEFINED ? 0 : src.MaxPrimitiveCount * 3; - dst.Triangles.IndexFormat = ValueTypeToIndexType(src.IndexType); - dst.Triangles.IndexBuffer = 0; - dst.Triangles.Transform3x4 = 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. + 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"); + + dst.Triangles.VertexCount = src.MaxVertexCount; + dst.Triangles.IndexCount = src.IndexType == VT_UNDEFINED ? 0 : src.MaxPrimitiveCount * 3; + dst.Triangles.IndexFormat = ValueTypeToIndexType(src.IndexType); + dst.Triangles.IndexBuffer = 0; + dst.Triangles.Transform3x4 = 0; MaxPrimitiveCount += src.MaxPrimitiveCount; } |
