Browse Source

Fix 2 bugs with mesh shading

Panagiotis Christopoulos Charitos 2 years ago
parent
commit
59a3ea9f77

+ 2 - 0
AnKi/Resource/MeshResource.cpp

@@ -106,6 +106,8 @@ Error MeshResource::load(const ResourceFilename& filename, Bool async)
 		{
 		{
 			m_subMeshes[i].m_firstIndices[lod] = loader.getSubMeshes()[i].m_lods[lod].m_firstIndex;
 			m_subMeshes[i].m_firstIndices[lod] = loader.getSubMeshes()[i].m_lods[lod].m_firstIndex;
 			m_subMeshes[i].m_indexCounts[lod] = loader.getSubMeshes()[i].m_lods[lod].m_indexCount;
 			m_subMeshes[i].m_indexCounts[lod] = loader.getSubMeshes()[i].m_lods[lod].m_indexCount;
+			m_subMeshes[i].m_firstMeshlet[lod] = loader.getSubMeshes()[i].m_lods[lod].m_firstMeshlet;
+			m_subMeshes[i].m_meshletCounts[lod] = loader.getSubMeshes()[i].m_lods[lod].m_meshletCount;
 		}
 		}
 
 
 		m_subMeshes[i].m_aabb.setMin(loader.getSubMeshes()[i].m_boundingVolume.m_aabbMin);
 		m_subMeshes[i].m_aabb.setMin(loader.getSubMeshes()[i].m_boundingVolume.m_aabbMin);

+ 9 - 5
AnKi/Resource/MeshResource.h

@@ -44,11 +44,13 @@ public:
 	}
 	}
 
 
 	/// Get submesh info.
 	/// Get submesh info.
-	void getSubMeshInfo(U32 lod, U32 subMeshId, U32& firstIndex, U32& indexCount, Aabb& aabb) const
+	void getSubMeshInfo(U32 lod, U32 subMeshId, U32& firstIndex, U32& indexCount, U32& firstMeshlet, U32& meshletCount, Aabb& aabb) const
 	{
 	{
 		const SubMesh& sm = m_subMeshes[subMeshId];
 		const SubMesh& sm = m_subMeshes[subMeshId];
 		firstIndex = sm.m_firstIndices[lod];
 		firstIndex = sm.m_firstIndices[lod];
 		indexCount = sm.m_indexCounts[lod];
 		indexCount = sm.m_indexCounts[lod];
+		firstMeshlet = sm.m_firstMeshlet[lod];
+		meshletCount = sm.m_meshletCounts[lod];
 		aabb = sm.m_aabb;
 		aabb = sm.m_aabb;
 	}
 	}
 
 
@@ -62,15 +64,15 @@ public:
 	}
 	}
 
 
 	/// Get vertex buffer info.
 	/// Get vertex buffer info.
-	void getVertexStreamInfo(U32 lod, VertexStreamId stream, PtrSize& bufferOffset, U32& vertexCount) const
+	void getVertexBufferInfo(U32 lod, VertexStreamId stream, PtrSize& ugbOffset, U32& vertexCount) const
 	{
 	{
-		bufferOffset = m_lods[lod].m_vertexBuffersAllocationToken[stream].getOffset();
+		ugbOffset = m_lods[lod].m_vertexBuffersAllocationToken[stream].getOffset();
 		vertexCount = m_lods[lod].m_vertexCount;
 		vertexCount = m_lods[lod].m_vertexCount;
 	}
 	}
 
 
-	void getMeshletInfo(U32 lod, PtrSize& meshletOffset, U32& meshletCount)
+	void getMeshletBufferInfo(U32 lod, PtrSize& meshletUgbOffset, U32& meshletCount)
 	{
 	{
-		meshletOffset = m_lods[lod].m_meshlets.getOffset();
+		meshletUgbOffset = m_lods[lod].m_meshlets.getOffset();
 		ANKI_ASSERT(m_lods[lod].m_meshletCount);
 		ANKI_ASSERT(m_lods[lod].m_meshletCount);
 		meshletCount = m_lods[lod].m_meshletCount;
 		meshletCount = m_lods[lod].m_meshletCount;
 	}
 	}
@@ -127,6 +129,8 @@ private:
 	public:
 	public:
 		Array<U32, kMaxLodCount> m_firstIndices = {};
 		Array<U32, kMaxLodCount> m_firstIndices = {};
 		Array<U32, kMaxLodCount> m_indexCounts = {};
 		Array<U32, kMaxLodCount> m_indexCounts = {};
+		Array<U32, kMaxLodCount> m_firstMeshlet = {};
+		Array<U32, kMaxLodCount> m_meshletCounts = {};
 		Aabb m_aabb;
 		Aabb m_aabb;
 	};
 	};
 
 

+ 19 - 13
AnKi/Resource/ModelResource.cpp

@@ -15,13 +15,13 @@ void ModelPatch::getGeometryInfo(U32 lod, ModelPatchGeometryInfo& inf) const
 {
 {
 	lod = min<U32>(lod, m_meshLodCount - 1);
 	lod = min<U32>(lod, m_meshLodCount - 1);
 
 
-	inf.m_indexBufferOffset = m_lodInfos[lod].m_indexBufferOffset + m_lodInfos[lod].m_firstIndex * getIndexSize(IndexType::kU16);
+	inf.m_indexUgbOffset = m_lodInfos[lod].m_indexUgbOffset;
 	inf.m_indexType = IndexType::kU16;
 	inf.m_indexType = IndexType::kU16;
 	inf.m_indexCount = m_lodInfos[lod].m_indexCount;
 	inf.m_indexCount = m_lodInfos[lod].m_indexCount;
 
 
 	for(VertexStreamId stream : EnumIterable(VertexStreamId::kMeshRelatedFirst, VertexStreamId::kMeshRelatedCount))
 	for(VertexStreamId stream : EnumIterable(VertexStreamId::kMeshRelatedFirst, VertexStreamId::kMeshRelatedCount))
 	{
 	{
-		inf.m_vertexBufferOffsets[stream] = m_lodInfos[lod].m_vertexBufferOffsets[stream];
+		inf.m_vertexUgbOffsets[stream] = m_lodInfos[lod].m_vertexUgbOffsets[stream];
 	}
 	}
 
 
 	if(!!(m_mtl->getRenderingTechniques() & RenderingTechniqueBit::kAllRt))
 	if(!!(m_mtl->getRenderingTechniques() & RenderingTechniqueBit::kAllRt))
@@ -31,14 +31,14 @@ void ModelPatch::getGeometryInfo(U32 lod, ModelPatchGeometryInfo& inf) const
 
 
 	if(m_lodInfos[lod].m_meshletCount != kMaxU32)
 	if(m_lodInfos[lod].m_meshletCount != kMaxU32)
 	{
 	{
-		ANKI_ASSERT(m_lodInfos[lod].m_meshletsOffset != kMaxPtrSize);
+		ANKI_ASSERT(m_lodInfos[lod].m_meshletsUgbOffset != kMaxPtrSize);
 		inf.m_meshletCount = m_lodInfos[lod].m_meshletCount;
 		inf.m_meshletCount = m_lodInfos[lod].m_meshletCount;
-		inf.m_meshletsOffset = m_lodInfos[lod].m_meshletsOffset;
+		inf.m_meshletsUgbOffset = m_lodInfos[lod].m_meshletsUgbOffset;
 	}
 	}
 	else
 	else
 	{
 	{
 		inf.m_meshletCount = 0;
 		inf.m_meshletCount = 0;
-		inf.m_meshletsOffset = kMaxPtrSize;
+		inf.m_meshletsUgbOffset = kMaxPtrSize;
 	}
 	}
 }
 }
 
 
@@ -50,7 +50,7 @@ void ModelPatch::getRayTracingInfo(const RenderingKey& key, ModelRayTracingInfo&
 	const U32 meshLod = min<U32>(key.getLod(), m_meshLodCount - 1);
 	const U32 meshLod = min<U32>(key.getLod(), m_meshLodCount - 1);
 	info.m_bottomLevelAccelerationStructure = m_mesh->getBottomLevelAccelerationStructure(meshLod);
 	info.m_bottomLevelAccelerationStructure = m_mesh->getBottomLevelAccelerationStructure(meshLod);
 
 
-	info.m_indexBufferOffset = m_lodInfos[meshLod].m_indexBufferOffset + 2_PtrSize * m_lodInfos[meshLod].m_firstIndex;
+	info.m_indexUgbOffset = m_lodInfos[meshLod].m_indexUgbOffset;
 
 
 	// Material
 	// Material
 	const MaterialVariant& variant = m_mtl->getOrCreateVariant(key);
 	const MaterialVariant& variant = m_mtl->getOrCreateVariant(key);
@@ -82,8 +82,8 @@ Error ModelPatch::init([[maybe_unused]] ModelResource* model, CString meshFName,
 	}
 	}
 	else
 	else
 	{
 	{
-		U32 firstIndex, indexCount;
-		m_mesh->getSubMeshInfo(0, subMeshIndex, firstIndex, indexCount, m_aabb);
+		U32 firstIndex, indexCount, firstMeshlet, meshletCount;
+		m_mesh->getSubMeshInfo(0, subMeshIndex, firstIndex, indexCount, firstMeshlet, meshletCount, m_aabb);
 	}
 	}
 
 
 	m_meshLodCount = m_mesh->getLodCount();
 	m_meshLodCount = m_mesh->getLodCount();
@@ -92,28 +92,34 @@ Error ModelPatch::init([[maybe_unused]] ModelResource* model, CString meshFName,
 	{
 	{
 		Lod& lod = m_lodInfos[l];
 		Lod& lod = m_lodInfos[l];
 		Aabb aabb;
 		Aabb aabb;
-		m_mesh->getSubMeshInfo(l, (subMeshIndex == kMaxU32) ? 0 : subMeshIndex, lod.m_firstIndex, lod.m_indexCount, aabb);
+		U32 firstIndex, firstMeshlet, meshletCount;
+		m_mesh->getSubMeshInfo(l, (subMeshIndex == kMaxU32) ? 0 : subMeshIndex, firstIndex, lod.m_indexCount, firstMeshlet, meshletCount, aabb);
 
 
 		U32 totalIndexCount;
 		U32 totalIndexCount;
 		IndexType indexType;
 		IndexType indexType;
-		m_mesh->getIndexBufferInfo(l, lod.m_indexBufferOffset, totalIndexCount, indexType);
+		m_mesh->getIndexBufferInfo(l, lod.m_indexUgbOffset, totalIndexCount, indexType);
+		lod.m_indexUgbOffset += firstIndex * getIndexSize(indexType);
 
 
 		for(VertexStreamId stream : EnumIterable(VertexStreamId::kMeshRelatedFirst, VertexStreamId::kMeshRelatedCount))
 		for(VertexStreamId stream : EnumIterable(VertexStreamId::kMeshRelatedFirst, VertexStreamId::kMeshRelatedCount))
 		{
 		{
 			if(m_mesh->isVertexStreamPresent(stream))
 			if(m_mesh->isVertexStreamPresent(stream))
 			{
 			{
 				U32 vertCount;
 				U32 vertCount;
-				m_mesh->getVertexStreamInfo(l, stream, lod.m_vertexBufferOffsets[stream], vertCount);
+				m_mesh->getVertexBufferInfo(l, stream, lod.m_vertexUgbOffsets[stream], vertCount);
 			}
 			}
 			else
 			else
 			{
 			{
-				lod.m_vertexBufferOffsets[stream] = kMaxPtrSize;
+				lod.m_vertexUgbOffsets[stream] = kMaxPtrSize;
 			}
 			}
 		}
 		}
 
 
 		if(GrManager::getSingleton().getDeviceCapabilities().m_meshShaders)
 		if(GrManager::getSingleton().getDeviceCapabilities().m_meshShaders)
 		{
 		{
-			m_mesh->getMeshletInfo(l, lod.m_meshletsOffset, lod.m_meshletCount);
+			U32 dummy;
+			m_mesh->getMeshletBufferInfo(l, lod.m_meshletsUgbOffset, dummy);
+
+			lod.m_meshletsUgbOffset += firstMeshlet * sizeof(Meshlet);
+			lod.m_meshletCount = meshletCount;
 		}
 		}
 	}
 	}
 
 

+ 7 - 8
AnKi/Resource/ModelResource.h

@@ -25,7 +25,7 @@ public:
 	AccelerationStructurePtr m_bottomLevelAccelerationStructure;
 	AccelerationStructurePtr m_bottomLevelAccelerationStructure;
 	U32 m_shaderGroupHandleIndex;
 	U32 m_shaderGroupHandleIndex;
 
 
-	PtrSize m_indexBufferOffset;
+	PtrSize m_indexUgbOffset;
 };
 };
 
 
 /// @memberof ModelResource
 /// @memberof ModelResource
@@ -33,14 +33,14 @@ public:
 class ModelPatchGeometryInfo
 class ModelPatchGeometryInfo
 {
 {
 public:
 public:
-	PtrSize m_indexBufferOffset;
+	PtrSize m_indexUgbOffset;
 	U32 m_indexCount;
 	U32 m_indexCount;
 	IndexType m_indexType;
 	IndexType m_indexType;
 
 
 	/// Offset to the vertex buffer or kMaxPtrSize if stream is not present.
 	/// Offset to the vertex buffer or kMaxPtrSize if stream is not present.
-	Array<PtrSize, U32(VertexStreamId::kMeshRelatedCount)> m_vertexBufferOffsets;
+	Array<PtrSize, U32(VertexStreamId::kMeshRelatedCount)> m_vertexUgbOffsets;
 
 
-	PtrSize m_meshletsOffset;
+	PtrSize m_meshletsUgbOffset;
 	U32 m_meshletCount;
 	U32 m_meshletCount;
 
 
 	AccelerationStructurePtr m_blas;
 	AccelerationStructurePtr m_blas;
@@ -76,13 +76,12 @@ private:
 	class Lod
 	class Lod
 	{
 	{
 	public:
 	public:
-		PtrSize m_indexBufferOffset = kMaxPtrSize;
-		U32 m_firstIndex = kMaxU32;
+		PtrSize m_indexUgbOffset = kMaxPtrSize;
 		U32 m_indexCount = kMaxU32;
 		U32 m_indexCount = kMaxU32;
 
 
-		Array<PtrSize, U32(VertexStreamId::kMeshRelatedCount)> m_vertexBufferOffsets = {};
+		Array<PtrSize, U32(VertexStreamId::kMeshRelatedCount)> m_vertexUgbOffsets = {};
 
 
-		PtrSize m_meshletsOffset = kMaxPtrSize;
+		PtrSize m_meshletsUgbOffset = kMaxPtrSize;
 		U32 m_meshletCount = kMaxU32;
 		U32 m_meshletCount = kMaxU32;
 	};
 	};
 
 

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

@@ -156,8 +156,8 @@ Error ModelComponent::update(SceneComponentUpdateInfo& info, Bool& updated)
 				ModelPatchGeometryInfo inf;
 				ModelPatchGeometryInfo inf;
 				patch.getGeometryInfo(l, inf);
 				patch.getGeometryInfo(l, inf);
 
 
-				ANKI_ASSERT((inf.m_indexBufferOffset % getIndexSize(inf.m_indexType)) == 0);
-				meshLod.m_firstIndex = U32(inf.m_indexBufferOffset / getIndexSize(inf.m_indexType));
+				ANKI_ASSERT((inf.m_indexUgbOffset % getIndexSize(inf.m_indexType)) == 0);
+				meshLod.m_firstIndex = U32(inf.m_indexUgbOffset / getIndexSize(inf.m_indexType));
 				meshLod.m_indexCount = inf.m_indexCount;
 				meshLod.m_indexCount = inf.m_indexCount;
 
 
 				for(VertexStreamId stream = VertexStreamId::kMeshRelatedFirst; stream < VertexStreamId::kMeshRelatedCount; ++stream)
 				for(VertexStreamId stream = VertexStreamId::kMeshRelatedFirst; stream < VertexStreamId::kMeshRelatedCount; ++stream)
@@ -165,8 +165,8 @@ Error ModelComponent::update(SceneComponentUpdateInfo& info, Bool& updated)
 					if(mesh.isVertexStreamPresent(stream))
 					if(mesh.isVertexStreamPresent(stream))
 					{
 					{
 						const PtrSize elementSize = getFormatInfo(kMeshRelatedVertexStreamFormats[stream]).m_texelSize;
 						const PtrSize elementSize = getFormatInfo(kMeshRelatedVertexStreamFormats[stream]).m_texelSize;
-						ANKI_ASSERT((inf.m_vertexBufferOffsets[stream] % elementSize) == 0);
-						meshLod.m_vertexOffsets[U32(stream)] = U32(inf.m_vertexBufferOffsets[stream] / elementSize);
+						ANKI_ASSERT((inf.m_vertexUgbOffsets[stream] % elementSize) == 0);
+						meshLod.m_vertexOffsets[U32(stream)] = U32(inf.m_vertexUgbOffsets[stream] / elementSize);
 					}
 					}
 					else
 					else
 					{
 					{
@@ -183,8 +183,8 @@ Error ModelComponent::update(SceneComponentUpdateInfo& info, Bool& updated)
 
 
 				if(inf.m_meshletCount)
 				if(inf.m_meshletCount)
 				{
 				{
-					ANKI_ASSERT((inf.m_meshletsOffset % sizeof(Meshlet)) == 0);
-					meshLod.m_firstMeshlet = U32(inf.m_meshletsOffset / sizeof(Meshlet));
+					ANKI_ASSERT((inf.m_meshletsUgbOffset % sizeof(Meshlet)) == 0);
+					meshLod.m_firstMeshlet = U32(inf.m_meshletsUgbOffset / sizeof(Meshlet));
 					meshLod.m_meshletCount = inf.m_meshletCount;
 					meshLod.m_meshletCount = inf.m_meshletCount;
 				}
 				}
 			}
 			}

+ 1 - 1
AnKi/Shaders/GBufferGeneric.ankiprog

@@ -236,7 +236,7 @@ struct FirstPayload
 	const GpuSceneRenderable renderable = g_renderables[renderableIdx];
 	const GpuSceneRenderable renderable = g_renderables[renderableIdx];
 	const GpuSceneMeshLod meshLod = g_gpuScene.Load<GpuSceneMeshLod>(renderable.m_meshLodsOffset + sizeof(GpuSceneMeshLod) * lod);
 	const GpuSceneMeshLod meshLod = g_gpuScene.Load<GpuSceneMeshLod>(renderable.m_meshLodsOffset + sizeof(GpuSceneMeshLod) * lod);
 	U32 firstMeshlet = meshletGroup * kMeshletGroupSize;
 	U32 firstMeshlet = meshletGroup * kMeshletGroupSize;
-	const U32 meshletCount = min(kMeshletGroupSize, meshLod.m_meshletCount - firstMeshlet * kMeshletGroupSize);
+	const U32 meshletCount = min(kMeshletGroupSize, meshLod.m_meshletCount - firstMeshlet);
 	firstMeshlet += meshLod.m_firstMeshlet;
 	firstMeshlet += meshLod.m_firstMeshlet;
 
 
 	if(svGroupIndex == 0u)
 	if(svGroupIndex == 0u)