Browse Source

Make the firstInstance of MDI drawcalls smaller

Panagiotis Christopoulos Charitos 1 year ago
parent
commit
e43b4295c9
2 changed files with 18 additions and 10 deletions
  1. 13 5
      AnKi/Renderer/Utils/Drawer.cpp
  2. 5 5
      AnKi/Shaders/GpuVisibility.ankiprog

+ 13 - 5
AnKi/Renderer/Utils/Drawer.cpp

@@ -103,9 +103,6 @@ void RenderableDrawer::drawMdi(const RenderableDrawerArguments& args, CommandBuf
 
 
 	const Bool meshShaderHwSupport = GrManager::getSingleton().getDeviceCapabilities().m_meshShaders;
 	const Bool meshShaderHwSupport = GrManager::getSingleton().getDeviceCapabilities().m_meshShaders;
 
 
-	cmdb.bindVertexBuffer(0, args.m_legacy.m_renderableInstancesBuffer.m_buffer, args.m_legacy.m_renderableInstancesBuffer.m_offset,
-						  sizeof(GpuSceneRenderableVertex), VertexStepRate::kInstance);
-
 	// Gather the drawcalls
 	// Gather the drawcalls
 	class Command
 	class Command
 	{
 	{
@@ -117,6 +114,8 @@ void RenderableDrawer::drawMdi(const RenderableDrawerArguments& args, CommandBuf
 			PtrSize m_drawIndirectArgsBufferOffset;
 			PtrSize m_drawIndirectArgsBufferOffset;
 			Buffer* m_mdiDrawCountsBuffer;
 			Buffer* m_mdiDrawCountsBuffer;
 			PtrSize m_mdiDrawCountsBufferOffset;
 			PtrSize m_mdiDrawCountsBufferOffset;
+			Buffer* m_instancesBuffer;
+			PtrSize m_instancesBufferOffset;
 			U32 m_maxDrawCount;
 			U32 m_maxDrawCount;
 			PrimitiveTopology m_primitiveTopology;
 			PrimitiveTopology m_primitiveTopology;
 		};
 		};
@@ -213,13 +212,16 @@ void RenderableDrawer::drawMdi(const RenderableDrawerArguments& args, CommandBuf
 				cmd.m_legacyDraw.m_maxDrawCount = maxDrawCount;
 				cmd.m_legacyDraw.m_maxDrawCount = maxDrawCount;
 				cmd.m_legacyDraw.m_mdiDrawCountsBuffer = args.m_legacy.m_mdiDrawCountsBuffer.m_buffer;
 				cmd.m_legacyDraw.m_mdiDrawCountsBuffer = args.m_legacy.m_mdiDrawCountsBuffer.m_buffer;
 				cmd.m_legacyDraw.m_mdiDrawCountsBufferOffset = args.m_legacy.m_mdiDrawCountsBuffer.m_offset + sizeof(U32) * bucketCount;
 				cmd.m_legacyDraw.m_mdiDrawCountsBufferOffset = args.m_legacy.m_mdiDrawCountsBuffer.m_offset + sizeof(U32) * bucketCount;
+				cmd.m_legacyDraw.m_instancesBuffer = args.m_legacy.m_renderableInstancesBuffer.m_buffer;
+				cmd.m_legacyDraw.m_instancesBufferOffset =
+					args.m_legacy.m_renderableInstancesBuffer.m_offset + legacyGeometryFlowUserCount * sizeof(GpuSceneRenderableVertex);
 
 
 				legacyGeometryFlowUserCount += userCount;
 				legacyGeometryFlowUserCount += userCount;
 			}
 			}
 
 
 			++bucketCount;
 			++bucketCount;
 			allUserCount += userCount;
 			allUserCount += userCount;
-			meshletInstancesBufferOffset += sizeof(UVec4) * min(meshletGroupCount, kMaxMeshletGroupCountPerRenderStateBucket);
+			meshletInstancesBufferOffset += sizeof(GpuSceneMeshletInstance) * min(meshletGroupCount, kMaxMeshletGroupCountPerRenderStateBucket);
 		});
 		});
 
 
 	ANKI_ASSERT(bucketCount == RenderStateBucketContainer::getSingleton().getBucketCount(args.m_renderingTechinuqe));
 	ANKI_ASSERT(bucketCount == RenderStateBucketContainer::getSingleton().getBucketCount(args.m_renderingTechinuqe));
@@ -243,6 +245,9 @@ void RenderableDrawer::drawMdi(const RenderableDrawerArguments& args, CommandBuf
 
 
 		if(it->m_drawType == 0)
 		if(it->m_drawType == 0)
 		{
 		{
+			cmdb.bindVertexBuffer(0, it->m_legacyDraw.m_instancesBuffer, it->m_legacyDraw.m_instancesBufferOffset, sizeof(GpuSceneRenderableVertex),
+								  VertexStepRate::kInstance);
+
 			cmdb.drawIndexedIndirectCount(it->m_legacyDraw.m_primitiveTopology, it->m_legacyDraw.m_drawIndirectArgsBuffer,
 			cmdb.drawIndexedIndirectCount(it->m_legacyDraw.m_primitiveTopology, it->m_legacyDraw.m_drawIndirectArgsBuffer,
 										  it->m_legacyDraw.m_drawIndirectArgsBufferOffset, sizeof(DrawIndexedIndirectArgs),
 										  it->m_legacyDraw.m_drawIndirectArgsBufferOffset, sizeof(DrawIndexedIndirectArgs),
 										  it->m_legacyDraw.m_mdiDrawCountsBuffer, it->m_legacyDraw.m_mdiDrawCountsBufferOffset,
 										  it->m_legacyDraw.m_mdiDrawCountsBuffer, it->m_legacyDraw.m_mdiDrawCountsBufferOffset,
@@ -250,6 +255,9 @@ void RenderableDrawer::drawMdi(const RenderableDrawerArguments& args, CommandBuf
 		}
 		}
 		else if(it->m_drawType == 1)
 		else if(it->m_drawType == 1)
 		{
 		{
+			cmdb.bindVertexBuffer(0, it->m_legacyDraw.m_instancesBuffer, it->m_legacyDraw.m_instancesBufferOffset, sizeof(GpuSceneRenderableVertex),
+								  VertexStepRate::kInstance);
+
 			// Yes, the DrawIndexedIndirectArgs is intentional
 			// Yes, the DrawIndexedIndirectArgs is intentional
 			cmdb.drawIndirectCount(it->m_legacyDraw.m_primitiveTopology, it->m_legacyDraw.m_drawIndirectArgsBuffer,
 			cmdb.drawIndirectCount(it->m_legacyDraw.m_primitiveTopology, it->m_legacyDraw.m_drawIndirectArgsBuffer,
 								   it->m_legacyDraw.m_drawIndirectArgsBufferOffset, sizeof(DrawIndexedIndirectArgs),
 								   it->m_legacyDraw.m_drawIndirectArgsBufferOffset, sizeof(DrawIndexedIndirectArgs),
@@ -267,7 +275,7 @@ void RenderableDrawer::drawMdi(const RenderableDrawerArguments& args, CommandBuf
 		{
 		{
 			ANKI_ASSERT(it->m_drawType == 3);
 			ANKI_ASSERT(it->m_drawType == 3);
 
 
-			cmdb.bindVertexBuffer(0, it->m_swMeshDraw.m_instancesBuffer, it->m_swMeshDraw.m_instancesBufferOffset, sizeof(UVec4),
+			cmdb.bindVertexBuffer(0, it->m_swMeshDraw.m_instancesBuffer, it->m_swMeshDraw.m_instancesBufferOffset, sizeof(GpuSceneMeshletInstance),
 								  VertexStepRate::kInstance);
 								  VertexStepRate::kInstance);
 
 
 			cmdb.drawIndirect(PrimitiveTopology::kTriangles, 1, it->m_swMeshDraw.m_drawIndirectArgsBufferOffset,
 			cmdb.drawIndirect(PrimitiveTopology::kTriangles, 1, it->m_swMeshDraw.m_drawIndirectArgsBufferOffset,

+ 5 - 5
AnKi/Shaders/GpuVisibility.ankiprog

@@ -191,9 +191,9 @@ struct DrawIndirectArgsWithPadding
 	}
 	}
 	else
 	else
 	{
 	{
-		U32 indirectIdx;
-		InterlockedAdd(g_mdiDrawCounts[renderStateBucket], 1, indirectIdx);
-		indirectIdx += g_drawIndirectArgsIndexOrTaskPayloadIndex[renderStateBucket];
+		U32 bucketDrawcallIdx;
+		InterlockedAdd(g_mdiDrawCounts[renderStateBucket], 1, bucketDrawcallIdx);
+		const U32 indirectIdx = bucketDrawcallIdx + g_drawIndirectArgsIndexOrTaskPayloadIndex[renderStateBucket];
 
 
 		if(!isParticleEmitter)
 		if(!isParticleEmitter)
 		{
 		{
@@ -204,7 +204,7 @@ struct DrawIndirectArgsWithPadding
 			indirect.m_instanceCount = 1;
 			indirect.m_instanceCount = 1;
 			indirect.m_firstIndex = meshLod.m_firstIndex;
 			indirect.m_firstIndex = meshLod.m_firstIndex;
 			indirect.m_vertexOffset = 0;
 			indirect.m_vertexOffset = 0;
-			indirect.m_firstInstance = indirectIdx;
+			indirect.m_firstInstance = bucketDrawcallIdx;
 			g_drawIndexedIndirectArgs[indirectIdx] = indirect;
 			g_drawIndexedIndirectArgs[indirectIdx] = indirect;
 
 
 			UVec4 instanceVertex;
 			UVec4 instanceVertex;
@@ -222,7 +222,7 @@ struct DrawIndirectArgsWithPadding
 			indirect.m_vertexCount = emitter.m_aliveParticleCount * meshLod.m_indexCount;
 			indirect.m_vertexCount = emitter.m_aliveParticleCount * meshLod.m_indexCount;
 			indirect.m_instanceCount = 1;
 			indirect.m_instanceCount = 1;
 			indirect.m_firstVertex = 0;
 			indirect.m_firstVertex = 0;
-			indirect.m_firstInstance = indirectIdx;
+			indirect.m_firstInstance = bucketDrawcallIdx;
 			g_drawIndirectArgs[indirectIdx] = indirect;
 			g_drawIndirectArgs[indirectIdx] = indirect;
 
 
 			UVec4 instanceVertex;
 			UVec4 instanceVertex;