aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabríel Arthúr Pétursson <gabriel@system.is>2017-06-03 23:27:59 +0000
committerChris Forbes <chrisf@ijw.co.nz>2017-06-07 14:57:20 -0700
commit900135556fce1ecf6793267d4db4b423d7f009c1 (patch)
tree5e3402d98fc1214ecd9765ccc9c17ba3313dd652
parent6be9526304e7b7ea4f9bbbe91c84c03b842b457f (diff)
downloadusermoji-900135556fce1ecf6793267d4db4b423d7f009c1.tar.xz
layers: Free per-device and -instance data on destroy
Instance and device data are allocated by the first call to GetLayerDataPtr in the corresponding vkCreate call. We need to delete them when we're done with them. Introduce a FreeLayerDataPtr helper function that assists with this task. Deletes for dispatch tables were missing in a few places too. Add them.
-rw-r--r--layers/core_validation.cpp10
-rw-r--r--layers/object_tracker.cpp6
-rw-r--r--layers/parameter_validation.cpp6
-rw-r--r--layers/swapchain.cpp4
-rw-r--r--layers/threading.cpp6
-rw-r--r--layers/unique_objects.cpp5
-rw-r--r--layers/vk_layer_data.h10
7 files changed, 32 insertions, 15 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp
index 3b5795f6..008b49e3 100644
--- a/layers/core_validation.cpp
+++ b/layers/core_validation.cpp
@@ -3440,7 +3440,7 @@ VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocati
}
layer_debug_report_destroy_instance(instance_data->report_data);
- layer_data_map.erase(key);
+ FreeLayerDataPtr(key, instance_layer_data_map);
}
static bool ValidatePhysicalDeviceQueueFamily(instance_layer_data *instance_data, const PHYSICAL_DEVICE_STATE *pd_state,
@@ -3633,7 +3633,6 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice gpu, const VkDevice
// prototype
VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
// TODOSC : Shouldn't need any customization here
- bool skip = false;
dispatch_key key = get_dispatch_key(device);
layer_data *dev_data = GetLayerDataPtr(key, layer_data_map);
// Free all the memory
@@ -3667,10 +3666,9 @@ VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCall
#if DISPATCH_MAP_DEBUG
fprintf(stderr, "Device: 0x%p, key: 0x%p\n", device, key);
#endif
- if (!skip) {
- dev_data->dispatch_table.DestroyDevice(device, pAllocator);
- layer_data_map.erase(key);
- }
+
+ dev_data->dispatch_table.DestroyDevice(device, pAllocator);
+ FreeLayerDataPtr(key, layer_data_map);
}
static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
diff --git a/layers/object_tracker.cpp b/layers/object_tracker.cpp
index 385042b6..9702c6a7 100644
--- a/layers/object_tracker.cpp
+++ b/layers/object_tracker.cpp
@@ -463,11 +463,12 @@ VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocati
}
layer_debug_report_destroy_instance(instance_data->report_data);
- layer_data_map.erase(key);
+ FreeLayerDataPtr(key, layer_data_map);
instanceExtMap.erase(pInstanceTable);
lock.unlock();
ot_instance_table_map.erase(key);
+ delete pInstanceTable;
}
VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
@@ -514,6 +515,9 @@ VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCall
VkLayerDispatchTable *pDisp = get_dispatch_table(ot_device_table_map, device);
pDisp->DestroyDevice(device, pAllocator);
ot_device_table_map.erase(key);
+ delete pDisp;
+
+ FreeLayerDataPtr(key, layer_data_map);
}
VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
diff --git a/layers/parameter_validation.cpp b/layers/parameter_validation.cpp
index 4359b499..87c40bad 100644
--- a/layers/parameter_validation.cpp
+++ b/layers/parameter_validation.cpp
@@ -318,8 +318,9 @@ VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocati
}
layer_debug_report_destroy_instance(my_data->report_data);
- instance_layer_data_map.erase(key);
}
+
+ FreeLayerDataPtr(key, instance_layer_data_map);
}
VKAPI_ATTR VkResult VKAPI_CALL EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
@@ -626,8 +627,9 @@ VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCall
#endif
my_data->dispatch_table.DestroyDevice(device, pAllocator);
- layer_data_map.erase(key);
}
+
+ FreeLayerDataPtr(key, layer_data_map);
}
static bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex) {
diff --git a/layers/swapchain.cpp b/layers/swapchain.cpp
index 308276da..334de132 100644
--- a/layers/swapchain.cpp
+++ b/layers/swapchain.cpp
@@ -216,7 +216,7 @@ VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocati
layer_debug_report_destroy_instance(my_data->report_data);
delete my_data->instance_dispatch_table;
- layer_data_map.erase(key);
+ FreeLayerDataPtr(key, layer_data_map);
}
#ifdef VK_USE_PLATFORM_ANDROID_KHR
@@ -743,7 +743,7 @@ VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCall
my_data->deviceMap.erase(device);
}
delete my_data->device_dispatch_table;
- layer_data_map.erase(key);
+ FreeLayerDataPtr(key, layer_data_map);
}
VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
diff --git a/layers/threading.cpp b/layers/threading.cpp
index 5984c4c8..7808a818 100644
--- a/layers/threading.cpp
+++ b/layers/threading.cpp
@@ -121,7 +121,7 @@ VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocati
layer_debug_report_destroy_instance(my_data->report_data);
delete my_data->instance_dispatch_table;
- layer_data_map.erase(key);
+ FreeLayerDataPtr(key, layer_data_map);
}
VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo *pCreateInfo,
@@ -168,7 +168,9 @@ VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCall
} else {
finishMultiThread();
}
- layer_data_map.erase(key);
+
+ delete dev_data->device_dispatch_table;
+ FreeLayerDataPtr(key, layer_data_map);
}
VKAPI_ATTR VkResult VKAPI_CALL GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pSwapchainImageCount,
diff --git a/layers/unique_objects.cpp b/layers/unique_objects.cpp
index 9064d1a7..a26085a1 100644
--- a/layers/unique_objects.cpp
+++ b/layers/unique_objects.cpp
@@ -172,7 +172,7 @@ VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocati
}
layer_debug_report_destroy_instance(instance_data->report_data);
- layer_data_map.erase(key);
+ FreeLayerDataPtr(key, instance_layer_data_map);
}
VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo *pCreateInfo,
@@ -216,7 +216,8 @@ VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCall
layer_debug_report_destroy_device(device);
dev_data->dispatch_table.DestroyDevice(device, pAllocator);
- layer_data_map.erase(key);
+
+ FreeLayerDataPtr(key, layer_data_map);
}
static const VkLayerProperties globalLayerProps = {"VK_LAYER_GOOGLE_unique_objects",
diff --git a/layers/vk_layer_data.h b/layers/vk_layer_data.h
index 84bbad21..046d2f48 100644
--- a/layers/vk_layer_data.h
+++ b/layers/vk_layer_data.h
@@ -20,6 +20,7 @@
#ifndef LAYER_DATA_H
#define LAYER_DATA_H
+#include <cassert>
#include <unordered_map>
#include "vk_layer_table.h"
@@ -42,4 +43,13 @@ DATA_T *GetLayerDataPtr(void *data_key, std::unordered_map<void *, DATA_T *> &la
return debug_data;
}
+template <typename DATA_T>
+void FreeLayerDataPtr(void *data_key, std::unordered_map<void *, DATA_T *> &layer_data_map) {
+ auto got = layer_data_map.find(data_key);
+ assert(got != layer_data_map.end());
+
+ delete got->second;
+ layer_data_map.erase(got);
+}
+
#endif // LAYER_DATA_H