diff --git a/renderdoc/driver/vulkan/vk_common.cpp b/renderdoc/driver/vulkan/vk_common.cpp index a4c2857ee..b4496f0a1 100644 --- a/renderdoc/driver/vulkan/vk_common.cpp +++ b/renderdoc/driver/vulkan/vk_common.cpp @@ -1716,6 +1716,20 @@ void Serialiser::Serialise(const char *name, VkStencilOpState &el) Serialise("stencilCompareOp", el.stencilCompareOp); } +template<> +void Serialiser::Serialise(const char *name, VkSemaphoreCreateInfo &el) +{ + ScopedContext scope(this, this, name, "VkSemaphoreCreateInfo", 0, true); + + RDCASSERT(m_Mode < WRITING || el.sType == VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO); + Serialise("sType", el.sType); + SerialiseNext(this, el.pNext); + + // VKTODO if this enum gets any bits, cast to Vk*FlagBits + // for strongly typed serialising + Serialise("flags", el.flags); +} + template<> void Serialiser::Serialise(const char *name, VkSamplerCreateInfo &el) { diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index 7b5924c0c..dd38e74a3 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -81,6 +81,7 @@ 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); +template<> void Serialiser::Serialise(const char *name, VkSemaphoreCreateInfo &el); template<> void Serialiser::Serialise(const char *name, VkSamplerCreateInfo &el); template<> void Serialiser::Serialise(const char *name, VkPipelineCacheCreateInfo &el); template<> void Serialiser::Serialise(const char *name, VkShaderCreateInfo &el); @@ -145,6 +146,7 @@ enum VulkanChunkType CREATE_COMPUTE_PIPE, PRESENT_IMAGE, + CREATE_SEMAPHORE, CREATE_FENCE, GET_FENCE_STATUS, WAIT_FENCES, @@ -156,6 +158,8 @@ enum VulkanChunkType BEGIN_CMD_BUFFER, END_CMD_BUFFER, + QUEUE_SIGNAL_SEMAPHORE, + QUEUE_WAIT_SEMAPHORE, QUEUE_WAIT_IDLE, DEVICE_WAIT_IDLE, diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 0bdde8d94..b7a1ce118 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -79,6 +79,7 @@ const char *VkChunkNames[] = "vkCreateComputePipelines", "vkGetSwapChainInfoWSI", + "vkCreateSemaphore", "vkCreateFence", "vkGetFenceStatus", "vkWaitForFences", @@ -90,6 +91,8 @@ const char *VkChunkNames[] = "vkBeginCommandBuffer", "vkEndCommandBuffer", + "vkQueueSignalSemaphore", + "vkQueueWaitSemaphore", "vkQueueWaitIdle", "vkDeviceWaitIdle", @@ -878,6 +881,7 @@ DESTROY_IMPL(VkDynamicViewportState, vkDestroyDynamicViewportState) DESTROY_IMPL(VkDynamicRasterState, vkDestroyDynamicRasterState) DESTROY_IMPL(VkDynamicColorBlendState, vkDestroyDynamicColorBlendState) DESTROY_IMPL(VkDynamicDepthStencilState, vkDestroyDynamicDepthStencilState) +DESTROY_IMPL(VkSemaphore, vkDestroySemaphore) DESTROY_IMPL(VkCmdPool, vkDestroyCommandPool) DESTROY_IMPL(VkCmdBuffer, vkDestroyCommandBuffer) DESTROY_IMPL(VkFramebuffer, vkDestroyFramebuffer) @@ -1067,6 +1071,64 @@ VkResult WrappedVulkan::vkQueueSubmit( return ret; } +bool WrappedVulkan::Serialise_vkQueueSignalSemaphore(VkQueue queue, VkSemaphore semaphore) +{ + SERIALISE_ELEMENT(ResourceId, qid, GetResourceManager()->GetID(MakeRes(queue))); + SERIALISE_ELEMENT(ResourceId, sid, GetResourceManager()->GetID(MakeRes(semaphore))); + + if(m_State < WRITING) + { + m_Real.vkQueueSignalSemaphore((VkQueue)GetResourceManager()->GetLiveResource(qid).handle, + (VkSemaphore)GetResourceManager()->GetLiveResource(sid).handle); + } + + return true; +} + +VkResult WrappedVulkan::vkQueueSignalSemaphore(VkQueue queue, VkSemaphore semaphore) +{ + VkResult ret = m_Real.vkQueueSignalSemaphore(queue, semaphore); + + if(m_State >= WRITING) + { + SCOPED_SERIALISE_CONTEXT(QUEUE_SIGNAL_SEMAPHORE); + Serialise_vkQueueSignalSemaphore(queue, semaphore); + + m_ContextRecord->AddChunk(scope.Get()); + } + + return ret; +} + +bool WrappedVulkan::Serialise_vkQueueWaitSemaphore(VkQueue queue, VkSemaphore semaphore) +{ + SERIALISE_ELEMENT(ResourceId, qid, GetResourceManager()->GetID(MakeRes(queue))); + SERIALISE_ELEMENT(ResourceId, sid, GetResourceManager()->GetID(MakeRes(semaphore))); + + if(m_State < WRITING) + { + m_Real.vkQueueWaitSemaphore((VkQueue)GetResourceManager()->GetLiveResource(qid).handle, + (VkSemaphore)GetResourceManager()->GetLiveResource(sid).handle); + } + + return true; +} + +VkResult WrappedVulkan::vkQueueWaitSemaphore(VkQueue queue, VkSemaphore semaphore) +{ + VkResult ret = m_Real.vkQueueWaitSemaphore(queue, semaphore); + + if(m_State >= WRITING) + { + SCOPED_SERIALISE_CONTEXT(QUEUE_WAIT_SEMAPHORE); + Serialise_vkQueueWaitSemaphore(queue, semaphore); + + m_ContextRecord->AddChunk(scope.Get()); + } + + return ret; +} + bool WrappedVulkan::Serialise_vkQueueWaitIdle(VkQueue queue) { SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(MakeRes(queue))); @@ -2407,6 +2469,70 @@ VkResult WrappedVulkan::vkCreateSampler( return ret; } +bool WrappedVulkan::Serialise_vkCreateSemaphore( + VkDevice device, + const VkSemaphoreCreateInfo* pCreateInfo, + VkSemaphore* pSemaphore) +{ + SERIALISE_ELEMENT(ResourceId, devId, GetResourceManager()->GetID(MakeRes(device))); + SERIALISE_ELEMENT(VkSemaphoreCreateInfo, info, *pCreateInfo); + SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(MakeRes(*pSemaphore))); + + if(m_State == READING) + { + VkSemaphore sem = VK_NULL_HANDLE; + + VkResult ret = m_Real.vkCreateSemaphore((VkDevice)GetResourceManager()->GetLiveResource(devId).handle, &info, &sem); + + if(ret != VK_SUCCESS) + { + RDCERR("Failed on resource serialise-creation, VkResult: 0x%08x", ret); + } + else + { + ResourceId live = GetResourceManager()->RegisterResource(MakeRes(sem)); + GetResourceManager()->AddLiveResource(id, MakeRes(sem)); + } + } + + return true; +} + +VkResult WrappedVulkan::vkCreateSemaphore( + VkDevice device, + const VkSemaphoreCreateInfo* pCreateInfo, + VkSemaphore* pSemaphore) +{ + VkResult ret = m_Real.vkCreateSemaphore(device, pCreateInfo, pSemaphore); + + if(ret == VK_SUCCESS) + { + VkResource res = MakeRes(*pSemaphore); + ResourceId id = GetResourceManager()->RegisterResource(res); + + if(m_State >= WRITING) + { + Chunk *chunk = NULL; + + { + SCOPED_SERIALISE_CONTEXT(CREATE_SEMAPHORE); + Serialise_vkCreateSemaphore(device, pCreateInfo, pSemaphore); + + chunk = scope.Get(); + } + + VkResourceRecord *record = GetResourceManager()->AddResourceRecord(id); + record->AddChunk(chunk); + } + else + { + GetResourceManager()->AddLiveResource(id, res); + } + } + + return ret; +} + bool WrappedVulkan::Serialise_vkCreateFramebuffer( VkDevice device, const VkFramebufferCreateInfo* pCreateInfo, @@ -5856,6 +5982,9 @@ void WrappedVulkan::ProcessChunk(uint64_t offset, VulkanChunkType context) Serialise_vkGetSwapChainInfoWSI(VK_NULL_HANDLE, VK_NULL_HANDLE, VK_SWAP_CHAIN_INFO_TYPE_MAX_ENUM_WSI, NULL, NULL); break; + case CREATE_SEMAPHORE: + Serialise_vkCreateSemaphore(VK_NULL_HANDLE, NULL, NULL); + break; case CREATE_FENCE: //VKTODO: //Serialise_vkCreateFence(VK_NULL_HANDLE, NULL, NULL); @@ -5886,6 +6015,12 @@ void WrappedVulkan::ProcessChunk(uint64_t offset, VulkanChunkType context) Serialise_vkEndCommandBuffer(VK_NULL_HANDLE); break; + case QUEUE_SIGNAL_SEMAPHORE: + Serialise_vkQueueSignalSemaphore(VK_NULL_HANDLE, VK_NULL_HANDLE); + break; + case QUEUE_WAIT_SEMAPHORE: + Serialise_vkQueueWaitSemaphore(VK_NULL_HANDLE, VK_NULL_HANDLE); + break; case QUEUE_WAIT_IDLE: Serialise_vkQueueWaitIdle(VK_NULL_HANDLE); break; diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 343d5a4a8..ebc04c3b1 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -383,6 +383,25 @@ public: IMPLEMENT_FUNCTION_SERIALISED(VkResult, vkDeviceWaitIdle( VkDevice device)); + // Semaphore functions + + IMPLEMENT_FUNCTION_SERIALISED(VkResult, vkCreateSemaphore( + VkDevice device, + const VkSemaphoreCreateInfo* pCreateInfo, + VkSemaphore* pSemaphore)); + + IMPLEMENT_FUNCTION_SERIALISED(VkResult, vkDestroySemaphore( + VkDevice device, + VkSemaphore semaphore)); + + IMPLEMENT_FUNCTION_SERIALISED(VkResult, vkQueueSignalSemaphore( + VkQueue queue, + VkSemaphore semaphore)); + + IMPLEMENT_FUNCTION_SERIALISED(VkResult, vkQueueWaitSemaphore( + VkQueue queue, + VkSemaphore semaphore)); + // Memory functions IMPLEMENT_FUNCTION_SERIALISED(VkResult, vkAllocMemory( diff --git a/renderdoc/driver/vulkan/vk_hookset_defs.h b/renderdoc/driver/vulkan/vk_hookset_defs.h index 06962414b..3fe929656 100644 --- a/renderdoc/driver/vulkan/vk_hookset_defs.h +++ b/renderdoc/driver/vulkan/vk_hookset_defs.h @@ -72,6 +72,10 @@ HookInit(vkDestroyPipelineCache); \ HookInit(vkCreatePipelineLayout); \ HookInit(vkDestroyPipelineLayout); \ + HookInit(vkCreateSemaphore); \ + HookInit(vkDestroySemaphore); \ + HookInit(vkQueueSignalSemaphore); \ + HookInit(vkQueueWaitSemaphore); \ HookInit(vkCreateSampler); \ HookInit(vkDestroySampler); \ HookInit(vkCreateDescriptorSetLayout); \ @@ -185,6 +189,10 @@ HookDefine2(VkResult, vkDestroyPipelineCache, VkDevice, device, VkPipelineCache, pipelineCache); \ HookDefine3(VkResult, vkCreatePipelineLayout, VkDevice, device, const VkPipelineLayoutCreateInfo*, pCreateInfo, VkPipelineLayout*, pPipelineLayout); \ HookDefine2(VkResult, vkDestroyPipelineLayout, VkDevice, device, VkPipelineLayout, pipelineLayout); \ + HookDefine3(VkResult, vkCreateSemaphore, VkDevice, device, const VkSemaphoreCreateInfo*, pCreateInfo, VkSemaphore*, pSemaphore); \ + HookDefine2(VkResult, vkDestroySemaphore, VkDevice, device, VkSemaphore, semaphore); \ + HookDefine2(VkResult, vkQueueSignalSemaphore, VkQueue, queue, VkSemaphore, semaphore); \ + HookDefine2(VkResult, vkQueueWaitSemaphore, VkQueue, queue, VkSemaphore, semaphore); \ HookDefine3(VkResult, vkCreateSampler, VkDevice, device, const VkSamplerCreateInfo*, pCreateInfo, VkSampler*, pSampler); \ HookDefine2(VkResult, vkDestroySampler, VkDevice, device, VkSampler, sampler); \ HookDefine3(VkResult, vkCreateDescriptorSetLayout, VkDevice, device, const VkDescriptorSetLayoutCreateInfo*, pCreateInfo, VkDescriptorSetLayout*, pSetLayout); \ diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index f86972c9e..ce59c00db 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -62,7 +62,7 @@ enum VkNamespace eResCmdBuffer, eResCmdBufferBake, eResFence, - eResQueueSemaphore, + eResSemaphore, eResEvent, eResWaitEvent, eResQueryPool, @@ -125,7 +125,7 @@ inline VkResource MakeRes(VkDynamicRasterState o) { return VkResource(eResRaster inline VkResource MakeRes(VkDynamicColorBlendState o) { return VkResource(eResColorBlendState, o.handle); } inline VkResource MakeRes(VkDynamicDepthStencilState o) { return VkResource(eResDepthStencilState, o.handle); } inline VkResource MakeRes(VkFence o) { return VkResource(eResFence, o.handle); } -inline VkResource MakeRes(VkSemaphore o) { return VkResource(eResQueueSemaphore, o.handle); } +inline VkResource MakeRes(VkSemaphore o) { return VkResource(eResSemaphore, o.handle); } inline VkResource MakeRes(VkEvent o) { return VkResource(eResEvent, o.handle); } inline VkResource MakeRes(VkQueryPool o) { return VkResource(eResQueryPool, o.handle); }