From 205a8b2ebe30e01d83c3cb0cc8be45a2307c0e10 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Fri, 30 Jan 2026 15:10:31 +0100 Subject: [PATCH] Fix GPU Vertex Layout usage with explicit offsets to properly hash and calculates stride #3625 --- Source/Engine/Graphics/Shaders/GPUVertexLayout.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Source/Engine/Graphics/Shaders/GPUVertexLayout.cpp b/Source/Engine/Graphics/Shaders/GPUVertexLayout.cpp index 23382673f..05c6d605a 100644 --- a/Source/Engine/Graphics/Shaders/GPUVertexLayout.cpp +++ b/Source/Engine/Graphics/Shaders/GPUVertexLayout.cpp @@ -59,7 +59,7 @@ namespace elements.Get()[j].Slot = (byte)slot; } } - GPUVertexLayout* result = anyValid ? GPUVertexLayout::Get(elements) : nullptr; + GPUVertexLayout* result = anyValid ? GPUVertexLayout::Get(elements, true) : nullptr; VertexBufferCache.Add(key, result); return result; } @@ -97,6 +97,7 @@ GPUVertexLayout::GPUVertexLayout() void GPUVertexLayout::SetElements(const Elements& elements, bool explicitOffsets) { uint32 offsets[GPU_MAX_VB_BINDED + 1] = {}; + uint32 maxOffset[GPU_MAX_VB_BINDED + 1] = {}; _elements = elements; for (int32 i = 0; i < _elements.Count(); i++) { @@ -108,9 +109,10 @@ void GPUVertexLayout::SetElements(const Elements& elements, bool explicitOffsets else e.Offset = (byte)offset; offset += PixelFormatExtensions::SizeInBytes(e.Format); + maxOffset[e.Slot] = Math::Max(maxOffset[e.Slot], offset); } _stride = 0; - for (uint32 offset : offsets) + for (uint32 offset : maxOffset) _stride += offset; } @@ -139,7 +141,7 @@ VertexElement GPUVertexLayout::FindElement(VertexElement::Types type) const GPUVertexLayout* GPUVertexLayout::Get(const Elements& elements, bool explicitOffsets) { // Hash input layout - uint32 hash = 0; + uint32 hash = explicitOffsets ? 131 : 0; for (const VertexElement& element : elements) { CombineHash(hash, GetHash(element));