From bcb08c19488273d2f372ffe1217b567292cf501e Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 27 Jan 2020 11:19:02 +0000 Subject: [PATCH] Treat vkCmdFillBuffer the same as e.g. vkCmdClear*Image, as a draw * We also add 'Clear' usage to the buffer for these events. --- .../driver/vulkan/wrappers/vk_cmd_funcs.cpp | 66 ------------- .../driver/vulkan/wrappers/vk_draw_funcs.cpp | 96 +++++++++++++++++++ 2 files changed, 96 insertions(+), 66 deletions(-) diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index 70caef7b3..2542e92d4 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -2759,68 +2759,6 @@ void WrappedVulkan::vkCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer de } } -template -bool WrappedVulkan::Serialise_vkCmdFillBuffer(SerialiserType &ser, VkCommandBuffer commandBuffer, - VkBuffer destBuffer, VkDeviceSize destOffset, - VkDeviceSize fillSize, uint32_t data) -{ - SERIALISE_ELEMENT(commandBuffer); - SERIALISE_ELEMENT(destBuffer); - SERIALISE_ELEMENT(destOffset); - SERIALISE_ELEMENT(fillSize); - SERIALISE_ELEMENT(data); - - 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) - ->CmdFillBuffer(Unwrap(commandBuffer), Unwrap(destBuffer), destOffset, fillSize, data); - } - } - - return true; -} - -void WrappedVulkan::vkCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer destBuffer, - VkDeviceSize destOffset, VkDeviceSize fillSize, uint32_t data) -{ - SCOPED_DBG_SINK(); - - SERIALISE_TIME_CALL( - ObjDisp(commandBuffer) - ->CmdFillBuffer(Unwrap(commandBuffer), Unwrap(destBuffer), destOffset, fillSize, data)); - - if(IsCaptureMode(m_State)) - { - VkResourceRecord *record = GetRecord(commandBuffer); - - CACHE_THREAD_SERIALISER(); - - SCOPED_SERIALISE_CHUNK(VulkanChunk::vkCmdFillBuffer); - Serialise_vkCmdFillBuffer(ser, commandBuffer, destBuffer, destOffset, fillSize, data); - - record->AddChunk(scope.Get()); - - record->MarkBufferFrameReferenced(GetRecord(destBuffer), destOffset, fillSize, - eFrameRef_CompleteWrite); - } -} - template bool WrappedVulkan::Serialise_vkCmdPushConstants(SerialiserType &ser, VkCommandBuffer commandBuffer, VkPipelineLayout layout, @@ -5438,10 +5376,6 @@ INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdUpdateBuffer, VkCommandBuffer command 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); - 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 a4d1dc6de..8203decd4 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_draw_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_draw_funcs.cpp @@ -2028,6 +2028,98 @@ void WrappedVulkan::vkCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcB } } +template +bool WrappedVulkan::Serialise_vkCmdFillBuffer(SerialiserType &ser, VkCommandBuffer commandBuffer, + VkBuffer destBuffer, VkDeviceSize destOffset, + VkDeviceSize fillSize, uint32_t data) +{ + SERIALISE_ELEMENT(commandBuffer); + SERIALISE_ELEMENT(destBuffer); + SERIALISE_ELEMENT(destOffset); + SERIALISE_ELEMENT(fillSize); + SERIALISE_ELEMENT(data); + + 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, DrawFlags::Clear); + + ObjDisp(commandBuffer) + ->CmdFillBuffer(Unwrap(commandBuffer), Unwrap(destBuffer), destOffset, fillSize, data); + + if(eventId && m_DrawcallCallback->PostMisc(eventId, DrawFlags::Clear, commandBuffer)) + { + ObjDisp(commandBuffer) + ->CmdFillBuffer(Unwrap(commandBuffer), Unwrap(destBuffer), destOffset, fillSize, data); + + m_DrawcallCallback->PostRemisc(eventId, DrawFlags::Clear, commandBuffer); + } + } + } + else + { + ObjDisp(commandBuffer) + ->CmdFillBuffer(Unwrap(commandBuffer), Unwrap(destBuffer), destOffset, fillSize, data); + + { + AddEvent(); + + ResourceId id = GetResourceManager()->GetOriginalID(GetResID(destBuffer)); + + DrawcallDescription draw; + draw.name = StringFormat::Fmt("vkCmdFillBuffer(%s, %u)", ToStr(id).c_str(), data); + draw.flags = DrawFlags::Clear; + draw.copyDestination = id; + + AddDrawcall(draw, true); + + VulkanDrawcallTreeNode &drawNode = GetDrawcallStack().back()->children.back(); + + drawNode.resourceUsage.push_back(make_rdcpair( + GetResID(destBuffer), EventUsage(drawNode.draw.eventId, ResourceUsage::Clear))); + } + } + } + + return true; +} + +void WrappedVulkan::vkCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer destBuffer, + VkDeviceSize destOffset, VkDeviceSize fillSize, uint32_t data) +{ + SCOPED_DBG_SINK(); + + SERIALISE_TIME_CALL( + ObjDisp(commandBuffer) + ->CmdFillBuffer(Unwrap(commandBuffer), Unwrap(destBuffer), destOffset, fillSize, data)); + + if(IsCaptureMode(m_State)) + { + VkResourceRecord *record = GetRecord(commandBuffer); + + CACHE_THREAD_SERIALISER(); + + SCOPED_SERIALISE_CHUNK(VulkanChunk::vkCmdFillBuffer); + Serialise_vkCmdFillBuffer(ser, commandBuffer, destBuffer, destOffset, fillSize, data); + + record->AddChunk(scope.Get()); + + record->MarkBufferFrameReferenced(GetRecord(destBuffer), destOffset, fillSize, + eFrameRef_CompleteWrite); + } +} + template bool WrappedVulkan::Serialise_vkCmdClearColorImage(SerialiserType &ser, VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, @@ -3293,6 +3385,10 @@ INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdCopyImageToBuffer, VkCommandBuffer co VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions); +INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdFillBuffer, VkCommandBuffer commandBuffer, + VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize fillSize, + uint32_t data); + INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdClearColorImage, VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColorValue *pColor, uint32_t rangeCount,