diff --git a/renderdoc/driver/vulkan/vk_manager.h b/renderdoc/driver/vulkan/vk_manager.h index 6b4c598ff..7e9769a29 100644 --- a/renderdoc/driver/vulkan/vk_manager.h +++ b/renderdoc/driver/vulkan/vk_manager.h @@ -236,10 +236,18 @@ public: // ID and if the resource isn't ever referenced elsewhere, it will just be // a non-live ID to be ignored. - if(IsDispatchableRes(GetWrapped(obj))) - ((WrappedVkDispRes *)GetWrapped(obj))->id = ResourceId(); + if(IsDispatchable(obj)) + { + WrappedVkDispRes *res = (WrappedVkDispRes *)GetWrapped(obj); + res->id = ResourceId(); + res->record = NULL; + } else - ((WrappedVkNonDispRes *)GetWrapped(obj))->id = ResourceId(); + { + WrappedVkNonDispRes *res = (WrappedVkNonDispRes *)GetWrapped(obj); + res->id = ResourceId(); + res->record = NULL; + } } delete GetWrapped(obj); } diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index 361af17e0..6b5bde60a 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -329,7 +329,7 @@ struct WrappedVkBuffer : WrappedVkNonDispRes typedef VkBuffer InnerType; static const int AllocPoolCount = 128 * 1024; static const int AllocPoolMaxByteSize = 3 * 1024 * 1024; - ALLOCATE_WITH_WRAPPED_POOL(WrappedVkBuffer, AllocPoolCount, AllocPoolMaxByteSize); + ALLOCATE_WITH_WRAPPED_POOL(WrappedVkBuffer, AllocPoolCount, AllocPoolMaxByteSize, false); enum { TypeEnum = eResBuffer, @@ -578,6 +578,10 @@ struct UnwrapHelper struct UnwrapHelper \ { \ typedef WrappedVkDispRes ParentType; \ + enum \ + { \ + DispatchableType = 1 \ + }; \ typedef CONCAT(Wrapped, vulkantype) Outer; \ static TypedRealHandle ToTypedHandle(vulkantype real) \ { \ @@ -594,6 +598,10 @@ struct UnwrapHelper struct UnwrapHelper \ { \ typedef WrappedVkNonDispRes ParentType; \ + enum \ + { \ + DispatchableType = 0 \ + }; \ typedef CONCAT(Wrapped, vulkantype) Outer; \ static TypedRealHandle ToTypedHandle(vulkantype real) \ { \ @@ -682,6 +690,12 @@ void SetDispatchTableOverMagicNumber(VkDevice parent, RealType obj) wrapped->loaderTable = GetWrapped(parent)->loaderTable; } +template +bool IsDispatchable(RealType obj) +{ + return (UnwrapHelper::DispatchableType) == 1; +} + template WrappedVulkan *CoreDisp(RealType obj) { diff --git a/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp index 0cdd00e42..be847836a 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp @@ -866,15 +866,22 @@ void WrappedVulkan::vkUpdateDescriptorSets(VkDevice device, uint32_t writeCount, if(bind.texelBufferView != VK_NULL_HANDLE) { record->RemoveBindFrameRef(GetResID(bind.texelBufferView)); - if(GetRecord(bind.texelBufferView)->baseResource != ResourceId()) - record->RemoveBindFrameRef(GetRecord(bind.texelBufferView)->baseResource); + + VkResourceRecord *viewRecord = GetRecord(bind.texelBufferView); + if(viewRecord && viewRecord->baseResource != ResourceId()) + record->RemoveBindFrameRef(viewRecord->baseResource); } if(bind.imageInfo.imageView != VK_NULL_HANDLE) { record->RemoveBindFrameRef(GetResID(bind.imageInfo.imageView)); - record->RemoveBindFrameRef(GetRecord(bind.imageInfo.imageView)->baseResource); - if(GetRecord(bind.imageInfo.imageView)->baseResourceMem != ResourceId()) - record->RemoveBindFrameRef(GetRecord(bind.imageInfo.imageView)->baseResourceMem); + + VkResourceRecord *viewRecord = GetRecord(bind.imageInfo.imageView); + if(viewRecord) + { + record->RemoveBindFrameRef(viewRecord->baseResource); + if(viewRecord->baseResourceMem != ResourceId()) + record->RemoveBindFrameRef(viewRecord->baseResourceMem); + } } if(bind.imageInfo.sampler != VK_NULL_HANDLE) { @@ -883,8 +890,10 @@ void WrappedVulkan::vkUpdateDescriptorSets(VkDevice device, uint32_t writeCount, if(bind.bufferInfo.buffer != VK_NULL_HANDLE) { record->RemoveBindFrameRef(GetResID(bind.bufferInfo.buffer)); - if(GetRecord(bind.bufferInfo.buffer)->baseResource != ResourceId()) - record->RemoveBindFrameRef(GetRecord(bind.bufferInfo.buffer)->baseResource); + + VkResourceRecord *bufRecord = GetRecord(bind.bufferInfo.buffer); + if(bufRecord && bufRecord->baseResource != ResourceId()) + record->RemoveBindFrameRef(bufRecord->baseResource); } // NULL everything out now so that we don't accidentally reference an object