From 482eabf651e5b79acb5db8cabf7baf9e92806a34 Mon Sep 17 00:00:00 2001 From: Dynamitos Date: Tue, 15 Apr 2025 00:33:49 +0200 Subject: [PATCH] Fixing shader refactor --- external/vcpkg | 2 +- res/shaders/DepthCullingMesh.slang | 10 +++++----- res/shaders/DepthCullingTask.slang | 4 ++-- res/shaders/DrawListMesh.slang | 10 +++++----- res/shaders/DrawListTask.slang | 4 ++-- res/shaders/lib/Scene.slang | 21 +++++++++++++-------- res/shaders/raytracing/AnyHit.slang | 4 ++-- res/shaders/raytracing/ClosestHit.slang | 4 ++-- 8 files changed, 32 insertions(+), 27 deletions(-) diff --git a/external/vcpkg b/external/vcpkg index 0bf1354..f9a99aa 160000 --- a/external/vcpkg +++ b/external/vcpkg @@ -1 +1 @@ -Subproject commit 0bf1354d6704ec797acea686d0250afc4036a082 +Subproject commit f9a99aa79c1309001e36572fa42d7d8edebfc451 diff --git a/res/shaders/DepthCullingMesh.slang b/res/shaders/DepthCullingMesh.slang index 1e2e84a..9219d8b 100644 --- a/res/shaders/DepthCullingMesh.slang +++ b/res/shaders/DepthCullingMesh.slang @@ -28,13 +28,13 @@ void meshMain( InstanceData inst = pScene.instances[meshPayload.instanceId]; MeshletDescription m = pScene.meshletInfos[meshPayload.meshletOffset + meshletNumber]; MeshletCullingInfo cull = pScene.cullingInfos[meshletId]; - SetMeshOutputCounts(m.vertexCount, m.primitiveCount); + SetMeshOutputCounts(m.vertexIndices.size, m.primitiveIndices.size); for(uint i = threadID; i < MAX_PRIMITIVES; i += MESH_GROUP_SIZE) { - uint p = min(i, m.primitiveCount - 1); + uint p = min(i, m.primitiveIndices.size - 1); { - uint baseIndex = m.primitiveOffset + (p * 3); + uint baseIndex = m.primitiveIndices.offset + (p * 3); uint local_idx0 = pScene.primitiveIndices[baseIndex + 0]; uint local_idx1 = pScene.primitiveIndices[baseIndex + 1]; uint local_idx2 = pScene.primitiveIndices[baseIndex + 2]; @@ -48,9 +48,9 @@ void meshMain( } for(uint i = threadID; i < MAX_VERTICES; i += MESH_GROUP_SIZE) { - uint v = min(i, m.vertexCount - 1); + uint v = min(i, m.vertexIndices.size - 1); { - uint vertexIndex = pScene.vertexIndices[m.vertexOffset + v]; + uint vertexIndex = pScene.vertexIndices[m.vertexIndices.offset + v]; VertexAttributes attr = pVertexData.getAttributes(m.indicesOffset + vertexIndex); vertices[v] = attr.getParameter(inst.transformMatrix, inst.inverseTransformMatrix); } diff --git a/res/shaders/DepthCullingTask.slang b/res/shaders/DepthCullingTask.slang index 951f280..f122494 100644 --- a/res/shaders/DepthCullingTask.slang +++ b/res/shaders/DepthCullingTask.slang @@ -88,7 +88,7 @@ void taskMain( instance = pScene.instances[pOffsets.instanceOffset + groupID]; mesh = pScene.meshData[pOffsets.instanceOffset + groupID]; p.instanceId = pOffsets.instanceOffset + groupID; - p.meshletOffset = mesh.meshletOffset; + p.meshletOffset = mesh.meshletRange.offset; p.cullingOffset = pScene.cullingOffsets[p.instanceId]; modelViewProjection = mul(pViewParams.viewProjectionMatrix, instance.transformMatrix); float3 origin = viewToModel(instance.inverseTransformMatrix, float4(0, 0, 0, 1)).xyz; @@ -113,7 +113,7 @@ void taskMain( { return; } - for (uint i = threadID; i < mesh.numMeshlets; i += TASK_GROUP_SIZE) + for (uint i = threadID; i < mesh.meshletRange.size; i += TASK_GROUP_SIZE) { uint m = p.meshletOffset + i; uint cull = p.cullingOffset + i; diff --git a/res/shaders/DrawListMesh.slang b/res/shaders/DrawListMesh.slang index 84b9d95..91ff524 100644 --- a/res/shaders/DrawListMesh.slang +++ b/res/shaders/DrawListMesh.slang @@ -29,13 +29,13 @@ void meshMain( InstanceData inst = pScene.instances[meshPayload.instanceId]; MeshletDescription m = pScene.meshletInfos[meshPayload.meshletOffset + meshletNumber]; MeshletCullingInfo cull = pScene.cullingInfos[meshletId]; - SetMeshOutputCounts(m.vertexCount, m.primitiveCount); + SetMeshOutputCounts(m.vertexIndices.size, m.primitiveIndices.size); for(uint i = threadID; i < MAX_PRIMITIVES; i += MESH_GROUP_SIZE) { - uint p = min(i, m.primitiveCount - 1); + uint p = min(i, m.primitiveIndices.size - 1); { - uint baseIndex = m.primitiveOffset + (p * 3); + uint baseIndex = m.primitiveIndices.offset + (p * 3); uint local_idx0 = pScene.primitiveIndices[baseIndex + 0]; uint local_idx1 = pScene.primitiveIndices[baseIndex + 1]; uint local_idx2 = pScene.primitiveIndices[baseIndex + 2]; @@ -50,9 +50,9 @@ void meshMain( } for(uint i = threadID; i < MAX_VERTICES; i += MESH_GROUP_SIZE) { - uint v = min(i, m.vertexCount - 1); + uint v = min(i, m.vertexIndices.size - 1); { - uint vertexIndex = pScene.vertexIndices[m.vertexOffset + v]; + uint vertexIndex = pScene.vertexIndices[m.vertexIndices.offset + v]; VertexAttributes attr = pVertexData.getAttributes(m.indicesOffset + vertexIndex); vertices[v] = attr.getParameter(inst.transformMatrix, inst.inverseTransformMatrix); } diff --git a/res/shaders/DrawListTask.slang b/res/shaders/DrawListTask.slang index f3b10d6..f74f9ab 100644 --- a/res/shaders/DrawListTask.slang +++ b/res/shaders/DrawListTask.slang @@ -16,11 +16,11 @@ void taskMain( head = 0; mesh = pScene.meshData[pOffsets.instanceOffset + groupID]; p.instanceId = pOffsets.instanceOffset + groupID; - p.meshletOffset = mesh.meshletOffset; + p.meshletOffset = mesh.meshletRange.offset; p.cullingOffset = pScene.cullingOffsets[p.instanceId]; } GroupMemoryBarrierWithGroupSync(); - for (uint i = threadID; i < mesh.numMeshlets; i += TASK_GROUP_SIZE) + for (uint i = threadID; i < mesh.meshletRange.size; i += TASK_GROUP_SIZE) { uint m = p.meshletOffset + i; uint cull = p.cullingOffset + i; diff --git a/res/shaders/lib/Scene.slang b/res/shaders/lib/Scene.slang index 9179579..3fcba9a 100644 --- a/res/shaders/lib/Scene.slang +++ b/res/shaders/lib/Scene.slang @@ -1,12 +1,18 @@ import Bounding; +struct PoolRange +{ + uint32_t offset; + uint32_t size; +}; + struct MeshletDescription { AABB bounding; - uint32_t vertexCount; - uint32_t primitiveCount; - uint32_t vertexOffset; - uint32_t primitiveOffset; + // range into vertexIndices array + PoolRange vertexIndices; + // range into primitiveIndices array + PoolRange primitiveIndices; float3 color; uint32_t indicesOffset; }; @@ -14,10 +20,9 @@ struct MeshletDescription struct MeshData { AABB bounding; - uint32_t numMeshlets; - uint32_t meshletOffset; - uint32_t firstIndex; - uint32_t numIndices; + PoolRange meshletRange; + // offset into the global index buffer + PoolRange indicesRange; }; static const uint32_t MAX_VERTICES = 256; diff --git a/res/shaders/raytracing/AnyHit.slang b/res/shaders/raytracing/AnyHit.slang index d34209e..c9eb36d 100644 --- a/res/shaders/raytracing/AnyHit.slang +++ b/res/shaders/raytracing/AnyHit.slang @@ -13,9 +13,9 @@ void anyhit(inout RayPayload hitValue, in BuiltInTriangleIntersectionAttributes MeshData m = pScene.meshData[InstanceID()]; // offset into the index buffer - uint indexOffset = m.firstIndex; + uint indexOffset = m.indicesRange.offset; // added to indices to reference correct part of global mesh pool - uint vertexOffset = pScene.meshletInfos[m.meshletOffset].indicesOffset; + uint vertexOffset = pScene.meshletInfos[m.meshletRange.offset].indicesOffset; uint vertexIndex0 = vertexOffset + pRayTracingParams.indexBuffer[indexOffset + 3 * PrimitiveIndex() + 0]; uint vertexIndex1 = vertexOffset + pRayTracingParams.indexBuffer[indexOffset + 3 * PrimitiveIndex() + 1]; diff --git a/res/shaders/raytracing/ClosestHit.slang b/res/shaders/raytracing/ClosestHit.slang index 6bb43aa..758bdf9 100644 --- a/res/shaders/raytracing/ClosestHit.slang +++ b/res/shaders/raytracing/ClosestHit.slang @@ -90,9 +90,9 @@ void closestHit(inout RayPayload hitValue, in BuiltInTriangleIntersectionAttribu MeshData m = pScene.meshData[InstanceID()]; // offset into the index buffer - uint indexOffset = m.firstIndex; + uint indexOffset = m.indicesRange.offset; // added to indices to reference correct part of global mesh pool - uint vertexOffset = pScene.meshletInfos[m.meshletOffset].indicesOffset; + uint vertexOffset = pScene.meshletInfos[m.meshletRange.offset].indicesOffset; uint vertexIndex0 = vertexOffset + pRayTracingParams.indexBuffer[indexOffset + 3 * PrimitiveIndex() + 0]; uint vertexIndex1 = vertexOffset + pRayTracingParams.indexBuffer[indexOffset + 3 * PrimitiveIndex() + 1];