From 87a3a56c8fb6738c9641a6ed2a733940b36e489d Mon Sep 17 00:00:00 2001 From: Jake Turner Date: Tue, 19 Aug 2025 07:29:17 +0100 Subject: [PATCH] Clamp Vulkan Mesh Rendering index buffer offset to be in bounds --- renderdoc/driver/vulkan/vk_rendermesh.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_rendermesh.cpp b/renderdoc/driver/vulkan/vk_rendermesh.cpp index 230b433fb..6b5850bfc 100644 --- a/renderdoc/driver/vulkan/vk_rendermesh.cpp +++ b/renderdoc/driver/vulkan/vk_rendermesh.cpp @@ -642,7 +642,10 @@ void VulkanReplay::RenderMesh(uint32_t eventId, const rdcarray &seco VkBuffer ib = m_pDriver->GetResourceManager()->GetLiveHandle(fmt.indexResourceId); - vt->CmdBindIndexBuffer(Unwrap(cmd), Unwrap(ib), fmt.indexByteOffset, idxtype); + const VulkanCreationInfo::Buffer &bufProps = + m_pDriver->m_CreationInfo.m_Buffer[fmt.indexResourceId]; + uint64_t ibOffs = RDCMIN(fmt.indexByteOffset, bufProps.size); + vt->CmdBindIndexBuffer(Unwrap(cmd), Unwrap(ib), ibOffs, idxtype); } vt->CmdDrawIndexed(Unwrap(cmd), fmt.numIndices, 1, 0, fmt.baseVertex, 0); } @@ -804,7 +807,10 @@ void VulkanReplay::RenderMesh(uint32_t eventId, const rdcarray &seco VkBuffer ib = m_pDriver->GetResourceManager()->GetCurrentHandle(cfg.position.indexResourceId); - vt->CmdBindIndexBuffer(Unwrap(cmd), Unwrap(ib), cfg.position.indexByteOffset, idxtype); + const VulkanCreationInfo::Buffer &bufProps = + m_pDriver->m_CreationInfo.m_Buffer[cfg.position.indexResourceId]; + uint64_t ibOffs = RDCMIN(cfg.position.indexByteOffset, bufProps.size); + vt->CmdBindIndexBuffer(Unwrap(cmd), Unwrap(ib), ibOffs, idxtype); } vt->CmdDrawIndexed(Unwrap(cmd), cfg.position.numIndices, 1, 0, cfg.position.baseVertex, 0); } @@ -852,7 +858,10 @@ void VulkanReplay::RenderMesh(uint32_t eventId, const rdcarray &seco VkBuffer ib = m_pDriver->GetResourceManager()->GetCurrentHandle(cfg.position.indexResourceId); - vt->CmdBindIndexBuffer(Unwrap(cmd), Unwrap(ib), cfg.position.indexByteOffset, idxtype); + const VulkanCreationInfo::Buffer &bufProps = + m_pDriver->m_CreationInfo.m_Buffer[cfg.position.indexResourceId]; + uint64_t ibOffs = RDCMIN(cfg.position.indexByteOffset, bufProps.size); + vt->CmdBindIndexBuffer(Unwrap(cmd), Unwrap(ib), ibOffs, idxtype); } vt->CmdDrawIndexed(Unwrap(cmd), cfg.position.numIndices, 1, 0, cfg.position.baseVertex, 0); }