From fe99dcdbe7c0ae49ce472f8c870ba48d1042afd6 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 8 Oct 2015 17:26:49 +0200 Subject: [PATCH] Implement vkCmdUpdateBuffer wrapping --- renderdoc/driver/vulkan/vk_common.h | 1 + renderdoc/driver/vulkan/vk_core.cpp | 4 ++ renderdoc/driver/vulkan/vk_core.h | 7 ++ renderdoc/driver/vulkan/vk_hookset_defs.h | 2 + .../driver/vulkan/wrappers/vk_cmd_funcs.cpp | 70 +++++++++++++++++++ 5 files changed, 84 insertions(+) diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index 95fc591e6..cc6a3c2cd 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -219,6 +219,7 @@ enum VulkanChunkType COPY_IMG, BLIT_IMG, RESOLVE_IMG, + UPDATE_BUF, CLEAR_COLOR, CLEAR_DEPTHSTENCIL, CLEAR_COLOR_ATTACH, diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index ba0dbca92..3c2ddfe60 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -120,6 +120,7 @@ const char *VkChunkNames[] = "vkCmdCopyImage", "vkCmdBlitImage", "vkCmdResolveImage", + "vkCmdUpdateBuffer", "vkCmdClearColorImage", "vkCmdClearDepthStencilImage", "vkCmdClearColorAttachment", @@ -1110,6 +1111,9 @@ void WrappedVulkan::ProcessChunk(uint64_t offset, VulkanChunkType context) case COPY_BUF: Serialise_vkCmdCopyBuffer(GetMainSerialiser(), VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE, 0, NULL); break; + case UPDATE_BUF: + Serialise_vkCmdUpdateBuffer(GetMainSerialiser(), VK_NULL_HANDLE, VK_NULL_HANDLE, 0, 0, NULL); + break; case CLEAR_COLOR: Serialise_vkCmdClearColorImage(GetMainSerialiser(), VK_NULL_HANDLE, VK_NULL_HANDLE, VK_IMAGE_LAYOUT_MAX_ENUM, NULL, 0, NULL); break; diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 5a110bd30..cf1b37eaa 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -1062,6 +1062,13 @@ public: uint32_t regionCount, const VkBufferImageCopy* pRegions); + IMPLEMENT_FUNCTION_SERIALISED(void, vkCmdUpdateBuffer, + VkCmdBuffer cmdBuffer, + VkBuffer destBuffer, + VkDeviceSize destOffset, + VkDeviceSize dataSize, + const uint32_t* pData); + IMPLEMENT_FUNCTION_SERIALISED(void, vkCmdClearColorImage, VkCmdBuffer cmdBuffer, VkImage image, diff --git a/renderdoc/driver/vulkan/vk_hookset_defs.h b/renderdoc/driver/vulkan/vk_hookset_defs.h index 1e1c76476..c07a6f761 100644 --- a/renderdoc/driver/vulkan/vk_hookset_defs.h +++ b/renderdoc/driver/vulkan/vk_hookset_defs.h @@ -132,6 +132,7 @@ HookInit(CmdCopyImage); \ HookInit(CmdBlitImage); \ HookInit(CmdResolveImage); \ + HookInit(CmdUpdateBuffer); \ HookInit(CmdClearColorImage); \ HookInit(CmdClearDepthStencilImage); \ HookInit(CmdClearColorAttachment); \ @@ -258,6 +259,7 @@ HookDefine7(void, vkCmdCopyImage, VkCmdBuffer, cmdBuffer, VkImage, srcImage, VkImageLayout, srcImageLayout, VkImage, destImage, VkImageLayout, destImageLayout, uint32_t, regionCount, const VkImageCopy*, pRegions); \ HookDefine8(void, vkCmdBlitImage, VkCmdBuffer, cmdBuffer, VkImage, srcImage, VkImageLayout, srcImageLayout, VkImage, destImage, VkImageLayout, destImageLayout, uint32_t, regionCount, const VkImageBlit*, pRegions, VkTexFilter, filter); \ HookDefine7(void, vkCmdResolveImage, VkCmdBuffer, cmdBuffer, VkImage, srcImage, VkImageLayout, srcImageLayout, VkImage, destImage, VkImageLayout, destImageLayout, uint32_t, regionCount, const VkImageResolve*, pRegions); \ + HookDefine5(void, vkCmdUpdateBuffer, VkCmdBuffer, cmdBuffer, VkBuffer, destBuffer, VkDeviceSize, destOffset, VkDeviceSize, dataSize, const uint32_t*, pData); \ HookDefine6(void, vkCmdClearColorImage, VkCmdBuffer, cmdBuffer, VkImage, image, VkImageLayout, imageLayout, const VkClearColorValue*, pColor, uint32_t, rangeCount, const VkImageSubresourceRange*, pRanges); \ HookDefine7(void, vkCmdClearDepthStencilImage, VkCmdBuffer, cmdBuffer, VkImage, image, VkImageLayout, imageLayout, float, depth, uint32_t, stencil, uint32_t, rangeCount, const VkImageSubresourceRange*, pRanges); \ HookDefine6(void, vkCmdClearColorAttachment, VkCmdBuffer, cmdBuffer, uint32_t, colorAttachment, VkImageLayout, imageLayout, const VkClearColorValue*, pColor, uint32_t, rectCount, const VkRect3D*, pRects); \ diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index 6d7603efd..c18150dae 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -1213,6 +1213,76 @@ void WrappedVulkan::vkCmdBindIndexBuffer( } } +bool WrappedVulkan::Serialise_vkCmdUpdateBuffer( + Serialiser* localSerialiser, + VkCmdBuffer cmdBuffer, + VkBuffer destBuffer, + VkDeviceSize destOffset, + VkDeviceSize dataSize, + const uint32_t* pData) +{ + SERIALISE_ELEMENT(ResourceId, cmdid, GetResID(cmdBuffer)); + SERIALISE_ELEMENT(ResourceId, bufid, GetResID(destBuffer)); + SERIALISE_ELEMENT(VkDeviceSize, offs, destOffset); + SERIALISE_ELEMENT(VkDeviceSize, sz, dataSize); + SERIALISE_ELEMENT_BUF(byte *, bufdata, (byte *)pData, (size_t)dataSize); + + if(m_State < WRITING) + m_LastCmdBufferID = cmdid; + + if(m_State == EXECUTING) + { + destBuffer = GetResourceManager()->GetLiveHandle(bufid); + + if(IsPartialCmd(cmdid) && InPartialRange()) + { + cmdBuffer = PartialCmdBuf(); + ObjDisp(cmdBuffer)->CmdUpdateBuffer(Unwrap(cmdBuffer), Unwrap(destBuffer), offs, sz, (uint32_t *)bufdata); + } + } + else if(m_State == READING) + { + cmdBuffer = GetResourceManager()->GetLiveHandle(cmdid); + destBuffer = GetResourceManager()->GetLiveHandle(bufid); + + ObjDisp(cmdBuffer)->CmdUpdateBuffer(Unwrap(cmdBuffer), Unwrap(destBuffer), offs, sz, (uint32_t *)bufdata); + } + + SAFE_DELETE_ARRAY(bufdata); + + return true; +} + +void WrappedVulkan::vkCmdUpdateBuffer( + VkCmdBuffer cmdBuffer, + VkBuffer destBuffer, + VkDeviceSize destOffset, + VkDeviceSize dataSize, + const uint32_t* pData) +{ + ObjDisp(cmdBuffer)->CmdUpdateBuffer(Unwrap(cmdBuffer), Unwrap(destBuffer), destOffset, dataSize, pData); + + if(m_State >= WRITING) + { + VkResourceRecord *record = GetRecord(cmdBuffer); + + CACHE_THREAD_SERIALISER(); + + SCOPED_SERIALISE_CONTEXT(UPDATE_BUF); + Serialise_vkCmdUpdateBuffer(localSerialiser, cmdBuffer, destBuffer, destOffset, dataSize, pData); + + record->AddChunk(scope.Get()); + record->MarkResourceFrameReferenced(GetResID(destBuffer), eFrameRef_Write); + + // Don't dirty the buffer, just the memory behind it. + { + VkResourceRecord *buf = GetRecord(destBuffer); + if(buf->GetMemoryRecord()) + record->dirtied.insert(buf->GetMemoryRecord()->GetResourceID()); + } + } +} + bool WrappedVulkan::Serialise_vkCmdPipelineBarrier( Serialiser* localSerialiser, VkCmdBuffer cmdBuffer,