summaryrefslogtreecommitdiffstats
path: root/Graphics
diff options
context:
space:
mode:
authorassiduous <assiduous@diligentgraphics.com>2020-11-07 06:53:33 +0000
committerassiduous <assiduous@diligentgraphics.com>2020-11-07 06:53:33 +0000
commit01aad5aee954e7c1e9494dcc98af8eba3901e3d8 (patch)
treeeb193b9ce8cca95884c804f694ebc3ba2096f7c1 /Graphics
parentFew more minor updates to parameter validation in device context (diff)
downloadDiligentCore-01aad5aee954e7c1e9494dcc98af8eba3901e3d8.tar.gz
DiligentCore-01aad5aee954e7c1e9494dcc98af8eba3901e3d8.zip
Updated handling of BLASTriangleDesc::VertexValueType and VertexComponentCount
Diffstat (limited to 'Graphics')
-rw-r--r--Graphics/GraphicsEngine/interface/BottomLevelAS.h13
-rw-r--r--Graphics/GraphicsEngine/src/BottomLevelASBase.cpp10
-rw-r--r--Graphics/GraphicsEngineD3D12/src/BottomLevelASD3D12Impl.cpp25
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;
}