diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index f36ac7c73..7f1149794 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -215,12 +215,12 @@ enum VulkanChunkType COPY_BUF, COPY_IMG, BLIT_IMG, + RESOLVE_IMG, CLEAR_COLOR, CLEAR_DEPTHSTENCIL, CLEAR_COLOR_ATTACH, CLEAR_DEPTHSTENCIL_ATTACH, PIPELINE_BARRIER, - RESOLVE_IMAGE, WRITE_TIMESTAMP, DRAW, DRAW_INDIRECT, diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 63eda4cca..7502a5015 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -117,12 +117,12 @@ const char *VkChunkNames[] = "vkCmdCopyBuffer", "vkCmdCopyImage", "vkCmdBlitImage", + "vkCmdResolveImage", "vkCmdClearColorImage", "vkCmdClearDepthStencilImage", "vkCmdClearColorAttachment", "vkCmdClearDepthStencilAttachment", "vkCmdPipelineBarrier", - "vkCmdResolveImage", "vkCmdWriteTimestamp", "vkCmdDraw", "vkCmdDrawIndirect", @@ -1039,6 +1039,12 @@ void WrappedVulkan::ProcessChunk(uint64_t offset, VulkanChunkType context) case COPY_IMG: Serialise_vkCmdCopyImage(VK_NULL_HANDLE, VK_NULL_HANDLE, VK_IMAGE_LAYOUT_MAX_ENUM, VK_NULL_HANDLE, VK_IMAGE_LAYOUT_MAX_ENUM, 0, NULL); break; + case BLIT_IMG: + Serialise_vkCmdBlitImage(VK_NULL_HANDLE, VK_NULL_HANDLE, VK_IMAGE_LAYOUT_MAX_ENUM, VK_NULL_HANDLE, VK_IMAGE_LAYOUT_MAX_ENUM, 0, NULL, VK_TEX_FILTER_MAX_ENUM); + break; + case RESOLVE_IMG: + Serialise_vkCmdResolveImage(VK_NULL_HANDLE, VK_NULL_HANDLE, VK_IMAGE_LAYOUT_MAX_ENUM, VK_NULL_HANDLE, VK_IMAGE_LAYOUT_MAX_ENUM, 0, NULL); + break; case COPY_BUF: Serialise_vkCmdCopyBuffer(VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE, 0, NULL); break; @@ -1057,10 +1063,6 @@ void WrappedVulkan::ProcessChunk(uint64_t offset, VulkanChunkType context) case PIPELINE_BARRIER: Serialise_vkCmdPipelineBarrier(VK_NULL_HANDLE, 0, 0, VK_FALSE, 0, NULL); break; - case RESOLVE_IMAGE: - //VKTODOMED: - //Serialise_vkCmdResolveImage(VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE, 0, NULL); - break; case WRITE_TIMESTAMP: //VKTODOMED: //Serialise_vkCmdWriteTimestamp(VK_NULL_HANDLE, VK_TIMESTAMP_TYPE_MAX_ENUM, VK_NULL_HANDLE, 0); diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 6bba5e8c3..3f7f9bf77 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -965,6 +965,15 @@ public: const VkImageBlit* pRegions, VkTexFilter filter)); + IMPLEMENT_FUNCTION_SERIALISED(void, vkCmdResolveImage( + VkCmdBuffer cmdBuffer, + VkImage srcImage, + VkImageLayout srcImageLayout, + VkImage destImage, + VkImageLayout destImageLayout, + uint32_t regionCount, + const VkImageResolve* pRegions)); + IMPLEMENT_FUNCTION_SERIALISED(void, vkCmdCopyBufferToImage( VkCmdBuffer cmdBuffer, VkBuffer srcBuffer, diff --git a/renderdoc/driver/vulkan/vk_hookset_defs.h b/renderdoc/driver/vulkan/vk_hookset_defs.h index dedc57578..e3e06d637 100644 --- a/renderdoc/driver/vulkan/vk_hookset_defs.h +++ b/renderdoc/driver/vulkan/vk_hookset_defs.h @@ -128,6 +128,7 @@ HookInit(CmdCopyBuffer); \ HookInit(CmdCopyImage); \ HookInit(CmdBlitImage); \ + HookInit(CmdResolveImage); \ HookInit(CmdClearColorImage); \ HookInit(CmdClearDepthStencilImage); \ HookInit(CmdClearColorAttachment); \ @@ -247,6 +248,7 @@ HookDefine5(void, vkCmdCopyBuffer, VkCmdBuffer, cmdBuffer, VkBuffer, srcBuffer, VkBuffer, destBuffer, uint32_t, regionCount, const VkBufferCopy*, pRegions); \ 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); \ 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_draw_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_draw_funcs.cpp index 42673f40d..d6c443545 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_draw_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_draw_funcs.cpp @@ -180,6 +180,83 @@ void WrappedVulkan::vkCmdBlitImage( } } +bool WrappedVulkan::Serialise_vkCmdResolveImage( + VkCmdBuffer cmdBuffer, + VkImage srcImage, + VkImageLayout srcImageLayout, + VkImage destImage, + VkImageLayout destImageLayout, + uint32_t regionCount, + const VkImageResolve* pRegions) +{ + SERIALISE_ELEMENT(ResourceId, cmdid, GetResID(cmdBuffer)); + SERIALISE_ELEMENT(ResourceId, srcid, GetResID(srcImage)); + SERIALISE_ELEMENT(VkImageLayout, srclayout, srcImageLayout); + SERIALISE_ELEMENT(ResourceId, dstid, GetResID(destImage)); + SERIALISE_ELEMENT(VkImageLayout, dstlayout, destImageLayout); + + if(m_State < WRITING) + m_LastCmdBufferID = cmdid; + + SERIALISE_ELEMENT(uint32_t, count, regionCount); + SERIALISE_ELEMENT_ARR(VkImageResolve, regions, pRegions, count); + + if(m_State == EXECUTING) + { + srcImage = GetResourceManager()->GetLiveHandle(srcid); + destImage = GetResourceManager()->GetLiveHandle(dstid); + + if(IsPartialCmd(cmdid) && InPartialRange()) + { + cmdBuffer = PartialCmdBuf(); + ObjDisp(cmdBuffer)->CmdResolveImage(Unwrap(cmdBuffer), Unwrap(srcImage), srclayout, Unwrap(destImage), dstlayout, count, regions); + } + } + else if(m_State == READING) + { + cmdBuffer = GetResourceManager()->GetLiveHandle(cmdid); + srcImage = GetResourceManager()->GetLiveHandle(srcid); + destImage = GetResourceManager()->GetLiveHandle(dstid); + + ObjDisp(cmdBuffer)->CmdResolveImage(Unwrap(cmdBuffer), Unwrap(srcImage), srclayout, Unwrap(destImage), dstlayout, count, regions); + } + + SAFE_DELETE_ARRAY(regions); + + return true; +} + +void WrappedVulkan::vkCmdResolveImage( + VkCmdBuffer cmdBuffer, + VkImage srcImage, + VkImageLayout srcImageLayout, + VkImage destImage, + VkImageLayout destImageLayout, + uint32_t regionCount, + const VkImageResolve* pRegions) +{ + ObjDisp(cmdBuffer)->CmdResolveImage(Unwrap(cmdBuffer), Unwrap(srcImage), srcImageLayout, Unwrap(destImage), destImageLayout, regionCount, pRegions); + + if(m_State >= WRITING) + { + VkResourceRecord *record = GetRecord(cmdBuffer); + + SCOPED_SERIALISE_CONTEXT(RESOLVE_IMG); + Serialise_vkCmdResolveImage(cmdBuffer, srcImage, srcImageLayout, destImage, destImageLayout, regionCount, pRegions); + + record->AddChunk(scope.Get()); + + record->dirtied.insert(GetResID(destImage)); + { + VkResourceRecord *im = GetRecord(destImage); + if(im->GetMemoryRecord()) + record->dirtied.insert(im->GetMemoryRecord()->GetResourceID()); + } + record->MarkResourceFrameReferenced(GetResID(srcImage), eFrameRef_Read); + record->MarkResourceFrameReferenced(GetResID(destImage), eFrameRef_Write); + } +} + bool WrappedVulkan::Serialise_vkCmdCopyImage( VkCmdBuffer cmdBuffer, VkImage srcImage,