int sample_main() { struct sample_info info = {}; init_global_layer_properties(info); /* VULKAN_KEY_START */ /* Common validation layers * Loader will chain them together in the order given, * though order doesn't really matter for these validation * layers. */ info.instance_layer_names.push_back("VK_LAYER_GOOGLE_threading"); info.instance_layer_names.push_back("VK_LAYER_LUNARG_device_limits"); info.instance_layer_names.push_back("VK_LAYER_LUNARG_draw_state"); info.instance_layer_names.push_back("VK_LAYER_LUNARG_image"); info.instance_layer_names.push_back("VK_LAYER_LUNARG_mem_tracker"); info.instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker"); info.instance_layer_names.push_back("VK_LAYER_LUNARG_param_checker"); info.instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain"); info.instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects"); if (!demo_check_layers(info.instance_layer_properties, info.instance_layer_names)) { exit(1); } /* Enable debug callback extension */ info.instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME); VkApplicationInfo app_info = {}; app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; app_info.pNext = NULL; app_info.pApplicationName = "vulkansamples_enable_validation_with_callback"; app_info.applicationVersion = 1; app_info.pEngineName = "Vulkan Samples"; app_info.engineVersion = 1; app_info.apiVersion = VK_API_VERSION; VkInstanceCreateInfo inst_info = {}; inst_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; inst_info.pNext = NULL; inst_info.flags = 0; inst_info.pApplicationInfo = &app_info; inst_info.enabledLayerCount = info.instance_layer_names.size(); inst_info.ppEnabledLayerNames = info.instance_layer_names.size() ? info.instance_layer_names.data() : NULL; inst_info.enabledExtensionCount = info.instance_extension_names.size(); inst_info.ppEnabledExtensionNames = info.instance_extension_names.data(); VkResult res = vkCreateInstance(&inst_info, NULL, &info.inst); assert(res == VK_SUCCESS); init_enumerate_device(info); init_device_layer_properties(info); /* * Common validation layers * Loader will chain them together in the order given, * though order doesn't really matter for these validation * layers. * Instance layers and Device layers are independent so * must enable validation layers for both to see everything. */ info.device_layer_names.push_back("VK_LAYER_GOOGLE_threading"); info.device_layer_names.push_back("VK_LAYER_LUNARG_device_limits"); info.device_layer_names.push_back("VK_LAYER_LUNARG_draw_state"); info.device_layer_names.push_back("VK_LAYER_LUNARG_image"); info.device_layer_names.push_back("VK_LAYER_LUNARG_mem_tracker"); info.device_layer_names.push_back("VK_LAYER_LUNARG_object_tracker"); info.device_layer_names.push_back("VK_LAYER_LUNARG_param_checker"); info.device_layer_names.push_back("VK_LAYER_LUNARG_swapchain"); info.device_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects"); if (!demo_check_layers(info.device_layer_properties, info.device_layer_names)) { exit(1); } float queue_priorities[1] = {0.0}; VkDeviceQueueCreateInfo queue_info = {}; vkGetPhysicalDeviceQueueFamilyProperties(info.gpus[0], &info.queue_count, NULL); assert(info.queue_count >= 1); info.queue_props.resize(info.queue_count); vkGetPhysicalDeviceQueueFamilyProperties(info.gpus[0], &info.queue_count, info.queue_props.data()); assert(info.queue_count >= 1); bool found = false; for (unsigned int i = 0; i < info.queue_count; i++) { if (info.queue_props[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) { queue_info.queueFamilyIndex = i; found = true; break; } } assert(found); assert(info.queue_count >= 1); queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; queue_info.pNext = NULL; queue_info.queueCount = 1; queue_info.pQueuePriorities = queue_priorities; VkDeviceCreateInfo device_info = {}; device_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; device_info.pNext = NULL; device_info.queueCreateInfoCount = 1; device_info.pQueueCreateInfos = &queue_info; device_info.enabledLayerCount = info.device_layer_names.size(); device_info.ppEnabledLayerNames = device_info.enabledLayerCount ? info.device_layer_names.data() : NULL; device_info.enabledExtensionCount = info.device_extension_names.size(); device_info.ppEnabledExtensionNames = device_info.enabledExtensionCount ? info.device_extension_names.data() : NULL; device_info.pEnabledFeatures = NULL; res = vkCreateDevice(info.gpus[0], &device_info, NULL, &info.device); assert(res == VK_SUCCESS); VkDebugReportCallbackEXT debug_report_callback; info.dbgCreateDebugReportCallback = (PFN_vkCreateDebugReportCallbackEXT)vkGetInstanceProcAddr( info.inst, "vkCreateDebugReportCallbackEXT"); if (!info.dbgCreateDebugReportCallback) { std::cout << "GetInstanceProcAddr: Unable to find " "vkCreateDebugReportCallbackEXT function." << std::endl; exit(1); } info.dbgDestroyDebugReportCallback = (PFN_vkDestroyDebugReportCallbackEXT)vkGetInstanceProcAddr( info.inst, "vkDestroyDebugReportCallbackEXT"); if (!info.dbgDestroyDebugReportCallback) { std::cout << "GetInstanceProcAddr: Unable to find " "vkDestroyDebugReportCallbackEXT function." << std::endl; exit(1); } VkDebugReportCallbackCreateInfoEXT create_info = {}; create_info.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT; create_info.pNext = NULL; create_info.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT; create_info.pfnCallback = dbgFunc; create_info.pUserData = NULL; res = info.dbgCreateDebugReportCallback(info.inst, &create_info, NULL, &debug_report_callback); switch (res) { case VK_SUCCESS: break; case VK_ERROR_OUT_OF_HOST_MEMORY: std::cout << "dbgCreateDebugReportCallback: out of host memory\n" << std::endl; exit(1); break; default: std::cout << "dbgCreateDebugReportCallback: unknown failure\n" << std::endl; exit(1); break; } /* Create a command pool */ VkCommandPoolCreateInfo cmd_pool_info = {}; cmd_pool_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; cmd_pool_info.pNext = NULL; cmd_pool_info.queueFamilyIndex = info.graphics_queue_family_index; cmd_pool_info.flags = 0; res = vkCreateCommandPool(info.device, &cmd_pool_info, NULL, &info.cmd_pool); assert(res == VK_SUCCESS); /* * Destroying the device before destroying the command pool above * will trigger a validation error. */ std::cout << "calling vkDestroyDevice before destroying command pool\n"; std::cout << "this should result in an error\n"; vkDestroyDevice(info.device, NULL); /* Clean up callback */ info.dbgDestroyDebugReportCallback(info.inst, debug_report_callback, NULL); /* VULKAN_KEY_END */ vkDestroyInstance(info.inst, NULL); return 0; }
int sample_main(int argc, char *argv[]) { struct sample_info info = {}; init_global_layer_properties(info); /* VULKAN_KEY_START */ /* Use standard_validation meta layer that enables all * recommended validation layers */ info.instance_layer_names.push_back("VK_LAYER_LUNARG_standard_validation"); if (!demo_check_layers(info.instance_layer_properties, info.instance_layer_names)) { /* If standard validation is not present, search instead for the * individual layers that make it up, in the correct order. */ info.instance_layer_names.clear(); info.instance_layer_names.push_back("VK_LAYER_GOOGLE_threading"); info.instance_layer_names.push_back( "VK_LAYER_LUNARG_parameter_validation"); info.instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker"); info.instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation"); info.instance_layer_names.push_back("VK_LAYER_LUNARG_image"); info.instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain"); info.instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects"); if (!demo_check_layers(info.instance_layer_properties, info.instance_layer_names)) { exit(1); } } /* Enable debug callback extension */ info.instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME); VkApplicationInfo app_info = {}; app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; app_info.pNext = NULL; app_info.pApplicationName = "vulkansamples_enable_validation_with_callback"; app_info.applicationVersion = 1; app_info.pEngineName = "Vulkan Samples"; app_info.engineVersion = 1; app_info.apiVersion = VK_API_VERSION_1_0; VkInstanceCreateInfo inst_info = {}; inst_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; inst_info.pNext = NULL; inst_info.flags = 0; inst_info.pApplicationInfo = &app_info; inst_info.enabledLayerCount = info.instance_layer_names.size(); inst_info.ppEnabledLayerNames = info.instance_layer_names.size() ? info.instance_layer_names.data() : NULL; inst_info.enabledExtensionCount = info.instance_extension_names.size(); inst_info.ppEnabledExtensionNames = info.instance_extension_names.data(); VkResult res = vkCreateInstance(&inst_info, NULL, &info.inst); assert(res == VK_SUCCESS); init_enumerate_device(info); float queue_priorities[1] = { 0.0 }; VkDeviceQueueCreateInfo queue_info = {}; vkGetPhysicalDeviceQueueFamilyProperties(info.gpus[0], &info.queue_family_count, NULL); assert(info.queue_family_count >= 1); info.queue_props.resize(info.queue_family_count); vkGetPhysicalDeviceQueueFamilyProperties( info.gpus[0], &info.queue_family_count, info.queue_props.data()); assert(info.queue_family_count >= 1); bool found = false; for (unsigned int i = 0; i < info.queue_family_count; i++) { if (info.queue_props[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) { queue_info.queueFamilyIndex = i; found = true; break; } } assert(found); assert(info.queue_family_count >= 1); queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; queue_info.pNext = NULL; queue_info.queueCount = 1; queue_info.pQueuePriorities = queue_priorities; VkDeviceCreateInfo device_info = {}; device_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; device_info.pNext = NULL; device_info.queueCreateInfoCount = 1; device_info.pQueueCreateInfos = &queue_info; device_info.enabledExtensionCount = info.device_extension_names.size(); device_info.ppEnabledExtensionNames = device_info.enabledExtensionCount ? info.device_extension_names.data() : NULL; device_info.pEnabledFeatures = NULL; res = vkCreateDevice(info.gpus[0], &device_info, NULL, &info.device); assert(res == VK_SUCCESS); VkDebugReportCallbackEXT debug_report_callback; info.dbgCreateDebugReportCallback = (PFN_vkCreateDebugReportCallbackEXT)vkGetInstanceProcAddr( info.inst, "vkCreateDebugReportCallbackEXT"); if (!info.dbgCreateDebugReportCallback) { std::cout << "GetInstanceProcAddr: Unable to find " "vkCreateDebugReportCallbackEXT function." << std::endl; exit(1); } info.dbgDestroyDebugReportCallback = (PFN_vkDestroyDebugReportCallbackEXT)vkGetInstanceProcAddr( info.inst, "vkDestroyDebugReportCallbackEXT"); if (!info.dbgDestroyDebugReportCallback) { std::cout << "GetInstanceProcAddr: Unable to find " "vkDestroyDebugReportCallbackEXT function." << std::endl; exit(1); } VkDebugReportCallbackCreateInfoEXT create_info = {}; create_info.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT; create_info.pNext = NULL; create_info.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT; create_info.pfnCallback = dbgFunc; create_info.pUserData = NULL; res = info.dbgCreateDebugReportCallback(info.inst, &create_info, NULL, &debug_report_callback); switch (res) { case VK_SUCCESS: break; case VK_ERROR_OUT_OF_HOST_MEMORY: std::cout << "dbgCreateDebugReportCallback: out of host memory\n" << std::endl; exit(1); break; default: std::cout << "dbgCreateDebugReportCallback: unknown failure\n" << std::endl; exit(1); break; } /* Create a command pool */ VkCommandPoolCreateInfo cmd_pool_info = {}; cmd_pool_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; cmd_pool_info.pNext = NULL; cmd_pool_info.queueFamilyIndex = info.graphics_queue_family_index; cmd_pool_info.flags = 0; res = vkCreateCommandPool(info.device, &cmd_pool_info, NULL, &info.cmd_pool); assert(res == VK_SUCCESS); /* * Destroying the device before destroying the command pool above * will trigger a validation error. */ std::cout << "*** INTENTIONALLY calling vkDestroyDevice before destroying command pool ***\n"; std::cout << "*** The following error message is EXPECTED ***\n"; vkDestroyDevice(info.device, NULL); /* Clean up callback */ info.dbgDestroyDebugReportCallback(info.inst, debug_report_callback, NULL); /* VULKAN_KEY_END */ vkDestroyInstance(info.inst, NULL); return 0; }