diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 6ad5b8631..e361bf355 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -504,7 +504,7 @@ void WrappedVulkan::FlushQ() } } -uint32_t WrappedVulkan::HandlePreCallback(VkCommandBuffer commandBuffer, bool dispatch, +uint32_t WrappedVulkan::HandlePreCallback(VkCommandBuffer commandBuffer, DrawcallFlags type, uint32_t multiDrawOffset) { if(!m_DrawcallCallback) @@ -534,10 +534,12 @@ uint32_t WrappedVulkan::HandlePreCallback(VkCommandBuffer commandBuffer, bool di eventID += multiDrawOffset; - if(dispatch) + if(type == eDraw_Drawcall) + m_DrawcallCallback->PreDraw(eventID, commandBuffer); + else if(type == eDraw_Dispatch) m_DrawcallCallback->PreDispatch(eventID, commandBuffer); else - m_DrawcallCallback->PreDraw(eventID, commandBuffer); + m_DrawcallCallback->PreMisc(eventID, type, commandBuffer); return eventID; } diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 1e47c1f72..1add7a11e 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -144,6 +144,11 @@ struct VulkanDrawcallCallback virtual bool PostDispatch(uint32_t eid, VkCommandBuffer cmd) = 0; virtual void PostRedispatch(uint32_t eid, VkCommandBuffer cmd) = 0; + // finally, these are for copy/blit/resolve/clear/etc + virtual void PreMisc(uint32_t eid, DrawcallFlags flags, VkCommandBuffer cmd) = 0; + virtual bool PostMisc(uint32_t eid, DrawcallFlags flags, VkCommandBuffer cmd) = 0; + virtual void PostRemisc(uint32_t eid, DrawcallFlags flags, VkCommandBuffer cmd) = 0; + // should we re-record all command buffers? this needs to be true if the range // being replayed is larger than one command buffer (which usually means the // whole frame). @@ -242,7 +247,7 @@ private: // util function to handle fetching the right eventID, calling any // aliases then calling PreDraw/PreDispatch. - uint32_t HandlePreCallback(VkCommandBuffer commandBuffer, bool dispatch = false, + uint32_t HandlePreCallback(VkCommandBuffer commandBuffer, DrawcallFlags type = eDraw_Drawcall, uint32_t multiDrawOffset = 0); vector m_SupportedWindowSystems; diff --git a/renderdoc/driver/vulkan/vk_counters.cpp b/renderdoc/driver/vulkan/vk_counters.cpp index b667db616..dd69ce05e 100644 --- a/renderdoc/driver/vulkan/vk_counters.cpp +++ b/renderdoc/driver/vulkan/vk_counters.cpp @@ -90,8 +90,8 @@ struct VulkanGPUTimerCallback : public VulkanDrawcallCallback bool PostDraw(uint32_t eid, VkCommandBuffer cmd) { - ObjDisp(cmd)->CmdWriteTimestamp(Unwrap(cmd), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, - m_QueryPool, (uint32_t)(m_Results.size() * 2 + 1)); + ObjDisp(cmd)->CmdWriteTimestamp(Unwrap(cmd), VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, m_QueryPool, + (uint32_t)(m_Results.size() * 2 + 1)); m_Results.push_back(eid); return false; } @@ -101,6 +101,12 @@ struct VulkanGPUTimerCallback : public VulkanDrawcallCallback void PreDispatch(uint32_t eid, VkCommandBuffer cmd) { PreDraw(eid, cmd); } bool PostDispatch(uint32_t eid, VkCommandBuffer cmd) { return PostDraw(eid, cmd); } void PostRedispatch(uint32_t eid, VkCommandBuffer cmd) { PostRedraw(eid, cmd); } + void PreMisc(uint32_t eid, DrawcallFlags flags, VkCommandBuffer cmd) { PreDraw(eid, cmd); } + bool PostMisc(uint32_t eid, DrawcallFlags flags, VkCommandBuffer cmd) + { + return PostDraw(eid, cmd); + } + void PostRemisc(uint32_t eid, DrawcallFlags flags, VkCommandBuffer cmd) { PostRedraw(eid, cmd); } bool RecordAllCmds() { return true; } void AliasEvent(uint32_t primary, uint32_t alias) { diff --git a/renderdoc/driver/vulkan/vk_debug.cpp b/renderdoc/driver/vulkan/vk_debug.cpp index 23bd6cf28..64e33cead 100644 --- a/renderdoc/driver/vulkan/vk_debug.cpp +++ b/renderdoc/driver/vulkan/vk_debug.cpp @@ -4951,6 +4951,10 @@ struct VulkanQuadOverdrawCallback : public VulkanDrawcallCallback void PreDispatch(uint32_t eid, VkCommandBuffer cmd) {} bool PostDispatch(uint32_t eid, VkCommandBuffer cmd) { return false; } void PostRedispatch(uint32_t eid, VkCommandBuffer cmd) {} + // Ditto copy/etc + void PreMisc(uint32_t eid, DrawcallFlags flags, VkCommandBuffer cmd) {} + bool PostMisc(uint32_t eid, DrawcallFlags flags, VkCommandBuffer cmd) { return false; } + void PostRemisc(uint32_t eid, DrawcallFlags flags, VkCommandBuffer cmd) {} bool RecordAllCmds() { return false; } void AliasEvent(uint32_t primary, uint32_t alias) { diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index f1a2fde98..5b58d2302 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -4551,6 +4551,10 @@ struct VulkanInitPostVSCallback : public VulkanDrawcallCallback void PreDispatch(uint32_t eid, VkCommandBuffer cmd) {} bool PostDispatch(uint32_t eid, VkCommandBuffer cmd) { return false; } void PostRedispatch(uint32_t eid, VkCommandBuffer cmd) {} + // Ditto copy/etc + void PreMisc(uint32_t eid, DrawcallFlags flags, VkCommandBuffer cmd) {} + bool PostMisc(uint32_t eid, DrawcallFlags flags, VkCommandBuffer cmd) { return false; } + void PostRemisc(uint32_t eid, DrawcallFlags flags, VkCommandBuffer cmd) {} bool RecordAllCmds() { return false; } void AliasEvent(uint32_t primary, uint32_t alias) { diff --git a/renderdoc/driver/vulkan/wrappers/vk_draw_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_draw_funcs.cpp index 870008a70..7089383e3 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_draw_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_draw_funcs.cpp @@ -329,7 +329,7 @@ bool WrappedVulkan::Serialise_vkCmdDrawIndirect(Serialiser *localSerialiser, { for(uint32_t i = 0; i < cnt; i++) { - uint32_t eventID = HandlePreCallback(commandBuffer, false, i + 1); + uint32_t eventID = HandlePreCallback(commandBuffer, eDraw_Drawcall, i + 1); ObjDisp(commandBuffer)->CmdDrawIndirect(Unwrap(commandBuffer), Unwrap(buffer), offs, 1, strd); @@ -370,7 +370,7 @@ bool WrappedVulkan::Serialise_vkCmdDrawIndirect(Serialiser *localSerialiser, if(IsDrawInRenderPass()) { - uint32_t eventID = HandlePreCallback(commandBuffer, false, drawidx + 1); + uint32_t eventID = HandlePreCallback(commandBuffer, eDraw_Drawcall, drawidx + 1); ObjDisp(commandBuffer)->CmdDrawIndirect(Unwrap(commandBuffer), Unwrap(buffer), offs, cnt, strd); @@ -606,7 +606,7 @@ bool WrappedVulkan::Serialise_vkCmdDrawIndexedIndirect(Serialiser *localSerialis { for(uint32_t i = 0; i < cnt; i++) { - uint32_t eventID = HandlePreCallback(commandBuffer, false, i + 1); + uint32_t eventID = HandlePreCallback(commandBuffer, eDraw_Drawcall, i + 1); ObjDisp(commandBuffer) ->CmdDrawIndexedIndirect(Unwrap(commandBuffer), Unwrap(buffer), offs, 1, strd); @@ -661,7 +661,7 @@ bool WrappedVulkan::Serialise_vkCmdDrawIndexedIndirect(Serialiser *localSerialis if(IsDrawInRenderPass()) { - uint32_t eventID = HandlePreCallback(commandBuffer, false, drawidx + 1); + uint32_t eventID = HandlePreCallback(commandBuffer, eDraw_Drawcall, drawidx + 1); ObjDisp(commandBuffer) ->CmdDrawIndexedIndirect(Unwrap(commandBuffer), Unwrap(buffer), offs, cnt, strd); @@ -842,7 +842,7 @@ bool WrappedVulkan::Serialise_vkCmdDispatch(Serialiser *localSerialiser, { commandBuffer = RerecordCmdBuf(cmdid); - uint32_t eventID = HandlePreCallback(commandBuffer, true); + uint32_t eventID = HandlePreCallback(commandBuffer, eDraw_Dispatch); ObjDisp(commandBuffer)->CmdDispatch(Unwrap(commandBuffer), X, Y, Z); @@ -921,7 +921,7 @@ bool WrappedVulkan::Serialise_vkCmdDispatchIndirect(Serialiser *localSerialiser, { commandBuffer = RerecordCmdBuf(cmdid); - uint32_t eventID = HandlePreCallback(commandBuffer, true); + uint32_t eventID = HandlePreCallback(commandBuffer, eDraw_Dispatch); ObjDisp(commandBuffer)->CmdDispatchIndirect(Unwrap(commandBuffer), Unwrap(buffer), offs); @@ -1033,9 +1033,21 @@ bool WrappedVulkan::Serialise_vkCmdBlitImage(Serialiser *localSerialiser, if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); + + uint32_t eventID = HandlePreCallback(commandBuffer, eDraw_Resolve); + ObjDisp(commandBuffer) ->CmdBlitImage(Unwrap(commandBuffer), Unwrap(srcImage), srclayout, Unwrap(destImage), dstlayout, count, regions, f); + + if(eventID && m_DrawcallCallback->PostMisc(eventID, eDraw_Resolve, commandBuffer)) + { + ObjDisp(commandBuffer) + ->CmdBlitImage(Unwrap(commandBuffer), Unwrap(srcImage), srclayout, Unwrap(destImage), + dstlayout, count, regions, f); + + m_DrawcallCallback->PostRemisc(eventID, eDraw_Resolve, commandBuffer); + } } } else if(m_State == READING) @@ -1148,9 +1160,21 @@ bool WrappedVulkan::Serialise_vkCmdResolveImage(Serialiser *localSerialiser, if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); + + uint32_t eventID = HandlePreCallback(commandBuffer, eDraw_Resolve); + ObjDisp(commandBuffer) ->CmdResolveImage(Unwrap(commandBuffer), Unwrap(srcImage), srclayout, Unwrap(destImage), dstlayout, count, regions); + + if(eventID && m_DrawcallCallback->PostMisc(eventID, eDraw_Resolve, commandBuffer)) + { + ObjDisp(commandBuffer) + ->CmdResolveImage(Unwrap(commandBuffer), Unwrap(srcImage), srclayout, Unwrap(destImage), + dstlayout, count, regions); + + m_DrawcallCallback->PostRemisc(eventID, eDraw_Resolve, commandBuffer); + } } } else if(m_State == READING) @@ -1263,9 +1287,21 @@ bool WrappedVulkan::Serialise_vkCmdCopyImage(Serialiser *localSerialiser, if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); + + uint32_t eventID = HandlePreCallback(commandBuffer, eDraw_Copy); + ObjDisp(commandBuffer) ->CmdCopyImage(Unwrap(commandBuffer), Unwrap(srcImage), srclayout, Unwrap(destImage), dstlayout, count, regions); + + if(eventID && m_DrawcallCallback->PostMisc(eventID, eDraw_Copy, commandBuffer)) + { + ObjDisp(commandBuffer) + ->CmdCopyImage(Unwrap(commandBuffer), Unwrap(srcImage), srclayout, Unwrap(destImage), + dstlayout, count, regions); + + m_DrawcallCallback->PostRemisc(eventID, eDraw_Copy, commandBuffer); + } } } else if(m_State == READING) @@ -1378,9 +1414,21 @@ bool WrappedVulkan::Serialise_vkCmdCopyBufferToImage(Serialiser *localSerialiser if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); + + uint32_t eventID = HandlePreCallback(commandBuffer, eDraw_Copy); + ObjDisp(commandBuffer) ->CmdCopyBufferToImage(Unwrap(commandBuffer), Unwrap(srcBuffer), Unwrap(destImage), layout, count, regions); + + if(eventID && m_DrawcallCallback->PostMisc(eventID, eDraw_Copy, commandBuffer)) + { + ObjDisp(commandBuffer) + ->CmdCopyBufferToImage(Unwrap(commandBuffer), Unwrap(srcBuffer), Unwrap(destImage), + layout, count, regions); + + m_DrawcallCallback->PostRemisc(eventID, eDraw_Copy, commandBuffer); + } } } else if(m_State == READING) @@ -1484,9 +1532,21 @@ bool WrappedVulkan::Serialise_vkCmdCopyImageToBuffer(Serialiser *localSerialiser if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); + + uint32_t eventID = HandlePreCallback(commandBuffer, eDraw_Copy); + ObjDisp(commandBuffer) ->CmdCopyImageToBuffer(Unwrap(commandBuffer), Unwrap(srcImage), layout, Unwrap(destBuffer), count, regions); + + if(eventID && m_DrawcallCallback->PostMisc(eventID, eDraw_Copy, commandBuffer)) + { + ObjDisp(commandBuffer) + ->CmdCopyImageToBuffer(Unwrap(commandBuffer), Unwrap(srcImage), layout, + Unwrap(destBuffer), count, regions); + + m_DrawcallCallback->PostRemisc(eventID, eDraw_Copy, commandBuffer); + } } } else if(m_State == READING) @@ -1591,9 +1651,21 @@ bool WrappedVulkan::Serialise_vkCmdCopyBuffer(Serialiser *localSerialiser, if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); + + uint32_t eventID = HandlePreCallback(commandBuffer, eDraw_Copy); + ObjDisp(commandBuffer) ->CmdCopyBuffer(Unwrap(commandBuffer), Unwrap(srcBuffer), Unwrap(destBuffer), count, regions); + + if(eventID && m_DrawcallCallback->PostMisc(eventID, eDraw_Copy, commandBuffer)) + { + ObjDisp(commandBuffer) + ->CmdCopyBuffer(Unwrap(commandBuffer), Unwrap(srcBuffer), Unwrap(destBuffer), count, + regions); + + m_DrawcallCallback->PostRemisc(eventID, eDraw_Copy, commandBuffer); + } } } else if(m_State == READING) @@ -1707,8 +1779,23 @@ bool WrappedVulkan::Serialise_vkCmdClearColorImage(Serialiser *localSerialiser, if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); + + uint32_t eventID = + HandlePreCallback(commandBuffer, DrawcallFlags(eDraw_Clear | eDraw_ClearColour)); + ObjDisp(commandBuffer) ->CmdClearColorImage(Unwrap(commandBuffer), Unwrap(image), layout, &col, count, ranges); + + if(eventID && + m_DrawcallCallback->PostMisc(eventID, DrawcallFlags(eDraw_Clear | eDraw_ClearColour), + commandBuffer)) + { + ObjDisp(commandBuffer) + ->CmdClearColorImage(Unwrap(commandBuffer), Unwrap(image), layout, &col, count, ranges); + + m_DrawcallCallback->PostRemisc(eventID, DrawcallFlags(eDraw_Clear | eDraw_ClearColour), + commandBuffer); + } } } else if(m_State == READING) @@ -1795,8 +1882,23 @@ bool WrappedVulkan::Serialise_vkCmdClearDepthStencilImage( if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); + + uint32_t eventID = + HandlePreCallback(commandBuffer, DrawcallFlags(eDraw_Clear | eDraw_ClearDepthStencil)); + ObjDisp(commandBuffer) ->CmdClearDepthStencilImage(Unwrap(commandBuffer), Unwrap(image), l, &ds, count, ranges); + + if(eventID && + m_DrawcallCallback->PostMisc(eventID, DrawcallFlags(eDraw_Clear | eDraw_ClearDepthStencil), + commandBuffer)) + { + ObjDisp(commandBuffer) + ->CmdClearDepthStencilImage(Unwrap(commandBuffer), Unwrap(image), l, &ds, count, ranges); + + m_DrawcallCallback->PostRemisc( + eventID, DrawcallFlags(eDraw_Clear | eDraw_ClearDepthStencil), commandBuffer); + } } } else if(m_State == READING) @@ -1886,7 +1988,17 @@ bool WrappedVulkan::Serialise_vkCmdClearAttachments(Serialiser *localSerialiser, if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); + + uint32_t eventID = HandlePreCallback(commandBuffer, DrawcallFlags(eDraw_Clear)); + ObjDisp(commandBuffer)->CmdClearAttachments(Unwrap(commandBuffer), acount, atts, rcount, rects); + + if(eventID && m_DrawcallCallback->PostMisc(eventID, DrawcallFlags(eDraw_Clear), commandBuffer)) + { + ObjDisp(commandBuffer)->CmdClearAttachments(Unwrap(commandBuffer), acount, atts, rcount, rects); + + m_DrawcallCallback->PostRemisc(eventID, DrawcallFlags(eDraw_Clear), commandBuffer); + } } } else if(m_State == READING)