From bfde61a7aa38c3776faaa257222cb8b5cf55a399 Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 9 Oct 2015 15:39:32 +0200 Subject: [PATCH] Handled duplicated semaphore objects in a hacky way. --- .../driver/vulkan/wrappers/vk_misc_funcs.cpp | 57 ++++++++++++------- 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp index cfd9a04fd..7e4270b97 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_misc_funcs.cpp @@ -33,7 +33,7 @@ { \ if(m_ImageInfo.find(GetResID(obj)) != m_ImageInfo.end()) m_ImageInfo.erase(GetResID(obj)); \ type unwrappedObj = Unwrap(obj); \ - GetResourceManager()->ReleaseWrappedResource(obj, true); \ + if(GetResourceManager()->HasWrapper(ToTypedHandle(unwrappedObj))) GetResourceManager()->ReleaseWrappedResource(obj, true); \ return ObjDisp(device)->func(Unwrap(device), unwrappedObj); \ } @@ -310,8 +310,18 @@ bool WrappedVulkan::Serialise_vkCreateSemaphore( } else { - ResourceId live = GetResourceManager()->WrapResource(Unwrap(device), sem); - GetResourceManager()->AddLiveResource(id, sem); + if(GetResourceManager()->HasWrapper(ToTypedHandle(sem))) + { + // VKTODOMED need to handle duplicate objects better than this, perhaps + ResourceId live = GetResourceManager()->GetNonDispWrapper(sem)->id; + RDCDEBUG("Doing hack for duplicate objects that replay expects to be distinct - %llu -> %llu", id, live); + GetResourceManager()->ReplaceResource(id, GetResourceManager()->GetOriginalID(live)); + } + else + { + ResourceId live = GetResourceManager()->WrapResource(Unwrap(device), sem); + GetResourceManager()->AddLiveResource(id, sem); + } } } @@ -327,27 +337,34 @@ VkResult WrappedVulkan::vkCreateSemaphore( if(ret == VK_SUCCESS) { - ResourceId id = GetResourceManager()->WrapResource(Unwrap(device), *pSemaphore); - - if(m_State >= WRITING) + if(GetResourceManager()->HasWrapper(ToTypedHandle(*pSemaphore))) { - Chunk *chunk = NULL; - - { - CACHE_THREAD_SERIALISER(); - - SCOPED_SERIALISE_CONTEXT(CREATE_SEMAPHORE); - Serialise_vkCreateSemaphore(localSerialiser, device, pCreateInfo, pSemaphore); - - chunk = scope.Get(); - } - - VkResourceRecord *record = GetResourceManager()->AddResourceRecord(*pSemaphore); - record->AddChunk(chunk); + *pSemaphore = (VkSemaphore)(uint64_t)GetResourceManager()->GetWrapper(ToTypedHandle(*pSemaphore)); } else { - GetResourceManager()->AddLiveResource(id, *pSemaphore); + ResourceId id = GetResourceManager()->WrapResource(Unwrap(device), *pSemaphore); + + if(m_State >= WRITING) + { + Chunk *chunk = NULL; + + { + CACHE_THREAD_SERIALISER(); + + SCOPED_SERIALISE_CONTEXT(CREATE_SEMAPHORE); + Serialise_vkCreateSemaphore(localSerialiser, device, pCreateInfo, pSemaphore); + + chunk = scope.Get(); + } + + VkResourceRecord *record = GetResourceManager()->AddResourceRecord(*pSemaphore); + record->AddChunk(chunk); + } + else + { + GetResourceManager()->AddLiveResource(id, *pSemaphore); + } } }