Skip to content

Commit

Permalink
Fix bug with surface_capabilities extension structs attached to the…
Browse files Browse the repository at this point in the history
… wrong parent struct (#2058)
  • Loading branch information
Rua authored Oct 30, 2022
1 parent bdcb796 commit 59a8c45
Showing 1 changed file with 44 additions and 42 deletions.
86 changes: 44 additions & 42 deletions vulkano/src/device/physical.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1542,60 +1542,60 @@ impl PhysicalDevice {
_ne: _,
} = surface_info;

let mut info2 = ash::vk::PhysicalDeviceSurfaceInfo2KHR {
let mut info_vk = ash::vk::PhysicalDeviceSurfaceInfo2KHR {
surface: surface.handle(),
..Default::default()
};
let mut full_screen_exclusive_info = None;
let mut full_screen_exclusive_win32_info = None;
let mut full_screen_exclusive_info_vk = None;
let mut full_screen_exclusive_win32_info_vk = None;

if self.supported_extensions().ext_full_screen_exclusive {
let next =
full_screen_exclusive_info.insert(ash::vk::SurfaceFullScreenExclusiveInfoEXT {
full_screen_exclusive_info_vk.insert(ash::vk::SurfaceFullScreenExclusiveInfoEXT {
full_screen_exclusive: full_screen_exclusive.into(),
..Default::default()
});

next.p_next = info2.p_next as *mut _;
info2.p_next = next as *const _ as *const _;
next.p_next = info_vk.p_next as *mut _;
info_vk.p_next = next as *const _ as *const _;
}

if let Some(win32_monitor) = win32_monitor {
let next = full_screen_exclusive_win32_info.insert(
let next = full_screen_exclusive_win32_info_vk.insert(
ash::vk::SurfaceFullScreenExclusiveWin32InfoEXT {
hmonitor: win32_monitor.0,
..Default::default()
},
);

next.p_next = info2.p_next as *mut _;
info2.p_next = next as *const _ as *const _;
next.p_next = info_vk.p_next as *mut _;
info_vk.p_next = next as *const _ as *const _;
}

/* Output */

let mut capabilities2 = ash::vk::SurfaceCapabilities2KHR::default();
let mut capabilities_full_screen_exclusive = None;
let mut protected_capabilities = None;
let mut capabilities_vk = ash::vk::SurfaceCapabilities2KHR::default();
let mut capabilities_full_screen_exclusive_vk = None;
let mut protected_capabilities_vk = None;

if full_screen_exclusive_info.is_some() {
let next = capabilities_full_screen_exclusive
if full_screen_exclusive_info_vk.is_some() {
let next = capabilities_full_screen_exclusive_vk
.insert(ash::vk::SurfaceCapabilitiesFullScreenExclusiveEXT::default());

next.p_next = info2.p_next as *mut _;
info2.p_next = next as *const _ as *const _;
next.p_next = capabilities_vk.p_next as *mut _;
capabilities_vk.p_next = next as *mut _ as *mut _;
}

if self
.instance
.enabled_extensions()
.khr_surface_protected_capabilities
{
let next =
protected_capabilities.insert(ash::vk::SurfaceProtectedCapabilitiesKHR::default());
let next = protected_capabilities_vk
.insert(ash::vk::SurfaceProtectedCapabilitiesKHR::default());

next.p_next = info2.p_next as *mut _;
info2.p_next = next as *const _ as *const _;
next.p_next = capabilities_vk.p_next as *mut _;
capabilities_vk.p_next = next as *mut _ as *mut _;
}

let fns = self.instance.fns();
Expand All @@ -1608,72 +1608,74 @@ impl PhysicalDevice {
(fns.khr_get_surface_capabilities2
.get_physical_device_surface_capabilities2_khr)(
self.handle(),
&info2,
&mut capabilities2,
&info_vk,
&mut capabilities_vk,
)
.result()
.map_err(VulkanError::from)?;
} else {
(fns.khr_surface.get_physical_device_surface_capabilities_khr)(
self.handle(),
info2.surface,
&mut capabilities2.surface_capabilities,
info_vk.surface,
&mut capabilities_vk.surface_capabilities,
)
.result()
.map_err(VulkanError::from)?;
};

Ok(SurfaceCapabilities {
min_image_count: capabilities2.surface_capabilities.min_image_count,
max_image_count: if capabilities2.surface_capabilities.max_image_count == 0 {
min_image_count: capabilities_vk.surface_capabilities.min_image_count,
max_image_count: if capabilities_vk.surface_capabilities.max_image_count == 0 {
None
} else {
Some(capabilities2.surface_capabilities.max_image_count)
Some(capabilities_vk.surface_capabilities.max_image_count)
},
current_extent: if capabilities2.surface_capabilities.current_extent.width == 0xffffffff
&& capabilities2.surface_capabilities.current_extent.height == 0xffffffff
current_extent: if capabilities_vk.surface_capabilities.current_extent.width
== 0xffffffff
&& capabilities_vk.surface_capabilities.current_extent.height == 0xffffffff
{
None
} else {
Some([
capabilities2.surface_capabilities.current_extent.width,
capabilities2.surface_capabilities.current_extent.height,
capabilities_vk.surface_capabilities.current_extent.width,
capabilities_vk.surface_capabilities.current_extent.height,
])
},
min_image_extent: [
capabilities2.surface_capabilities.min_image_extent.width,
capabilities2.surface_capabilities.min_image_extent.height,
capabilities_vk.surface_capabilities.min_image_extent.width,
capabilities_vk.surface_capabilities.min_image_extent.height,
],
max_image_extent: [
capabilities2.surface_capabilities.max_image_extent.width,
capabilities2.surface_capabilities.max_image_extent.height,
capabilities_vk.surface_capabilities.max_image_extent.width,
capabilities_vk.surface_capabilities.max_image_extent.height,
],
max_image_array_layers: capabilities2.surface_capabilities.max_image_array_layers,
supported_transforms: capabilities2
max_image_array_layers: capabilities_vk.surface_capabilities.max_image_array_layers,
supported_transforms: capabilities_vk
.surface_capabilities
.supported_transforms
.into(),

current_transform: SupportedSurfaceTransforms::from(
capabilities2.surface_capabilities.current_transform,
capabilities_vk.surface_capabilities.current_transform,
)
.iter()
.next()
.unwrap(), // TODO:
supported_composite_alpha: capabilities2
supported_composite_alpha: capabilities_vk
.surface_capabilities
.supported_composite_alpha
.into(),
supported_usage_flags: {
let usage =
ImageUsage::from(capabilities2.surface_capabilities.supported_usage_flags);
ImageUsage::from(capabilities_vk.surface_capabilities.supported_usage_flags);
debug_assert!(usage.color_attachment); // specs say that this must be true
usage
},

supports_protected: protected_capabilities.map_or(false, |c| c.supports_protected != 0),
supports_protected: protected_capabilities_vk
.map_or(false, |c| c.supports_protected != 0),

full_screen_exclusive_supported: capabilities_full_screen_exclusive
full_screen_exclusive_supported: capabilities_full_screen_exclusive_vk
.map_or(false, |c| c.full_screen_exclusive_supported != 0),
})
}
Expand Down

0 comments on commit 59a8c45

Please sign in to comment.