Browse Source

Fix alignments of vertex streams

Panagiotis Christopoulos Charitos 3 years ago
parent
commit
676abf24b3
2 changed files with 23 additions and 8 deletions
  1. 20 7
      AnKi/Resource/MeshResource.cpp
  2. 3 1
      AnKi/Resource/MeshResource.h

+ 20 - 7
AnKi/Resource/MeshResource.cpp

@@ -139,10 +139,22 @@ Error MeshResource::load(const ResourceFilename& filename, Bool async)
 			m_presentVertStreams |= VertexStreamMask(1 << stream);
 
 			const U32 texelSize = getFormatInfo(kMeshRelatedVertexStreamFormats[stream]).m_texelSize;
-			const PtrSize vertexBufferSize = PtrSize(lod.m_vertexCount) * texelSize;
-			const U32 alignment = 4;
+			const U32 alignment = max(4u, nextPowerOfTwo(texelSize));
+			const PtrSize vertexBufferSize = PtrSize(lod.m_vertexCount) * texelSize + alignment;
+
 			getExternalSubsystems().m_unifiedGometryMemoryPool->allocate(vertexBufferSize, alignment,
 																		 lod.m_vertexBuffersAllocationToken[stream]);
+
+			// We need to align the actual offset to the texel size
+			const PtrSize remainder = lod.m_vertexBuffersAllocationToken[stream].m_offset % texelSize;
+			lod.m_fixedUniversalGeometryBufferOffset[stream] = U8(texelSize - remainder);
+
+			ANKI_ASSERT(
+				(lod.m_vertexBuffersAllocationToken[stream].m_offset + lod.m_fixedUniversalGeometryBufferOffset[stream])
+					% texelSize
+				== 0);
+			ANKI_ASSERT(lod.m_fixedUniversalGeometryBufferOffset[stream] + PtrSize(lod.m_vertexCount) * texelSize
+						<= lod.m_vertexBuffersAllocationToken[stream].m_size);
 		}
 
 		// BLAS
@@ -158,7 +170,8 @@ Error MeshResource::load(const ResourceFilename& filename, Bool async)
 			inf.m_bottomLevel.m_indexType = m_indexType;
 			inf.m_bottomLevel.m_positionBuffer = getExternalSubsystems().m_unifiedGometryMemoryPool->getBuffer();
 			inf.m_bottomLevel.m_positionBufferOffset =
-				lod.m_vertexBuffersAllocationToken[VertexStreamId::kPosition].m_offset;
+				lod.m_vertexBuffersAllocationToken[VertexStreamId::kPosition].m_offset
+				+ lod.m_fixedUniversalGeometryBufferOffset[VertexStreamId::kPosition];
 			inf.m_bottomLevel.m_positionStride =
 				getFormatInfo(kMeshRelatedVertexStreamFormats[VertexStreamId::kPosition]).m_texelSize;
 			inf.m_bottomLevel.m_positionsFormat = kMeshRelatedVertexStreamFormats[VertexStreamId::kPosition];
@@ -188,9 +201,7 @@ Error MeshResource::load(const ResourceFilename& filename, Bool async)
 				{
 					cmdb->fillBuffer(getExternalSubsystems().m_unifiedGometryMemoryPool->getBuffer(),
 									 lod.m_vertexBuffersAllocationToken[stream].m_offset,
-									 PtrSize(lod.m_vertexCount)
-										 * getFormatInfo(kMeshRelatedVertexStreamFormats[stream]).m_texelSize,
-									 0);
+									 lod.m_vertexBuffersAllocationToken[stream].m_size, 0);
 				}
 			}
 		}
@@ -281,7 +292,9 @@ Error MeshResource::loadAsync(MeshBinaryLoader& loader) const
 
 			// Copy
 			cmdb->copyBufferToBuffer(handle.getBuffer(), handle.getOffset(), unifiedGeometryBuffer,
-									 lod.m_vertexBuffersAllocationToken[stream].m_offset, handle.getRange());
+									 lod.m_vertexBuffersAllocationToken[stream].m_offset
+										 + lod.m_fixedUniversalGeometryBufferOffset[stream],
+									 handle.getRange());
 		}
 	}
 

+ 3 - 1
AnKi/Resource/MeshResource.h

@@ -64,7 +64,8 @@ public:
 	/// Get vertex buffer info.
 	void getVertexStreamInfo(U32 lod, VertexStreamId stream, PtrSize& bufferOffset, U32& vertexCount) const
 	{
-		bufferOffset = m_lods[lod].m_vertexBuffersAllocationToken[stream].m_offset;
+		bufferOffset = m_lods[lod].m_vertexBuffersAllocationToken[stream].m_offset
+					   + m_lods[lod].m_fixedUniversalGeometryBufferOffset[stream];
 		vertexCount = m_lods[lod].m_vertexCount;
 	}
 
@@ -104,6 +105,7 @@ private:
 	public:
 		SegregatedListsGpuMemoryPoolToken m_indexBufferAllocationToken;
 		Array<SegregatedListsGpuMemoryPoolToken, U32(VertexStreamId::kMeshRelatedCount)> m_vertexBuffersAllocationToken;
+		Array<U8, U32(VertexStreamId::kMeshRelatedCount)> m_fixedUniversalGeometryBufferOffset = {};
 
 		U32 m_indexCount = 0;
 		U32 m_vertexCount = 0;