| // Copyright (c) 2016 The vulkano developers | |
| // Licensed under the Apache License, Version 2.0 | |
| // <LICENSE-APACHE or | |
| // https://www.apache.org/licenses/LICENSE-2.0> or the MIT | |
| // license <LICENSE-MIT or https://opensource.org/licenses/MIT>, | |
| // at your option. All files in the project carrying such | |
| // notice may not be copied, modified, or distributed except | |
| // according to those terms. | |
| #![cfg(test)] | |
| /// Creates an instance or returns if initialization fails. | |
| macro_rules! instance { | |
| () => {{ | |
| use crate::{instance::Instance, VulkanLibrary}; | |
| let library = match VulkanLibrary::new() { | |
| Ok(x) => x, | |
| Err(_) => return, | |
| }; | |
| match Instance::new(library, Default::default()) { | |
| Ok(x) => x, | |
| Err(_) => return, | |
| } | |
| }}; | |
| } | |
| /// Creates a device and a queue for graphics operations. | |
| macro_rules! gfx_dev_and_queue { | |
| ($($feature:ident),*) => ({ | |
| use crate::device::physical::PhysicalDeviceType; | |
| use crate::device::{Device, DeviceCreateInfo, DeviceExtensions, QueueCreateInfo}; | |
| use crate::device::Features; | |
| let instance = instance!(); | |
| let enabled_extensions = DeviceExtensions::empty(); | |
| let enabled_features = Features { | |
| $( | |
| $feature: true, | |
| )* | |
| .. Features::empty() | |
| }; | |
| let select = match instance.enumerate_physical_devices() { | |
| Ok(x) => x, | |
| Err(_) => return, | |
| } | |
| .filter(|p| { | |
| p.supported_extensions().contains(&enabled_extensions) && | |
| p.supported_features().contains(&enabled_features) | |
| }) | |
| .filter_map(|p| { | |
| p.queue_family_properties().iter() | |
| .position(|q| q.queue_flags.intersects(crate::device::QueueFlags::GRAPHICS)) | |
| .map(|i| (p, i as u32)) | |
| }) | |
| .min_by_key(|(p, _)| { | |
| match p.properties().device_type { | |
| PhysicalDeviceType::DiscreteGpu => 0, | |
| PhysicalDeviceType::IntegratedGpu => 1, | |
| PhysicalDeviceType::VirtualGpu => 2, | |
| PhysicalDeviceType::Cpu => 3, | |
| PhysicalDeviceType::Other => 4, | |
| } | |
| }); | |
| let (physical_device, queue_family_index) = match select { | |
| Some(x) => x, | |
| None => return, | |
| }; | |
| let (device, mut queues) = match Device::new( | |
| physical_device, | |
| DeviceCreateInfo { | |
| queue_create_infos: vec![QueueCreateInfo { | |
| queue_family_index, | |
| ..Default::default() | |
| }], | |
| enabled_extensions, | |
| enabled_features, | |
| ..Default::default() | |
| } | |
| ) { | |
| Ok(r) => r, | |
| Err(_) => return, | |
| }; | |
| (device, queues.next().unwrap()) | |
| }); | |
| } | |
| macro_rules! assert_should_panic { | |
| ($msg:expr, $code:block) => {{ | |
| let res = ::std::panic::catch_unwind(::std::panic::AssertUnwindSafe(|| $code)); | |
| match res { | |
| Ok(_) => panic!("Test expected to panic but didn't"), | |
| Err(err) => { | |
| if let Some(msg) = err.downcast_ref::<String>() { | |
| assert!(msg.contains($msg)); | |
| } else if let Some(&msg) = err.downcast_ref::<&str>() { | |
| assert!(msg.contains($msg)); | |
| } else { | |
| panic!("Couldn't decipher the panic message of the test") | |
| } | |
| } | |
| } | |
| }}; | |
| ($code:block) => {{ | |
| let res = ::std::panic::catch_unwind(::std::panic::AssertUnwindSafe(|| $code)); | |
| match res { | |
| Ok(_) => panic!("Test expected to panic but didn't"), | |
| Err(_) => {} | |
| } | |
| }}; | |
| } |