@@ -57,6 +57,7 @@ DeviceFault::~DeviceFault()
5757 }
5858 vkDestroyBuffer (vk_device, pointer_buffer.buffer , nullptr );
5959 vkFreeMemory (vk_device, pointer_buffer.memory , nullptr );
60+ vkDestroyDebugUtilsMessengerEXT (get_instance ().get_handle (), debug_utils_messenger, nullptr );
6061 }
6162}
6263
@@ -171,15 +172,16 @@ bool DeviceFault::prepare(const vkb::ApplicationOptions &options)
171172
172173 // Set up debug utils messenger with proper user data pointer
173174 VkDebugUtilsMessengerCreateInfoEXT debug_utils_create_info{VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT};
174- debug_utils_create_info.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT |
175- VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT |
176- VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT;
175+ // debug_utils_create_info.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT |
176+ // VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT |
177+ // VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT;
178+ // debug_utils_create_info.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |
179+ // VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |
180+ // VK_DEBUG_UTILS_MESSAGE_TYPE_DEVICE_ADDRESS_BINDING_BIT_EXT;
177181
182+ debug_utils_create_info.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT;
183+ debug_utils_create_info.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_DEVICE_ADDRESS_BINDING_BIT_EXT;
178184
179-
180- debug_utils_create_info.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |
181- VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |
182- VK_DEBUG_UTILS_MESSAGE_TYPE_DEVICE_ADDRESS_BINDING_BIT_EXT;
183185 debug_utils_create_info.pfnUserCallback = debug_callback;
184186 debug_utils_create_info.pUserData = this ; // Pass 'this' pointer to access instance methods
185187
@@ -242,7 +244,6 @@ void DeviceFault::create_compute_pipeline()
242244{
243245 pipelines.compute_pipeline_layout = create_pipeline_layout (false );
244246 VkComputePipelineCreateInfo info = vkb::initializers::compute_pipeline_create_info (pipelines.compute_pipeline_layout );
245- // info.stage = load_shader("device_fault/update_vbo.comp.spv", VK_SHADER_STAGE_COMPUTE_BIT);
246247 info.stage = load_shader (" device_fault" , " update_vbo.comp.spv" , VK_SHADER_STAGE_COMPUTE_BIT);
247248 VK_CHECK (vkCreateComputePipelines (get_device ().get_handle (), VK_NULL_HANDLE, 1 , &info, nullptr , &pipelines.compute_update_pipeline ));
248249}
@@ -581,8 +582,19 @@ void DeviceFault::render(float delta_time)
581582 // A bit of a hack. This is usually seated in ApiVulkanSample::submit_frame(), but that throws immediately if the device enters an error state.
582583 // So we incorrectly call wait_idle here, so we can get the GPU in error state, and we can query it for device_fault before an exception is thrown.
583584 VkResult error = get_device ().get_queue_by_present (0 ).wait_idle ();
584- check_device_fault (error);
585- ApiVulkanSample::submit_frame ();
585+
586+ try
587+ {
588+ ApiVulkanSample::submit_frame ();
589+ }
590+ catch (std::exception const &e)
591+ {
592+ vk::DeviceLostError const *device_lost_error = reinterpret_cast <vk::DeviceLostError const *>(&e);
593+ if (device_lost_error)
594+ {
595+ check_device_fault (VK_ERROR_DEVICE_LOST);
596+ }
597+ }
586598
587599}
588600
@@ -603,18 +615,6 @@ void DeviceFault::request_gpu_features(vkb::core::PhysicalDeviceC &gpu)
603615 REQUEST_OPTIONAL_FEATURE (gpu,
604616 VkPhysicalDeviceAddressBindingReportFeaturesEXT,
605617 reportAddressBinding);
606-
607- // Add explicit debug utils feature request
608- auto &features = gpu.get_mutable_requested_features ();
609-
610- VkValidationFeaturesEXT validation_features = {};
611- validation_features.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT;
612- validation_features.enabledValidationFeatureCount = 1 ;
613-
614- VkValidationFeatureEnableEXT enabled_features[] = {
615- VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT
616- };
617- validation_features.pEnabledValidationFeatures = enabled_features;
618618}
619619
620620std::unique_ptr<ApiVulkanSample> create_device_fault ()
0 commit comments