mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-08-29 09:56:39 +00:00
Add semaphore functions to hooking
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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,
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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); \
|
||||
|
||||
@@ -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); }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user