From 15a77b525c6dc76b39b8bd191d0ddfe21ddbcef6 Mon Sep 17 00:00:00 2001 From: Xiaopeng Li Date: Fri, 3 Jan 2025 08:48:54 +0800 Subject: [PATCH] expose VULKAN_EXTERNAL_MEMORY_WIN32 feature (#6825) --- wgpu-hal/src/vulkan/adapter.rs | 8 +++++--- wgpu-hal/src/vulkan/device.rs | 10 +++++++--- wgpu-hal/src/vulkan/mod.rs | 2 -- wgpu-types/src/lib.rs | 10 ++++++++++ 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/wgpu-hal/src/vulkan/adapter.rs b/wgpu-hal/src/vulkan/adapter.rs index 03c332682a..ff56e38830 100644 --- a/wgpu-hal/src/vulkan/adapter.rs +++ b/wgpu-hal/src/vulkan/adapter.rs @@ -776,6 +776,11 @@ impl PhysicalDeviceFeatures { caps.supports_extension(google::display_timing::NAME), ); + features.set( + F::VULKAN_EXTERNAL_MEMORY_WIN32, + caps.supports_extension(khr::external_memory_win32::NAME), + ); + (features, dl_flags) } @@ -1554,9 +1559,6 @@ impl super::Instance { .is_some_and(|ext| ext.shader_zero_initialize_workgroup_memory == vk::TRUE), image_format_list: phd_capabilities.device_api_version >= vk::API_VERSION_1_2 || phd_capabilities.supports_extension(khr::image_format_list::NAME), - #[cfg(windows)] - external_memory_win32: phd_capabilities - .supports_extension(khr::external_memory_win32::NAME), }; let capabilities = crate::Capabilities { limits: phd_capabilities.to_wgpu_limits(), diff --git a/wgpu-hal/src/vulkan/device.rs b/wgpu-hal/src/vulkan/device.rs index f18177292c..6c4a2a3615 100644 --- a/wgpu-hal/src/vulkan/device.rs +++ b/wgpu-hal/src/vulkan/device.rs @@ -786,7 +786,7 @@ impl super::Device { /// # Safety /// - /// - Vulkan 1.1+ (or VK_KHR_external_memory) + /// - Vulkan (with VK_KHR_external_memory_win32) /// - The `d3d11_shared_handle` must be valid and respecting `desc` /// - `VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT` flag is used because we need to hold a reference to the handle #[cfg(windows)] @@ -795,8 +795,12 @@ impl super::Device { d3d11_shared_handle: windows::Win32::Foundation::HANDLE, desc: &crate::TextureDescriptor, ) -> Result { - if !self.shared.private_caps.external_memory_win32 { - log::error!("VK_KHR_external_memory extension is required"); + if !self + .shared + .features + .contains(wgt::Features::VULKAN_EXTERNAL_MEMORY_WIN32) + { + log::error!("Vulkan driver does not support VK_KHR_external_memory_win32"); return Err(crate::DeviceError::ResourceCreationFailed); } diff --git a/wgpu-hal/src/vulkan/mod.rs b/wgpu-hal/src/vulkan/mod.rs index 83a6b7e903..12daaf32a7 100644 --- a/wgpu-hal/src/vulkan/mod.rs +++ b/wgpu-hal/src/vulkan/mod.rs @@ -532,8 +532,6 @@ struct PrivateCapabilities { robust_image_access2: bool, zero_initialize_workgroup_memory: bool, image_format_list: bool, - #[cfg(windows)] - external_memory_win32: bool, } bitflags::bitflags!( diff --git a/wgpu-types/src/lib.rs b/wgpu-types/src/lib.rs index de377144dd..3c17a57af2 100644 --- a/wgpu-types/src/lib.rs +++ b/wgpu-types/src/lib.rs @@ -942,6 +942,16 @@ bitflags::bitflags! { /// [VK_GOOGLE_display_timing]: https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_GOOGLE_display_timing.html /// [`Surface::as_hal()`]: https://docs.rs/wgpu/latest/wgpu/struct.Surface.html#method.as_hal const VULKAN_GOOGLE_DISPLAY_TIMING = 1 << 62; + + /// Allows using the [VK_KHR_external_memory_win32] Vulkan extension. + /// + /// Supported platforms: + /// - Vulkan (with [VK_KHR_external_memory_win32]) + /// + /// This is a native only feature. + /// + /// [VK_KHR_external_memory_win32]: https://registry.khronos.org/vulkan/specs/latest/man/html/VK_KHR_external_memory_win32.html + const VULKAN_EXTERNAL_MEMORY_WIN32 = 1 << 63; } }