From 4816bcfa7b85f2065bda6a2671d3d83d559ecca5 Mon Sep 17 00:00:00 2001 From: GregF Date: Fri, 18 Sep 2015 15:22:24 -0600 Subject: [PATCH] use layer specific dispatch table maps --- .../vulkan/LoaderAndTools/layers/vk_layer_table.h | 4 ++++ renderdoc/driver/vulkan/rdtrace.cpp | 12 ++++++------ renderdoc/driver/vulkan/vk_core.cpp | 13 ++++++++----- renderdoc/driver/vulkan/vk_core.h | 7 +++++-- renderdoc/driver/vulkan/vk_resources.h | 4 ++-- 5 files changed, 25 insertions(+), 15 deletions(-) diff --git a/renderdoc/driver/vulkan/LoaderAndTools/layers/vk_layer_table.h b/renderdoc/driver/vulkan/LoaderAndTools/layers/vk_layer_table.h index fbf2a8cdc..99fa10dbf 100644 --- a/renderdoc/driver/vulkan/LoaderAndTools/layers/vk_layer_table.h +++ b/renderdoc/driver/vulkan/LoaderAndTools/layers/vk_layer_table.h @@ -49,3 +49,7 @@ VkLayerInstanceDispatchTable *get_dispatch_table(instance_table_map &map, void* void destroy_device_dispatch_table(dispatch_key key); void destroy_instance_dispatch_table(dispatch_key key); + +void destroy_dispatch_table(device_table_map &map, dispatch_key key); +void destroy_dispatch_table(instance_table_map &map, dispatch_key key); + diff --git a/renderdoc/driver/vulkan/rdtrace.cpp b/renderdoc/driver/vulkan/rdtrace.cpp index 0ad69615e..d3bda64f7 100644 --- a/renderdoc/driver/vulkan/rdtrace.cpp +++ b/renderdoc/driver/vulkan/rdtrace.cpp @@ -208,7 +208,7 @@ VK_LAYER_EXPORT PFN_vkVoidFunction VKAPI vkGetDeviceProcAddr(VkDevice device, co /* loader uses this to force layer initialization; device object is wrapped */ if (!strcmp("vkGetDeviceProcAddr", pName)) { - initDeviceTable((const VkBaseLayerObject *) device); + initDeviceTable(renderdoc_device_table_map, (const VkBaseLayerObject *) device); return (PFN_vkVoidFunction) vkGetDeviceProcAddr; } @@ -220,9 +220,9 @@ VK_LAYER_EXPORT PFN_vkVoidFunction VKAPI vkGetDeviceProcAddr(VkDevice device, co return (PFN_vkVoidFunction) vkDestroyDevice; else { - if (device_dispatch_table(device)->GetDeviceProcAddr == NULL) + if (get_dispatch_table(renderdoc_device_table_map, device)->GetDeviceProcAddr == NULL) return NULL; - return device_dispatch_table(device)->GetDeviceProcAddr(device, pName); + return get_dispatch_table(renderdoc_device_table_map, device)->GetDeviceProcAddr(device, pName); } } @@ -233,7 +233,7 @@ VK_LAYER_EXPORT PFN_vkVoidFunction VKAPI vkGetInstanceProcAddr(VkInstance instan /* loader uses this to force layer initialization; instance object is wrapped */ if (!strcmp("vkGetInstanceProcAddr", pName)) { - initInstanceTable((const VkBaseLayerObject *) instance); + initInstanceTable(renderdoc_instance_table_map, (const VkBaseLayerObject *) instance); if (shadowVulkan == NULL) { shadowVulkan = new WrappedVulkan(""); } @@ -249,8 +249,8 @@ VK_LAYER_EXPORT PFN_vkVoidFunction VKAPI vkGetInstanceProcAddr(VkInstance instan if (!strcmp("vkGetGlobalLayerProperties", pName)) return (PFN_vkVoidFunction) vkGetGlobalLayerProperties; - if (instance_dispatch_table(instance)->GetInstanceProcAddr == NULL) + if (get_dispatch_table(renderdoc_instance_table_map, instance)->GetInstanceProcAddr == NULL) return NULL; - return instance_dispatch_table(instance)->GetInstanceProcAddr(instance, pName); + return get_dispatch_table(renderdoc_instance_table_map, instance)->GetInstanceProcAddr(instance, pName); } diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 81b50a3a5..001725788 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -31,6 +31,9 @@ #include "jpeg-compressor/jpge.h" +device_table_map renderdoc_device_table_map; +instance_table_map renderdoc_instance_table_map; + // VKTODOLOW dirty buffers should propagate through to their memory somehow // images can be separately dirty since we can't just copy their memory // (tiling could be different) @@ -460,7 +463,7 @@ VkResult WrappedVulkan::vkCreateInstance( VkInstance inst = *pInstance; - VkResult ret = instance_dispatch_table(*pInstance)->CreateInstance(pCreateInfo, &inst); + VkResult ret = get_dispatch_table(renderdoc_instance_table_map, *pInstance)->CreateInstance(pCreateInfo, &inst); GetResourceManager()->WrapResource(inst); @@ -515,7 +518,7 @@ VkResult WrappedVulkan::vkDestroyInstance( GetResourceManager()->ReleaseCurrentResource(GetResID(instance)); - destroy_instance_dispatch_table(key); + destroy_dispatch_table(renderdoc_instance_table_map, key); return VK_SUCCESS; } @@ -851,7 +854,7 @@ VkResult WrappedVulkan::vkCreateDevice( RDCDEBUG("Might want to fiddle with createinfo - e.g. to remove VK_RenderDoc from set of extensions or similar"); - VkResult ret = device_dispatch_table(*pDevice)->CreateDevice(Unwrap(physicalDevice), &createInfo, pDevice); + VkResult ret = get_dispatch_table(renderdoc_device_table_map, *pDevice)->CreateDevice(Unwrap(physicalDevice), &createInfo, pDevice); if(ret == VK_SUCCESS) { @@ -965,7 +968,7 @@ VkResult WrappedVulkan::vkDestroyDevice(VkDevice device) dispatch_key key = get_dispatch_key(device); VkResult ret = ObjDisp(device)->DestroyDevice(device); - destroy_device_dispatch_table(key); + destroy_dispatch_table(renderdoc_device_table_map, key); GetResourceManager()->ReleaseCurrentResource(GetResID(device)); @@ -5672,7 +5675,7 @@ bool WrappedVulkan::ReleaseResource(WrappedVkRes *res) VkInstance instance = disp->real.As(); dispatch_key key = get_dispatch_key(instance); ObjDisp(instance)->DestroyInstance(instance); - destroy_instance_dispatch_table(key); + destroy_dispatch_table(renderdoc_instance_table_map, key); break; } case eResDevice: diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index ae4039a13..0a42247b3 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -51,14 +51,17 @@ extern VkLayerDispatchTable *dummyDeviceTable; extern VkLayerInstanceDispatchTable *dummyInstanceTable; +extern device_table_map renderdoc_device_table_map; +extern instance_table_map renderdoc_instance_table_map; + template void SetDispatchTable(bool writing, wrappedtype *wrapped) { if(writing) { wrapped->table = wrappedtype::UseInstanceDispatchTable - ? (uintptr_t)instance_dispatch_table((void *)wrapped->real.handle) - : (uintptr_t)device_dispatch_table((void *)wrapped->real.handle); + ? (uintptr_t)get_dispatch_table(renderdoc_instance_table_map, (void *)wrapped->real.handle) + : (uintptr_t)get_dispatch_table(renderdoc_device_table_map, (void *)wrapped->real.handle); } else { diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index 73f79d0df..e175bb30b 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -34,8 +34,8 @@ struct VkResourceRecord; // VKTODOLOW move layer dispatch table stuff to vk_common.h struct VkLayerDispatchTable_; struct VkLayerInstanceDispatchTable_; -VkLayerDispatchTable_ *device_dispatch_table(void* object); -VkLayerInstanceDispatchTable_ *instance_dispatch_table(void* object); +//VkLayerDispatchTable_ *device_dispatch_table(void* object); +//VkLayerInstanceDispatchTable_ *instance_dispatch_table(void* object); // empty base class for dispatchable/non-dispatchable. Unfortunately // we can't put any members here as the base class is always first,