diff --git a/renderdoc/driver/vulkan/vk_common.cpp b/renderdoc/driver/vulkan/vk_common.cpp index c8f22b957..fad953e91 100644 --- a/renderdoc/driver/vulkan/vk_common.cpp +++ b/renderdoc/driver/vulkan/vk_common.cpp @@ -1549,6 +1549,19 @@ void Serialiser::Serialise(const char *name, VkClearColorValue &el) Serialise<4>("u32", el.u32); } +template<> +void Serialiser::Serialise(const char *name, VkCmdPoolCreateInfo &el) +{ + ScopedContext scope(this, this, name, "VkCmdPoolCreateInfo", 0, true); + + RDCASSERT(m_Mode < WRITING || el.sType == VK_STRUCTURE_TYPE_CMD_POOL_CREATE_INFO); + Serialise("sType", el.sType); + SerialiseNext(this, el.pNext); + + Serialise("queueFamilyIndex", el.queueFamilyIndex); + Serialise("flags", (VkCmdPoolCreateFlagBits &)el.flags); +} + template<> void Serialiser::Serialise(const char *name, VkCmdBufferCreateInfo &el) { diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index 4503b9269..9b903a497 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -76,6 +76,7 @@ template<> void Serialiser::Serialise(const char *name, VkDescriptorPoolCreateIn template<> void Serialiser::Serialise(const char *name, VkWriteDescriptorSet &el); template<> void Serialiser::Serialise(const char *name, VkCopyDescriptorSet &el); template<> void Serialiser::Serialise(const char *name, VkClearColorValue &el); +template<> void Serialiser::Serialise(const char *name, VkCmdPoolCreateInfo &el); template<> void Serialiser::Serialise(const char *name, VkCmdBufferCreateInfo &el); template<> void Serialiser::Serialise(const char *name, VkCmdBufferBeginInfo &el); template<> void Serialiser::Serialise(const char *name, VkStencilOpState &el); @@ -114,6 +115,10 @@ enum VulkanChunkType ALLOC_MEM, UNMAP_MEM, FREE_MEM, + + CREATE_CMD_POOL, + RESET_CMD_POOL, + CREATE_CMD_BUFFER, CREATE_FRAMEBUFFER, CREATE_RENDERPASS, diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index fdcf1ba4c..afbf0f82c 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -48,6 +48,10 @@ const char *VkChunkNames[] = "vkAllocMemory", "vkUnmapMemory", "vkFreeMemory", + + "vkCreateCommandPool", + "vkResetCommandPool", + "vkCreateCommandBuffer", "vkCreateFramebuffer", "vkCreateRenderPass", @@ -743,6 +747,7 @@ DESTROY_IMPL(VkDynamicViewportState, vkDestroyDynamicViewportState) DESTROY_IMPL(VkDynamicRasterState, vkDestroyDynamicRasterState) DESTROY_IMPL(VkDynamicColorBlendState, vkDestroyDynamicColorBlendState) DESTROY_IMPL(VkDynamicDepthStencilState, vkDestroyDynamicDepthStencilState) +DESTROY_IMPL(VkCmdPool, vkDestroyCommandPool) DESTROY_IMPL(VkCmdBuffer, vkDestroyCommandBuffer) DESTROY_IMPL(VkFramebuffer, vkDestroyFramebuffer) DESTROY_IMPL(VkRenderPass, vkDestroyRenderPass) @@ -2596,6 +2601,81 @@ VkResult WrappedVulkan::vkCreateDynamicDepthStencilState( return ret; } +// Command pool functions + +bool WrappedVulkan::Serialise_vkCreateCommandPool( + VkDevice device, + const VkCmdPoolCreateInfo* pCreateInfo, + VkCmdPool* pCmdPool) +{ + SERIALISE_ELEMENT(ResourceId, devId, GetResourceManager()->GetID(MakeRes(device))); + SERIALISE_ELEMENT(VkCmdPoolCreateInfo, info, *pCreateInfo); + SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(MakeRes(*pCmdPool))); + + if(m_State == READING) + { + VkCmdPool pool = VK_NULL_HANDLE; + + VkResult ret = m_Real.vkCreateCommandPool((VkDevice)GetResourceManager()->GetLiveResource(devId).handle, &info, &pool); + + if(ret != VK_SUCCESS) + { + RDCERR("Failed on resource serialise-creation, VkResult: 0x%08x", ret); + } + else + { + ResourceId live = GetResourceManager()->RegisterResource(MakeRes(pool)); + GetResourceManager()->AddLiveResource(id, MakeRes(pool)); + } + } + + return true; +} + +VkResult WrappedVulkan::vkCreateCommandPool( + VkDevice device, + const VkCmdPoolCreateInfo* pCreateInfo, + VkCmdPool* pCmdPool) +{ + VkResult ret = m_Real.vkCreateCommandPool(device, pCreateInfo, pCmdPool); + + if(ret == VK_SUCCESS) + { + VkResource res = MakeRes(*pCmdPool); + ResourceId id = GetResourceManager()->RegisterResource(res); + + if(m_State >= WRITING) + { + Chunk *chunk = NULL; + + { + SCOPED_SERIALISE_CONTEXT(CREATE_CMD_POOL); + Serialise_vkCreateCommandPool(device, pCreateInfo, pCmdPool); + + chunk = scope.Get(); + } + + m_DeviceRecord->AddChunk(chunk); + } + else + { + GetResourceManager()->AddLiveResource(id, res); + } + } + + return ret; +} + +VkResult WrappedVulkan::vkResetCommandPool( + VkDevice device, + VkCmdPool cmdPool, + VkCmdPoolResetFlags flags) +{ + // VKTODO do I need to serialise this? just a driver hint.. + return vkResetCommandPool(device, cmdPool, flags); +} + + // Command buffer functions VkResult WrappedVulkan::vkCreateCommandBuffer( @@ -5344,6 +5424,9 @@ void WrappedVulkan::ProcessChunk(uint64_t offset, VulkanChunkType context) case FREE_MEM: Serialise_vkFreeMemory(VK_NULL_HANDLE, VK_NULL_HANDLE); break; + case CREATE_CMD_POOL: + Serialise_vkCreateCommandPool(VK_NULL_HANDLE, NULL, NULL); + break; case CREATE_CMD_BUFFER: RDCERR("vkCreateCommandBuffer should not be serialised directly"); break; diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index e5265bd79..9b774abe0 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -598,6 +598,22 @@ public: VkDevice device, VkDynamicDepthStencilState state)); + // Command pool functions + + IMPLEMENT_FUNCTION_SERIALISED(VkResult, vkCreateCommandPool( + VkDevice device, + const VkCmdPoolCreateInfo* pCreateInfo, + VkCmdPool* pCmdPool)); + + IMPLEMENT_FUNCTION_SERIALISED(VkResult, vkDestroyCommandPool( + VkDevice device, + VkCmdPool VkCmdPool)); + + IMPLEMENT_FUNCTION_SERIALISED(VkResult, vkResetCommandPool( + VkDevice device, + VkCmdPool VkCmdPool, + VkCmdPoolResetFlags flags)); + // Command buffer functions IMPLEMENT_FUNCTION_SERIALISED(VkResult, vkCreateCommandBuffer( diff --git a/renderdoc/driver/vulkan/vk_hookset_defs.h b/renderdoc/driver/vulkan/vk_hookset_defs.h index fa9b96b7d..339d8dea2 100644 --- a/renderdoc/driver/vulkan/vk_hookset_defs.h +++ b/renderdoc/driver/vulkan/vk_hookset_defs.h @@ -86,6 +86,9 @@ HookInit(vkDestroyDynamicColorBlendState); \ HookInit(vkCreateDynamicDepthStencilState); \ HookInit(vkDestroyDynamicDepthStencilState); \ + HookInit(vkCreateCommandPool); \ + HookInit(vkDestroyCommandPool); \ + HookInit(vkResetCommandPool); \ HookInit(vkCreateCommandBuffer); \ HookInit(vkDestroyCommandBuffer); \ HookInit(vkBeginCommandBuffer); \ @@ -194,6 +197,9 @@ HookDefine2(VkResult, vkDestroyDynamicColorBlendState, VkDevice, device, VkDynamicColorBlendState, state); \ HookDefine3(VkResult, vkCreateDynamicDepthStencilState, VkDevice, device, const VkDynamicDepthStencilStateCreateInfo*, pCreateInfo, VkDynamicDepthStencilState*, pState); \ HookDefine2(VkResult, vkDestroyDynamicDepthStencilState, VkDevice, device, VkDynamicDepthStencilState, state); \ + HookDefine3(VkResult, vkCreateCommandPool, VkDevice, device, const VkCmdPoolCreateInfo*, pCreateInfo, VkCmdPool*, pCmdPool); \ + HookDefine2(VkResult, vkDestroyCommandPool, VkDevice, device, VkCmdPool, cmdPool); \ + HookDefine3(VkResult, vkResetCommandPool, VkDevice, device, VkCmdPool, cmdPool, VkCmdPoolResetFlags, flags); \ HookDefine3(VkResult, vkCreateCommandBuffer, VkDevice, device, const VkCmdBufferCreateInfo*, pCreateInfo, VkCmdBuffer*, pCmdBuffer); \ HookDefine2(VkResult, vkDestroyCommandBuffer, VkDevice, device, VkCmdBuffer, cmdBuffer); \ HookDefine2(VkResult, vkBeginCommandBuffer, VkCmdBuffer, cmdBuffer, const VkCmdBufferBeginInfo*, pBeginInfo); \ diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index d833a91fa..a8f26c350 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -58,6 +58,7 @@ enum VkNamespace eResMSAAState, eResColorBlendState, eResDepthStencilState, + eResCmdPool, eResCmdBuffer, eResCmdBufferBake, eResFence, @@ -101,6 +102,7 @@ inline VkResource MakeRes(VkInstance o) { return VkResource(eResInstance, (uint6 inline VkResource MakeRes(VkDevice o) { return VkResource(eResDevice, (uint64_t)o); } inline VkResource MakeRes(VkQueue o) { return VkResource(eResQueue, (uint64_t)o); } inline VkResource MakeRes(VkCmdBuffer o) { return VkResource(eResCmdBuffer, (uint64_t)o); } +inline VkResource MakeRes(VkCmdPool o) { return VkResource(eResCmdPool, o.handle); } inline VkResource MakeRes(VkDeviceMemory o) { return VkResource(eResDeviceMemory, o.handle); } inline VkResource MakeRes(VkBuffer o) { return VkResource(eResBuffer, o.handle); } inline VkResource MakeRes(VkBufferView o) { return VkResource(eResBufferView, o.handle); }