aboutsummaryrefslogtreecommitdiff
path: root/layers/parameter_validation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'layers/parameter_validation.cpp')
-rw-r--r--layers/parameter_validation.cpp48
1 files changed, 47 insertions, 1 deletions
diff --git a/layers/parameter_validation.cpp b/layers/parameter_validation.cpp
index 9a995d98..9546e4c3 100644
--- a/layers/parameter_validation.cpp
+++ b/layers/parameter_validation.cpp
@@ -50,12 +50,18 @@ struct layer_data {
debug_report_data *report_data;
std::vector<VkDebugReportCallbackEXT> logging_callback;
+ // The following are for keeping track of the temporary callbacks that can
+ // be used in vkCreateInstance and vkDestroyInstance:
+ uint32_t num_tmp_callbacks;
+ VkDebugReportCallbackCreateInfoEXT *tmp_dbg_create_infos;
+ VkDebugReportCallbackEXT *tmp_callbacks;
+
// TODO: Split instance/device structs
// Device Data
// Map for queue family index to queue count
std::unordered_map<uint32_t, uint32_t> queueFamilyIndexMap;
- layer_data() : report_data(nullptr){};
+ layer_data() : report_data(nullptr), num_tmp_callbacks(0), tmp_dbg_create_infos(nullptr), tmp_callbacks(nullptr){};
};
static std::unordered_map<void *, layer_data *> layer_data_map;
@@ -1306,6 +1312,22 @@ vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCall
my_instance_data->report_data = debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionCount,
pCreateInfo->ppEnabledExtensionNames);
+ // Look for one or more debug report create info structures
+ // and setup a callback(s) for each one found.
+ if (!layer_copy_tmp_callbacks(pCreateInfo->pNext, &my_instance_data->num_tmp_callbacks,
+ &my_instance_data->tmp_dbg_create_infos, &my_instance_data->tmp_callbacks)) {
+ if (my_instance_data->num_tmp_callbacks > 0) {
+ // Setup the temporary callback(s) here to catch early issues:
+ if (layer_enable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
+ my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks)) {
+ // Failure of setting up one or more of the callback.
+ // Therefore, clean up and don't use those callbacks:
+ layer_free_tmp_callbacks(my_instance_data->tmp_dbg_create_infos, my_instance_data->tmp_callbacks);
+ my_instance_data->num_tmp_callbacks = 0;
+ }
+ }
+ }
+
init_parameter_validation(my_instance_data, pAllocator);
// Ordinarily we'd check these before calling down the chain, but none of the layer
@@ -1324,6 +1346,12 @@ vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCall
pCreateInfo->pApplicationInfo->pEngineName);
}
}
+
+ // Disable the tmp callbacks:
+ if (my_instance_data->num_tmp_callbacks > 0) {
+ layer_disable_tmp_callbacks(my_instance_data->report_data, my_instance_data->num_tmp_callbacks,
+ my_instance_data->tmp_callbacks);
+ }
}
return result;
@@ -1336,8 +1364,26 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyInstance(VkInstance instance
layer_data *my_data = get_my_data_ptr(key, layer_data_map);
assert(my_data != NULL);
+ // Enable the temporary callback(s) here to catch vkDestroyInstance issues:
+ bool callback_setup = false;
+ if (my_data->num_tmp_callbacks > 0) {
+ if (!layer_enable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_dbg_create_infos,
+ my_data->tmp_callbacks)) {
+ callback_setup = true;
+ }
+ }
+
skipCall |= parameter_validation_vkDestroyInstance(my_data->report_data, pAllocator);
+ // Disable and cleanup the temporary callback(s):
+ if (callback_setup) {
+ layer_disable_tmp_callbacks(my_data->report_data, my_data->num_tmp_callbacks, my_data->tmp_callbacks);
+ }
+ if (my_data->num_tmp_callbacks > 0) {
+ layer_free_tmp_callbacks(my_data->tmp_dbg_create_infos, my_data->tmp_callbacks);
+ my_data->num_tmp_callbacks = 0;
+ }
+
if (!skipCall) {
VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance);
pTable->DestroyInstance(instance, pAllocator);