From 3577e67bc1e05006da29c4e651bac5247b13c80a Mon Sep 17 00:00:00 2001 From: Jake Turner Date: Fri, 6 Nov 2026 16:27:25 +0000 Subject: [PATCH] Unify Vulkan RenderState tracking in Loading & Replay: Memory APIs - Serialise_vkCmdCopyImageToMemoryKHR - Serialise_vkCmdCopyMemoryKHR - Serialise_vkCmdFillMemoryKHR - Serialise_vkCmdUpdateMemoryKHR --- .../driver/vulkan/wrappers/vk_draw_funcs.cpp | 131 ++++++++---------- 1 file changed, 59 insertions(+), 72 deletions(-) diff --git a/renderdoc/driver/vulkan/wrappers/vk_draw_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_draw_funcs.cpp index b84966330..6f4d5a89d 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_draw_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_draw_funcs.cpp @@ -5188,38 +5188,35 @@ bool WrappedVulkan::Serialise_vkCmdCopyImageToMemoryKHR( if(IsReplayingAndReading()) { - VkCopyDeviceMemoryImageInfoKHR unwrappedInfo = CopyInfo; - unwrappedInfo.image = Unwrap(unwrappedInfo.image); - - byte *tempMem = GetTempMemory(GetNextPatchSize(unwrappedInfo.pNext)); - - UnwrapNextChain(m_State, "VkCopyDeviceMemoryImageInfoKHR", tempMem, - (VkBaseInStructure *)&unwrappedInfo); - m_LastCmdBufferID = GetResID(commandBuffer); - if(IsActiveReplaying(m_State)) + if(InRerecordRange(m_LastCmdBufferID)) { - if(InRerecordRange(m_LastCmdBufferID)) - { + bool loading = IsLoading(m_State); + if(!loading) commandBuffer = RerecordCmdBuf(m_LastCmdBufferID); - uint32_t eventId = HandlePreCallback(commandBuffer, ActionFlags::Copy); + uint32_t eventId = + !loading ? HandlePreCallback(commandBuffer, ActionFlags(ActionFlags::Copy)) : 0; - ObjDisp(commandBuffer)->CmdCopyImageToMemoryKHR(Unwrap(commandBuffer), &unwrappedInfo); + VkCopyDeviceMemoryImageInfoKHR unwrappedInfo = CopyInfo; + unwrappedInfo.image = Unwrap(unwrappedInfo.image); - if(eventId && m_ActionCallback->PostMisc(eventId, ActionFlags::Copy, commandBuffer)) - { - ObjDisp(commandBuffer)->CmdCopyImageToMemoryKHR(Unwrap(commandBuffer), &unwrappedInfo); + byte *tempMem = GetTempMemory(GetNextPatchSize(unwrappedInfo.pNext)); + + UnwrapNextChain(m_State, "VkCopyDeviceMemoryImageInfoKHR", tempMem, + (VkBaseInStructure *)&unwrappedInfo); - m_ActionCallback->PostRemisc(eventId, ActionFlags::Copy, commandBuffer); - } - } - } - else - { ObjDisp(commandBuffer)->CmdCopyImageToMemoryKHR(Unwrap(commandBuffer), &unwrappedInfo); + if(eventId && m_ActionCallback->PostMisc(eventId, ActionFlags::Copy, commandBuffer)) + { + ObjDisp(commandBuffer)->CmdCopyImageToMemoryKHR(Unwrap(commandBuffer), &unwrappedInfo); + + m_ActionCallback->PostRemisc(eventId, ActionFlags::Copy, commandBuffer); + } + + if(loading) { AddEvent(); @@ -5307,28 +5304,25 @@ bool WrappedVulkan::Serialise_vkCmdCopyMemoryKHR(SerialiserType &ser, VkCommandB { m_LastCmdBufferID = GetResID(commandBuffer); - if(IsActiveReplaying(m_State)) + if(InRerecordRange(m_LastCmdBufferID)) { - if(InRerecordRange(m_LastCmdBufferID)) - { + bool loading = IsLoading(m_State); + if(!loading) commandBuffer = RerecordCmdBuf(m_LastCmdBufferID); - uint32_t eventId = HandlePreCallback(commandBuffer, ActionFlags::Copy); + uint32_t eventId = + !loading ? HandlePreCallback(commandBuffer, ActionFlags(ActionFlags::Copy)) : 0; - ObjDisp(commandBuffer)->CmdCopyMemoryKHR(Unwrap(commandBuffer), &CopyInfo); - - if(eventId && m_ActionCallback->PostMisc(eventId, ActionFlags::Copy, commandBuffer)) - { - ObjDisp(commandBuffer)->CmdCopyMemoryKHR(Unwrap(commandBuffer), &CopyInfo); - - m_ActionCallback->PostRemisc(eventId, ActionFlags::Copy, commandBuffer); - } - } - } - else - { ObjDisp(commandBuffer)->CmdCopyMemoryKHR(Unwrap(commandBuffer), &CopyInfo); + if(eventId && m_ActionCallback->PostMisc(eventId, ActionFlags::Copy, commandBuffer)) + { + ObjDisp(commandBuffer)->CmdCopyMemoryKHR(Unwrap(commandBuffer), &CopyInfo); + + m_ActionCallback->PostRemisc(eventId, ActionFlags::Copy, commandBuffer); + } + + if(loading) { AddEvent(); @@ -5396,28 +5390,25 @@ bool WrappedVulkan::Serialise_vkCmdFillMemoryKHR(SerialiserType &ser, VkCommandB { m_LastCmdBufferID = GetResID(commandBuffer); - if(IsActiveReplaying(m_State)) + if(InRerecordRange(m_LastCmdBufferID)) { - if(InRerecordRange(m_LastCmdBufferID)) - { + bool loading = IsLoading(m_State); + if(!loading) commandBuffer = RerecordCmdBuf(m_LastCmdBufferID); - uint32_t eventId = HandlePreCallback(commandBuffer, ActionFlags::Clear); + uint32_t eventId = + !loading ? HandlePreCallback(commandBuffer, ActionFlags(ActionFlags::Clear)) : 0; - ObjDisp(commandBuffer)->CmdFillMemoryKHR(Unwrap(commandBuffer), &DstRange, dstFlags, data); - - if(eventId && m_ActionCallback->PostMisc(eventId, ActionFlags::Clear, commandBuffer)) - { - ObjDisp(commandBuffer)->CmdFillMemoryKHR(Unwrap(commandBuffer), &DstRange, dstFlags, data); - - m_ActionCallback->PostRemisc(eventId, ActionFlags::Clear, commandBuffer); - } - } - } - else - { ObjDisp(commandBuffer)->CmdFillMemoryKHR(Unwrap(commandBuffer), &DstRange, dstFlags, data); + if(eventId && m_ActionCallback->PostMisc(eventId, ActionFlags::Clear, commandBuffer)) + { + ObjDisp(commandBuffer)->CmdFillMemoryKHR(Unwrap(commandBuffer), &DstRange, dstFlags, data); + + m_ActionCallback->PostRemisc(eventId, ActionFlags::Clear, commandBuffer); + } + + if(loading) { AddEvent(); @@ -5483,31 +5474,27 @@ bool WrappedVulkan::Serialise_vkCmdUpdateMemoryKHR(SerialiserType &ser, VkComman { m_LastCmdBufferID = GetResID(commandBuffer); - if(IsActiveReplaying(m_State)) + if(InRerecordRange(m_LastCmdBufferID)) { - if(InRerecordRange(m_LastCmdBufferID)) - { + bool loading = IsLoading(m_State); + if(!loading) commandBuffer = RerecordCmdBuf(m_LastCmdBufferID); - uint32_t eventId = HandlePreCallback(commandBuffer, ActionFlags::Copy); + uint32_t eventId = + !loading ? HandlePreCallback(commandBuffer, ActionFlags(ActionFlags::Copy)) : 0; - ObjDisp(commandBuffer) - ->CmdUpdateMemoryKHR(Unwrap(commandBuffer), &DstRange, dstFlags, dataSize, Data); - - if(eventId && m_ActionCallback->PostMisc(eventId, ActionFlags::Copy, commandBuffer)) - { - ObjDisp(commandBuffer) - ->CmdUpdateMemoryKHR(Unwrap(commandBuffer), &DstRange, dstFlags, dataSize, Data); - - m_ActionCallback->PostRemisc(eventId, ActionFlags::Copy, commandBuffer); - } - } - } - else - { ObjDisp(commandBuffer) ->CmdUpdateMemoryKHR(Unwrap(commandBuffer), &DstRange, dstFlags, dataSize, Data); + if(eventId && m_ActionCallback->PostMisc(eventId, ActionFlags::Copy, commandBuffer)) + { + ObjDisp(commandBuffer) + ->CmdUpdateMemoryKHR(Unwrap(commandBuffer), &DstRange, dstFlags, dataSize, Data); + + m_ActionCallback->PostRemisc(eventId, ActionFlags::Copy, commandBuffer); + } + + if(loading) { AddEvent();