From 43091746a47012a5cc1db6524acf95636e29b0e0 Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 15 Mar 2022 13:47:25 +0000 Subject: [PATCH] Promote CmdUpdateBuffer to be an action (similar to CmdFillBuffer) * This is more consistent with our definition of actions as anything that can or does significantly mutate a resource. --- .../driver/vulkan/wrappers/vk_cmd_funcs.cpp | 70 ------------ .../driver/vulkan/wrappers/vk_draw_funcs.cpp | 103 ++++++++++++++++++ 2 files changed, 103 insertions(+), 70 deletions(-) diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index 95e94509f..9a777fc8d 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -3632,72 +3632,6 @@ void WrappedVulkan::vkCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer } } -template -bool WrappedVulkan::Serialise_vkCmdUpdateBuffer(SerialiserType &ser, VkCommandBuffer commandBuffer, - VkBuffer destBuffer, VkDeviceSize destOffset, - VkDeviceSize dataSize, const uint32_t *pData) -{ - SERIALISE_ELEMENT(commandBuffer); - SERIALISE_ELEMENT(destBuffer).Important(); - SERIALISE_ELEMENT(destOffset); - SERIALISE_ELEMENT(dataSize); - - // serialise as void* so it goes through as a buffer, not an actual array of integers. - const void *Data = (const void *)pData; - SERIALISE_ELEMENT_ARRAY(Data, dataSize).Important(); - - Serialise_DebugMessages(ser); - - SERIALISE_CHECK_READ_ERRORS(); - - if(IsReplayingAndReading()) - { - m_LastCmdBufferID = GetResourceManager()->GetOriginalID(GetResID(commandBuffer)); - - if(IsActiveReplaying(m_State)) - { - if(InRerecordRange(m_LastCmdBufferID)) - commandBuffer = RerecordCmdBuf(m_LastCmdBufferID); - else - commandBuffer = VK_NULL_HANDLE; - } - - if(commandBuffer != VK_NULL_HANDLE) - { - ObjDisp(commandBuffer) - ->CmdUpdateBuffer(Unwrap(commandBuffer), Unwrap(destBuffer), destOffset, dataSize, Data); - } - } - - return true; -} - -void WrappedVulkan::vkCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer destBuffer, - VkDeviceSize destOffset, VkDeviceSize dataSize, - const uint32_t *pData) -{ - SCOPED_DBG_SINK(); - - SERIALISE_TIME_CALL(ObjDisp(commandBuffer) - ->CmdUpdateBuffer(Unwrap(commandBuffer), Unwrap(destBuffer), destOffset, - dataSize, pData)); - - if(IsCaptureMode(m_State)) - { - VkResourceRecord *record = GetRecord(commandBuffer); - - CACHE_THREAD_SERIALISER(); - - SCOPED_SERIALISE_CHUNK(VulkanChunk::vkCmdUpdateBuffer); - Serialise_vkCmdUpdateBuffer(ser, commandBuffer, destBuffer, destOffset, dataSize, pData); - - record->AddChunk(scope.Get(&record->cmdInfo->alloc)); - - record->MarkBufferFrameReferenced(GetRecord(destBuffer), destOffset, dataSize, - eFrameRef_CompleteWrite); - } -} - template bool WrappedVulkan::Serialise_vkCmdPushConstants(SerialiserType &ser, VkCommandBuffer commandBuffer, VkPipelineLayout layout, @@ -7323,10 +7257,6 @@ INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdBindVertexBuffers, VkCommandBuffer co uint32_t firstBinding, uint32_t bindingCount, const VkBuffer *pBuffers, const VkDeviceSize *pOffsets); -INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdUpdateBuffer, VkCommandBuffer commandBuffer, - VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize, - const uint32_t *pData); - INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdPushConstants, VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size, const void *pValues); diff --git a/renderdoc/driver/vulkan/wrappers/vk_draw_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_draw_funcs.cpp index c1d99127d..d677f73ca 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_draw_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_draw_funcs.cpp @@ -2115,6 +2115,104 @@ void WrappedVulkan::vkCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcB } } +template +bool WrappedVulkan::Serialise_vkCmdUpdateBuffer(SerialiserType &ser, VkCommandBuffer commandBuffer, + VkBuffer destBuffer, VkDeviceSize destOffset, + VkDeviceSize dataSize, const uint32_t *pData) +{ + SERIALISE_ELEMENT(commandBuffer); + SERIALISE_ELEMENT(destBuffer).Important(); + SERIALISE_ELEMENT(destOffset); + SERIALISE_ELEMENT(dataSize); + + // serialise as void* so it goes through as a buffer, not an actual array of integers. + const void *Data = (const void *)pData; + SERIALISE_ELEMENT_ARRAY(Data, dataSize).Important(); + + Serialise_DebugMessages(ser); + + SERIALISE_CHECK_READ_ERRORS(); + + if(IsReplayingAndReading()) + { + m_LastCmdBufferID = GetResourceManager()->GetOriginalID(GetResID(commandBuffer)); + + if(IsActiveReplaying(m_State)) + { + if(InRerecordRange(m_LastCmdBufferID)) + { + commandBuffer = RerecordCmdBuf(m_LastCmdBufferID); + + uint32_t eventId = HandlePreCallback(commandBuffer, ActionFlags::Copy); + + ObjDisp(commandBuffer) + ->CmdUpdateBuffer(Unwrap(commandBuffer), Unwrap(destBuffer), destOffset, dataSize, Data); + + if(eventId && m_ActionCallback->PostMisc(eventId, ActionFlags::Copy, commandBuffer)) + { + ObjDisp(commandBuffer) + ->CmdUpdateBuffer(Unwrap(commandBuffer), Unwrap(destBuffer), destOffset, dataSize, + Data); + + m_ActionCallback->PostRemisc(eventId, ActionFlags::Copy, commandBuffer); + } + } + } + else + { + ObjDisp(commandBuffer) + ->CmdUpdateBuffer(Unwrap(commandBuffer), Unwrap(destBuffer), destOffset, dataSize, Data); + + { + AddEvent(); + + ResourceId id = GetResourceManager()->GetOriginalID(GetResID(destBuffer)); + + ActionDescription action; + action.flags = ActionFlags::Copy; + action.copyDestination = id; + action.copyDestinationSubresource = Subresource(); + + AddAction(action); + + VulkanActionTreeNode &actionNode = GetActionStack().back()->children.back(); + + actionNode.resourceUsage.push_back(make_rdcpair( + GetResID(destBuffer), EventUsage(actionNode.action.eventId, ResourceUsage::CopyDst))); + } + } + } + + return true; +} + +void WrappedVulkan::vkCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer destBuffer, + VkDeviceSize destOffset, VkDeviceSize dataSize, + const uint32_t *pData) +{ + SCOPED_DBG_SINK(); + + SERIALISE_TIME_CALL(ObjDisp(commandBuffer) + ->CmdUpdateBuffer(Unwrap(commandBuffer), Unwrap(destBuffer), destOffset, + dataSize, pData)); + + if(IsCaptureMode(m_State)) + { + VkResourceRecord *record = GetRecord(commandBuffer); + + CACHE_THREAD_SERIALISER(); + + ser.SetActionChunk(); + SCOPED_SERIALISE_CHUNK(VulkanChunk::vkCmdUpdateBuffer); + Serialise_vkCmdUpdateBuffer(ser, commandBuffer, destBuffer, destOffset, dataSize, pData); + + record->AddChunk(scope.Get(&record->cmdInfo->alloc)); + + record->MarkBufferFrameReferenced(GetRecord(destBuffer), destOffset, dataSize, + eFrameRef_CompleteWrite); + } +} + template bool WrappedVulkan::Serialise_vkCmdFillBuffer(SerialiserType &ser, VkCommandBuffer commandBuffer, VkBuffer destBuffer, VkDeviceSize destOffset, @@ -2197,6 +2295,7 @@ void WrappedVulkan::vkCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dest CACHE_THREAD_SERIALISER(); + ser.SetActionChunk(); SCOPED_SERIALISE_CHUNK(VulkanChunk::vkCmdFillBuffer); Serialise_vkCmdFillBuffer(ser, commandBuffer, destBuffer, destOffset, fillSize, data); @@ -4348,6 +4447,10 @@ INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdCopyImageToBuffer, VkCommandBuffer co VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions); +INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdUpdateBuffer, VkCommandBuffer commandBuffer, + VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize, + const uint32_t *pData); + INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdFillBuffer, VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize fillSize, uint32_t data);