Add semaphore functions to hooking

This commit is contained in:
baldurk
2016-02-07 18:38:09 +01:00
parent cf27397e5c
commit dadf0a969f
6 changed files with 182 additions and 2 deletions
+14
View File
@@ -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)
{
+4
View File
@@ -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,
+135
View File
@@ -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;
+19
View File
@@ -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); \
+2 -2
View File
@@ -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); }