Browse Source

Move GpuMeshLod to a separate structured buffer

Panagiotis Christopoulos Charitos 1 year ago
parent
commit
5e08cc3339

+ 1 - 0
AnKi/Renderer/Utils/Drawer.cpp

@@ -66,6 +66,7 @@ void RenderableDrawer::setState(const RenderableDrawerArguments& args, CommandBu
 	cmdb.bindUavBuffer(U32(MaterialSet::kGlobal), U32(MaterialBinding::kTaskShaderPayloads), args.m_taskShaderPayloadsBuffer);
 	cmdb.bindUavBuffer(U32(MaterialSet::kGlobal), U32(MaterialBinding::kRenderables),
 					   GpuSceneArrays::Renderable::getSingleton().getBufferOffsetRange());
+	cmdb.bindUavBuffer(U32(MaterialSet::kGlobal), U32(MaterialBinding::kMeshLods), GpuSceneArrays::MeshLod::getSingleton().getBufferOffsetRange());
 	cmdb.bindTexture(U32(MaterialSet::kGlobal), U32(MaterialBinding::kHzbTexture),
 					 (args.m_hzbTexture) ? args.m_hzbTexture : &getRenderer().getDummyTextureView2d());
 	cmdb.bindSampler(U32(MaterialSet::kGlobal), U32(MaterialBinding::kNearestClampSampler), getRenderer().getSamplers().m_nearestNearestClamp.get());

+ 19 - 17
AnKi/Renderer/Utils/GpuVisibility.cpp

@@ -300,15 +300,16 @@ void GpuVisibility::populateRenderGraphInternal(Bool distanceBased, BaseGpuVisib
 
 		cmdb.bindUavBuffer(0, 0, aabbsBuffer);
 		cmdb.bindUavBuffer(0, 1, GpuSceneArrays::Renderable::getSingleton().getBufferOffsetRange());
-		cmdb.bindUavBuffer(0, 2, GpuSceneBuffer::getSingleton().getBufferOffsetRange());
-		cmdb.bindUavBuffer(0, 3, instanceRateRenderables);
-		cmdb.bindUavBuffer(0, 4, indirectArgs);
-		cmdb.bindUavBuffer(0, 5, mdiDrawCountsBuffer);
-		cmdb.bindUavBuffer(0, 6, taskShaderIndirectArgsBuff);
-		cmdb.bindUavBuffer(0, 7, taskShaderPayloadBuffer);
+		cmdb.bindUavBuffer(0, 2, GpuSceneArrays::MeshLod::getSingleton().getBufferOffsetRange());
+		cmdb.bindUavBuffer(0, 3, GpuSceneBuffer::getSingleton().getBufferOffsetRange());
+		cmdb.bindUavBuffer(0, 4, instanceRateRenderables);
+		cmdb.bindUavBuffer(0, 5, indirectArgs);
+		cmdb.bindUavBuffer(0, 6, mdiDrawCountsBuffer);
+		cmdb.bindUavBuffer(0, 7, taskShaderIndirectArgsBuff);
+		cmdb.bindUavBuffer(0, 8, taskShaderPayloadBuffer);
 
 		U32* drawIndirectArgsIndexOrTaskPayloadIndex =
-			allocateAndBindUav<U32>(cmdb, 0, 8, RenderStateBucketContainer::getSingleton().getBucketCount(technique));
+			allocateAndBindUav<U32>(cmdb, 0, 9, RenderStateBucketContainer::getSingleton().getBucketCount(technique));
 		U32 bucketCount = 0;
 		U32 legacyGeometryFlowDrawCount = 0;
 		U32 taskPayloadCount = 0;
@@ -334,7 +335,7 @@ void GpuVisibility::populateRenderGraphInternal(Bool distanceBased, BaseGpuVisib
 
 		if(frustumTestData)
 		{
-			FrustumGpuVisibilityConstants* unis = allocateAndBindConstants<FrustumGpuVisibilityConstants>(cmdb, 0, 9);
+			FrustumGpuVisibilityConstants* unis = allocateAndBindConstants<FrustumGpuVisibilityConstants>(cmdb, 0, 10);
 
 			Array<Plane, 6> planes;
 			extractClipPlanes(frustumTestData->m_viewProjMat, planes);
@@ -355,8 +356,8 @@ void GpuVisibility::populateRenderGraphInternal(Bool distanceBased, BaseGpuVisib
 
 			if(frustumTestData->m_hzbRt.isValid())
 			{
-				rpass.bindColorTexture(0, 10, frustumTestData->m_hzbRt);
-				cmdb.bindSampler(0, 11, getRenderer().getSamplers().m_nearestNearestClamp.get());
+				rpass.bindColorTexture(0, 11, frustumTestData->m_hzbRt);
+				cmdb.bindSampler(0, 12, getRenderer().getSamplers().m_nearestNearestClamp.get());
 			}
 		}
 		else
@@ -377,12 +378,12 @@ void GpuVisibility::populateRenderGraphInternal(Bool distanceBased, BaseGpuVisib
 
 		if(gatherAabbIndices)
 		{
-			cmdb.bindUavBuffer(0, 12, visibleAaabbIndicesBuffer);
+			cmdb.bindUavBuffer(0, 13, visibleAaabbIndicesBuffer);
 		}
 
 		if(genHash)
 		{
-			cmdb.bindUavBuffer(0, 13, hashBuffer);
+			cmdb.bindUavBuffer(0, 14, hashBuffer);
 		}
 
 		dispatchPPCompute(cmdb, 64, 1, aabbCount, 1);
@@ -635,11 +636,12 @@ void GpuVisibilityAccelerationStructures::pupulateRenderGraph(GpuVisibilityAccel
 
 			cmdb.bindUavBuffer(0, 0, GpuSceneArrays::RenderableBoundingVolumeRt::getSingleton().getBufferOffsetRange());
 			cmdb.bindUavBuffer(0, 1, GpuSceneArrays::Renderable::getSingleton().getBufferOffsetRange());
-			cmdb.bindUavBuffer(0, 2, &GpuSceneBuffer::getSingleton().getBuffer(), 0, kMaxPtrSize);
-			cmdb.bindUavBuffer(0, 3, instancesBuff);
-			cmdb.bindUavBuffer(0, 4, indicesBuff);
-			cmdb.bindUavBuffer(0, 5, m_counterBuffer.get(), 0, sizeof(U32) * 2);
-			cmdb.bindUavBuffer(0, 6, zeroInstancesDispatchArgsBuff);
+			cmdb.bindUavBuffer(0, 2, GpuSceneArrays::MeshLod::getSingleton().getBufferOffsetRange());
+			cmdb.bindUavBuffer(0, 3, &GpuSceneBuffer::getSingleton().getBuffer(), 0, kMaxPtrSize);
+			cmdb.bindUavBuffer(0, 4, instancesBuff);
+			cmdb.bindUavBuffer(0, 5, indicesBuff);
+			cmdb.bindUavBuffer(0, 6, m_counterBuffer.get(), 0, sizeof(U32) * 2);
+			cmdb.bindUavBuffer(0, 7, zeroInstancesDispatchArgsBuff);
 
 			const U32 aabbCount = GpuSceneArrays::RenderableBoundingVolumeRt::getSingleton().getElementCount();
 			dispatchPPCompute(cmdb, 64, 1, aabbCount, 1);

+ 1 - 1
AnKi/Scene/Components/ModelComponent.cpp

@@ -203,7 +203,7 @@ Error ModelComponent::update(SceneComponentUpdateInfo& info, Bool& updated)
 			GpuSceneRenderable gpuRenderable = {};
 			gpuRenderable.m_worldTransformsOffset = m_gpuSceneTransforms.getGpuSceneOffset();
 			gpuRenderable.m_constantsOffset = m_patchInfos[i].m_gpuSceneUniformsOffset;
-			gpuRenderable.m_meshLodsOffset = m_patchInfos[i].m_gpuSceneMeshLods.getGpuSceneOffset();
+			gpuRenderable.m_meshLodsIndex = m_patchInfos[i].m_gpuSceneMeshLods.getIndex() * kMaxLodCount;
 			gpuRenderable.m_boneTransformsOffset = (hasSkin) ? m_skinComponent->getBoneTransformsGpuSceneOffset() : 0;
 			if(!!(mtl.getRenderingTechniques() & RenderingTechniqueBit::kRtShadow))
 			{

+ 1 - 1
AnKi/Scene/Components/ParticleEmitterComponent.cpp

@@ -400,7 +400,7 @@ Error ParticleEmitterComponent::update(SceneComponentUpdateInfo& info, Bool& upd
 		GpuSceneRenderable renderable;
 		renderable.m_boneTransformsOffset = 0;
 		renderable.m_constantsOffset = m_gpuSceneUniforms.getOffset();
-		renderable.m_meshLodsOffset = m_gpuSceneMeshLods.getGpuSceneOffset();
+		renderable.m_meshLodsIndex = m_gpuSceneMeshLods.getIndex() * kMaxLodCount;
 		renderable.m_particleEmitterOffset = m_gpuSceneParticleEmitter.getGpuSceneOffset();
 		renderable.m_worldTransformsOffset = 0;
 		renderable.m_uuid = SceneGraph::getSingleton().getNewUuid();

+ 1 - 1
AnKi/Shaders/ForwardShadingFog.ankiprog

@@ -32,7 +32,7 @@ VertOut main(VertIn input)
 	VertOut output;
 
 	const GpuSceneRenderableVertex renderable = unpackGpuSceneRenderableVertex(input.m_gpuSceneRenderable);
-	const GpuSceneMeshLod mesh = g_gpuScene.Load<GpuSceneMeshLod>(renderable.m_meshLodOffset);
+	const GpuSceneMeshLod mesh = g_meshLods[renderable.m_meshLodIndex];
 	const Mat3x4 worldTransform = g_gpuScene.Load<Mat3x4>(renderable.m_worldTransformsOffset);
 	const UnpackedMeshVertex vertex = loadVertex(mesh, input.m_svVertexId, false);
 

+ 1 - 1
AnKi/Shaders/ForwardShadingGenericTransparent.ankiprog

@@ -35,7 +35,7 @@ VertOut main(VertIn input)
 	VertOut output;
 
 	const GpuSceneRenderableVertex renderable = unpackGpuSceneRenderableVertex(input.m_gpuSceneRenderable);
-	const GpuSceneMeshLod mesh = g_gpuScene.Load<GpuSceneMeshLod>(renderable.m_meshLodOffset);
+	const GpuSceneMeshLod mesh = g_meshLods[renderable.m_meshLodIndex];
 	const Mat3x4 worldTransform = g_gpuScene.Load<Mat3x4>(renderable.m_worldTransformsOffset);
 	const UnpackedMeshVertex vertex = loadVertex(mesh, input.m_svVertexId, false);
 

+ 1 - 1
AnKi/Shaders/ForwardShadingParticles.ankiprog

@@ -36,7 +36,7 @@ VertOut main(VertIn input)
 {
 	const GpuSceneRenderableVertex renderable = unpackGpuSceneRenderableVertex(input.m_gpuSceneRenderable);
 	const GpuSceneParticleEmitter particles = g_gpuScene.Load<GpuSceneParticleEmitter>(renderable.m_boneTransformsOrParticleEmitterOffset);
-	const GpuSceneMeshLod meshLod = g_gpuScene.Load<GpuSceneMeshLod>(renderable.m_meshLodOffset);
+	const GpuSceneMeshLod meshLod = g_meshLods[renderable.m_meshLodIndex];
 
 	const U32 particleId = input.m_svVertexId / meshLod.m_indexCount;
 	const U32 vertexId = g_unifiedGeom_R16_Uint[meshLod.m_firstIndex + input.m_svVertexId % meshLod.m_indexCount];

+ 3 - 3
AnKi/Shaders/GBufferGeneric.ankiprog

@@ -237,7 +237,7 @@ VertOut main(VertIn input)
 	VertOut output;
 
 	const GpuSceneRenderableVertex renderable = unpackGpuSceneRenderableVertex(input.m_gpuSceneRenderable);
-	const GpuSceneMeshLod mesh = g_gpuScene.Load<GpuSceneMeshLod>(renderable.m_meshLodOffset);
+	const GpuSceneMeshLod mesh = g_meshLods[renderable.m_meshLodIndex];
 	UnpackedMeshVertex vert = loadVertex(mesh, input.m_svVertexId, ANKI_BONES);
 
 	const Mat3x4 worldTransform = g_gpuScene.Load<Mat3x4>(renderable.m_worldTransformsOffset);
@@ -298,7 +298,7 @@ struct FirstPayload
 	const U32 meshletGroup = inPayload.m_lod_2bit_renderableIdx_21bit_meshletGroup_9bit & ((1u << 9u) - 1u);
 
 	const GpuSceneRenderable renderable = g_renderables[renderableIdx];
-	const GpuSceneMeshLod meshLod = g_gpuScene.Load<GpuSceneMeshLod>(renderable.m_meshLodsOffset + sizeof(GpuSceneMeshLod) * lod);
+	const GpuSceneMeshLod meshLod = g_meshLods[renderable.m_meshLodsIndex + lod];
 	U32 firstMeshletBoundingVolume = meshletGroup * kMeshletGroupSize;
 	const U32 meshletCount = min(kMeshletGroupSize, meshLod.m_meshletCount - firstMeshletBoundingVolume);
 	firstMeshletBoundingVolume += meshLod.m_firstMeshletBoundingVolume;
@@ -675,7 +675,7 @@ FragOut main(
 
 	const Vec3 bary = Vec3(1.0f - barycentrics.m_value.x - barycentrics.m_value.y, barycentrics.m_value.x, barycentrics.m_value.y);
 
-	const GpuSceneMeshLod mesh = g_gpuScene.Load<GpuSceneMeshLod>(g_gpuSceneRenderable.m_meshLodOffset);
+	const GpuSceneMeshLod mesh = g_meshLods[g_gpuSceneRenderable.m_meshLodIndex];
 
 	const U32 idx0 = g_unifiedGeom_R16_Uint[mesh.m_firstIndex + PrimitiveIndex() * 3 + 0];
 	const U32 idx1 = g_unifiedGeom_R16_Uint[mesh.m_firstIndex + PrimitiveIndex() * 3 + 1];

+ 18 - 17
AnKi/Shaders/GpuVisibility.ankiprog

@@ -29,40 +29,41 @@ struct DrawIndirectArgsWithPadding
 // Buffers that point to the GPU scene
 [[vk::binding(0)]] StructuredBuffer<GpuSceneRenderableBoundingVolume> g_renderableBoundingVolumes;
 [[vk::binding(1)]] StructuredBuffer<GpuSceneRenderable> g_renderables;
-[[vk::binding(2)]] ByteAddressBuffer g_gpuScene;
+[[vk::binding(2)]] StructuredBuffer<GpuSceneMeshLod> g_meshLods;
+[[vk::binding(3)]] ByteAddressBuffer g_gpuScene;
 
 // These 3 have the same size
-[[vk::binding(3)]] RWStructuredBuffer<UVec4> g_instanceRateRenderables;
-[[vk::binding(4)]] RWStructuredBuffer<DrawIndexedIndirectArgs> g_drawIndexedIndirectArgs;
-[[vk::binding(4)]] RWStructuredBuffer<DrawIndirectArgsWithPadding> g_drawIndirectArgs;
+[[vk::binding(4)]] RWStructuredBuffer<UVec4> g_instanceRateRenderables;
+[[vk::binding(5)]] RWStructuredBuffer<DrawIndexedIndirectArgs> g_drawIndexedIndirectArgs;
+[[vk::binding(5)]] RWStructuredBuffer<DrawIndirectArgsWithPadding> g_drawIndirectArgs;
 
 // The MDI counts. One for each render state bucket
-[[vk::binding(5)]] RWStructuredBuffer<U32> g_mdiDrawCounts;
+[[vk::binding(6)]] RWStructuredBuffer<U32> g_mdiDrawCounts;
 
 // For mesh shading
-[[vk::binding(6)]] RWStructuredBuffer<DispatchIndirectArgs> g_taskShaderIndirectArgs;
-[[vk::binding(7)]] RWStructuredBuffer<GpuSceneTaskShaderPayload> g_taskShaderPayloads;
+[[vk::binding(7)]] RWStructuredBuffer<DispatchIndirectArgs> g_taskShaderIndirectArgs;
+[[vk::binding(8)]] RWStructuredBuffer<GpuSceneTaskShaderPayload> g_taskShaderPayloads;
 
 // One for each render state bucket. It's either the index of the next indirect args or the index to the next task payload
-[[vk::binding(8)]] StructuredBuffer<U32> g_drawIndirectArgsIndexOrTaskPayloadIndex;
+[[vk::binding(9)]] StructuredBuffer<U32> g_drawIndirectArgsIndexOrTaskPayloadIndex;
 
 #if DISTANCE_TEST == 0
-[[vk::binding(9)]] ConstantBuffer<FrustumGpuVisibilityConstants> g_consts;
+[[vk::binding(10)]] ConstantBuffer<FrustumGpuVisibilityConstants> g_consts;
 #else
 [[vk::push_constant]] ConstantBuffer<DistanceGpuVisibilityConstants> g_consts;
 #endif
 
 #if HZB_TEST
-[[vk::binding(10)]] Texture2D<Vec4> g_hzbTex;
-[[vk::binding(11)]] SamplerState g_nearestAnyClampSampler;
+[[vk::binding(11)]] Texture2D<Vec4> g_hzbTex;
+[[vk::binding(12)]] SamplerState g_nearestAnyClampSampler;
 #endif
 
 #if GATHER_AABBS
-[[vk::binding(12)]] RWStructuredBuffer<U32> g_visibleAabbIndices; ///< Indices of the visible AABBs. The 1st element is the count.
+[[vk::binding(13)]] RWStructuredBuffer<U32> g_visibleAabbIndices; ///< Indices of the visible AABBs. The 1st element is the count.
 #endif
 
 #if HASH_VISIBLES
-[[vk::binding(13)]] RWStructuredBuffer<GpuVisibilityHash> g_hash;
+[[vk::binding(14)]] RWStructuredBuffer<GpuVisibilityHash> g_hash;
 #endif
 
 [numthreads(64, 1, 1)] void main(UVec3 svDispatchThreadId : SV_DISPATCHTHREADID)
@@ -149,8 +150,8 @@ struct DrawIndirectArgsWithPadding
 	const U32 renderableIdx = bvolume.m_renderableIndex_20bit_renderStateBucket_12bit >> 12u;
 
 	const GpuSceneRenderable renderable = g_renderables[renderableIdx];
-	const U32 meshLodOffset = renderable.m_meshLodsOffset + sizeof(GpuSceneMeshLod) * lod;
-	const GpuSceneMeshLod meshLod = g_gpuScene.Load<GpuSceneMeshLod>(meshLodOffset);
+	const U32 meshLodIndex = renderable.m_meshLodsIndex + lod;
+	const GpuSceneMeshLod meshLod = g_meshLods[meshLodIndex];
 
 	const Bool isParticleEmitter = renderable.m_particleEmitterOffset != 0;
 	const Bool usesMeshShaders = meshLod.m_meshletCount != 0u;
@@ -209,7 +210,7 @@ struct DrawIndirectArgsWithPadding
 			UVec4 instanceVertex;
 			instanceVertex.x = renderable.m_worldTransformsOffset;
 			instanceVertex.y = renderable.m_constantsOffset;
-			instanceVertex.z = meshLodOffset;
+			instanceVertex.z = meshLodIndex;
 			instanceVertex.w = renderable.m_boneTransformsOffset;
 			g_instanceRateRenderables[indirectIdx] = instanceVertex;
 		}
@@ -227,7 +228,7 @@ struct DrawIndirectArgsWithPadding
 			UVec4 instanceVertex;
 			instanceVertex.x = renderable.m_worldTransformsOffset;
 			instanceVertex.y = renderable.m_constantsOffset;
-			instanceVertex.z = meshLodOffset;
+			instanceVertex.z = meshLodIndex;
 			instanceVertex.w = renderable.m_particleEmitterOffset;
 			g_instanceRateRenderables[indirectIdx] = instanceVertex;
 		}

+ 8 - 7
AnKi/Shaders/GpuVisibilityAccelerationStructures.ankiprog

@@ -13,14 +13,15 @@
 // Buffers that point to the GPU scene
 [[vk::binding(0)]] StructuredBuffer<GpuSceneRenderableBoundingVolume> g_renderableBoundingVolumes;
 [[vk::binding(1)]] StructuredBuffer<GpuSceneRenderable> g_renderables;
-[[vk::binding(2)]] ByteAddressBuffer g_gpuScene;
+[[vk::binding(2)]] StructuredBuffer<GpuSceneMeshLod> g_meshLods;
+[[vk::binding(3)]] ByteAddressBuffer g_gpuScene;
 
-[[vk::binding(3)]] RWStructuredBuffer<AccelerationStructureInstance> g_visibleInstances;
-[[vk::binding(4)]] RWStructuredBuffer<U32> g_visibleRenderableIndices; // 1st element is the count
+[[vk::binding(4)]] RWStructuredBuffer<AccelerationStructureInstance> g_visibleInstances;
+[[vk::binding(5)]] RWStructuredBuffer<U32> g_visibleRenderableIndices; // 1st element is the count
 
-[[vk::binding(5)]] globallycoherent RWStructuredBuffer<U32> g_counterBuffer; // 2 counters per dispatch
+[[vk::binding(6)]] globallycoherent RWStructuredBuffer<U32> g_counterBuffer; // 2 counters per dispatch
 
-[[vk::binding(6)]] RWStructuredBuffer<DispatchIndirectArgs> g_nextDispatchIndirectArgs;
+[[vk::binding(7)]] RWStructuredBuffer<DispatchIndirectArgs> g_nextDispatchIndirectArgs;
 
 [[vk::push_constant]] ConstantBuffer<GpuVisibilityAccelerationStructuresConstants> g_consts;
 
@@ -78,8 +79,8 @@
 		const U32 renderableIdx = bvolume.m_renderableIndex_20bit_renderStateBucket_12bit >> 12u;
 		const GpuSceneRenderable renderable = g_renderables[renderableIdx];
 
-		const U32 meshLodOffset = renderable.m_meshLodsOffset + sizeof(GpuSceneMeshLod) * lod;
-		const GpuSceneMeshLod meshLod = g_gpuScene.Load<GpuSceneMeshLod>(meshLodOffset);
+		const U32 meshLodIndex = renderable.m_meshLodsIndex + lod;
+		const GpuSceneMeshLod meshLod = g_meshLods[meshLodIndex];
 
 		if(meshLod.m_blasAddress.x != 0 || meshLod.m_blasAddress.y != 0)
 		{

+ 1 - 1
AnKi/Shaders/Include/GpuSceneFunctions.h

@@ -14,7 +14,7 @@ inline GpuSceneRenderableVertex unpackGpuSceneRenderableVertex(UVec4 x)
 	GpuSceneRenderableVertex o;
 	o.m_worldTransformsOffset = x[0];
 	o.m_constantsOffset = x[1];
-	o.m_meshLodOffset = x[2];
+	o.m_meshLodIndex = x[2];
 	o.m_boneTransformsOrParticleEmitterOffset = x[3];
 	return o;
 }

+ 2 - 2
AnKi/Shaders/Include/GpuSceneTypes.h

@@ -21,7 +21,7 @@ struct GpuSceneRenderable
 {
 	U32 m_worldTransformsOffset; ///< First is the crnt transform and the 2nd the previous
 	U32 m_constantsOffset;
-	U32 m_meshLodsOffset; ///< Points to an array of GpuSceneMeshLod sized kMaxLodCount.
+	U32 m_meshLodsIndex; ///< Points to the array of GpuSceneMeshLod. kMaxLodCount are reserved for each renderable.
 	U32 m_boneTransformsOffset; ///< Array of Mat3x4 or 0 if its not a skin.
 	U32 m_particleEmitterOffset; ///< Offset to GpuSceneParticleEmitter or 0 if it's not an emitter.
 	U32 m_rtShadowsShaderHandleIndex; ///< The index of the shader handle in the array of library's handles.
@@ -33,7 +33,7 @@ struct GpuSceneRenderableVertex
 {
 	U32 m_worldTransformsOffset;
 	U32 m_constantsOffset;
-	U32 m_meshLodOffset; ///< Points to a single GpuSceneMeshLod and not an array
+	U32 m_meshLodIndex; ///< Points to a single GpuSceneMeshLod in the mesh lods.
 	U32 m_boneTransformsOrParticleEmitterOffset;
 };
 static_assert(sizeof(GpuSceneRenderableVertex) == sizeof(UVec4));

+ 1 - 0
AnKi/Shaders/Include/MaterialTypes.h

@@ -49,6 +49,7 @@ enum class MaterialBinding : U32
 	kMeshletGeometryDescriptors, ///< Points to the unified geom buffer
 	kTaskShaderPayloads,
 	kRenderables,
+	kMeshLods,
 	kHzbTexture,
 	kNearestClampSampler,
 

+ 1 - 0
AnKi/Shaders/MaterialShadersCommon.hlsl

@@ -29,6 +29,7 @@ ANKI_BINDLESS_SET(MaterialSet::kBindless)
 	g_meshletGeometryDescriptors;
 [[vk::binding(MaterialBinding::kTaskShaderPayloads, MaterialSet::kGlobal)]] StructuredBuffer<GpuSceneTaskShaderPayload> g_taskShaderPayloads;
 [[vk::binding(MaterialBinding::kRenderables, MaterialSet::kGlobal)]] StructuredBuffer<GpuSceneRenderable> g_renderables;
+[[vk::binding(MaterialBinding::kMeshLods, MaterialSet::kGlobal)]] StructuredBuffer<GpuSceneMeshLod> g_meshLods;
 [[vk::binding(MaterialBinding::kHzbTexture, MaterialSet::kGlobal)]] Texture2D<Vec4> g_hzbTexture;
 [[vk::binding(MaterialBinding::kNearestClampSampler, MaterialSet::kGlobal)]] SamplerState g_nearestClampSampler;
 

+ 1 - 1
AnKi/Shaders/RtShadowsHit.ankiprog

@@ -29,7 +29,7 @@
 
 	const Vec3 bary = Vec3(1.0f - barycentrics.m_value.x - barycentrics.m_value.y, barycentrics.m_value.x, barycentrics.m_value.y);
 
-	const GpuSceneMeshLod mesh = g_gpuScene.Load<GpuSceneMeshLod>(g_gpuSceneRenderable.m_meshLodOffset);
+	const GpuSceneMeshLod mesh = g_gpuScene.Load<GpuSceneMeshLod>(g_gpuSceneRenderable.m_meshLodIndex);
 
 	const U32 idx0 = g_unifiedGeom_R16_Uint[mesh.m_firstIndex + PrimitiveIndex() * 3 + 0];
 	const U32 idx1 = g_unifiedGeom_R16_Uint[mesh.m_firstIndex + PrimitiveIndex() * 3 + 1];

+ 1 - 1
AnKi/Shaders/RtShadowsSbtBuild.ankiprog

@@ -44,7 +44,7 @@
 	// Copy the GpuSceneRenderableVertex
 	g_sbtBuffer[sbtDwordOffset++] = renderable.m_worldTransformsOffset;
 	g_sbtBuffer[sbtDwordOffset++] = renderable.m_constantsOffset;
-	g_sbtBuffer[sbtDwordOffset++] = renderable.m_meshLodsOffset;
+	g_sbtBuffer[sbtDwordOffset++] = renderable.m_meshLodsIndex;
 	g_sbtBuffer[sbtDwordOffset] = 0;
 }