From c57dcce816090e04c96f1f8f1daec52508b314f7 Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 3 Jan 2017 13:48:14 +0000 Subject: [PATCH] Don't debug clear buffers, and NULL records. Refs #471 * Since we don't clear out stale descriptors that reference deleted objects, we have to make sure that ids and records for deleted objects are always valid (until they're allocated and filled with something sensible). --- renderdoc/driver/vulkan/vk_manager.h | 14 ++++++++--- renderdoc/driver/vulkan/vk_resources.h | 16 ++++++++++++- .../vulkan/wrappers/vk_descriptor_funcs.cpp | 23 +++++++++++++------ 3 files changed, 42 insertions(+), 11 deletions(-) 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