Skip to content

Commit 2ce979b

Browse files
committed
add ImageWithoutMemory struct
1 parent c9f009e commit 2ce979b

File tree

1 file changed

+44
-24
lines changed

1 file changed

+44
-24
lines changed

wgpu-hal/src/vulkan/device.rs

Lines changed: 44 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -699,6 +699,7 @@ impl super::Device {
699699
.get_physical_device_memory_properties(self.shared.physical_device)
700700
};
701701

702+
// https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkPhysicalDeviceMemoryProperties.html
702703
for (i, mem_ty) in mem_properties.memory_types_as_slice().iter().enumerate() {
703704
if type_bits & (1 << i) != 0 && mem_ty.property_flags & flags == flags {
704705
return Some(i);
@@ -712,16 +713,7 @@ impl super::Device {
712713
&self,
713714
desc: &crate::TextureDescriptor,
714715
external_memory_image_create_info: Option<&mut vk::ExternalMemoryImageCreateInfo>,
715-
) -> Result<
716-
(
717-
vk::Image,
718-
vk::MemoryRequirements,
719-
crate::CopyExtent,
720-
Vec<wgt::TextureFormat>,
721-
vk::ImageCreateFlags,
722-
),
723-
crate::DeviceError,
724-
> {
716+
) -> Result<ImageWithoutMemory, crate::DeviceError> {
725717
let copy_size = desc.copy_extent();
726718

727719
let mut raw_flags = vk::ImageCreateFlags::empty();
@@ -781,7 +773,13 @@ impl super::Device {
781773
}
782774
let req = unsafe { self.shared.raw.get_image_memory_requirements(raw) };
783775

784-
Ok((raw, req, copy_size, wgt_view_formats, raw_flags))
776+
Ok(ImageWithoutMemory {
777+
raw,
778+
requirements: req,
779+
copy_size,
780+
view_formats: wgt_view_formats,
781+
raw_flags,
782+
})
785783
}
786784

787785
/// # Safety
@@ -792,29 +790,38 @@ impl super::Device {
792790
#[cfg(windows)]
793791
pub unsafe fn texture_from_d3d11_shared_handle(
794792
&self,
795-
d3d11_shared_handle: *mut std::ffi::c_void,
793+
d3d11_shared_handle: windows::Win32::Foundation::HANDLE,
796794
desc: &crate::TextureDescriptor,
797795
) -> Result<super::Texture, crate::DeviceError> {
798796
if !self.shared.private_caps.external_memory_win32 {
797+
log::error!("VK_KHR_external_memory extension is required");
799798
return Err(crate::DeviceError::ResourceCreationFailed);
800799
}
801800

802801
let mut external_memory_image_info = vk::ExternalMemoryImageCreateInfo::default()
803802
.handle_types(vk::ExternalMemoryHandleTypeFlags::D3D11_TEXTURE);
804803

805-
let (raw, req, copy_size, wgt_view_formats, raw_flags) =
806-
self.create_image_without_memory(desc, Some(&mut external_memory_image_info))?;
804+
let ImageWithoutMemory {
805+
raw,
806+
requirements,
807+
copy_size,
808+
view_formats,
809+
raw_flags,
810+
} = self.create_image_without_memory(desc, Some(&mut external_memory_image_info))?;
807811

808812
let mut import_memory_info = vk::ImportMemoryWin32HandleInfoKHR::default()
809813
.handle_type(vk::ExternalMemoryHandleTypeFlags::D3D11_TEXTURE)
810-
.handle(d3d11_shared_handle as _);
814+
.handle(d3d11_shared_handle.0 as _);
811815

812816
let mem_type_index = self
813-
.find_memory_type_index(req.memory_type_bits, vk::MemoryPropertyFlags::DEVICE_LOCAL)
817+
.find_memory_type_index(
818+
requirements.memory_type_bits,
819+
vk::MemoryPropertyFlags::DEVICE_LOCAL,
820+
)
814821
.ok_or(crate::DeviceError::ResourceCreationFailed)?;
815822

816823
let memory_allocate_info = vk::MemoryAllocateInfo::default()
817-
.allocation_size(req.size)
824+
.allocation_size(requirements.size)
818825
.memory_type_index(mem_type_index as _)
819826
.push_next(&mut import_memory_info);
820827
let memory = unsafe { self.shared.raw.allocate_memory(&memory_allocate_info, None) }
@@ -838,7 +845,7 @@ impl super::Device {
838845
format: desc.format,
839846
raw_flags,
840847
copy_size,
841-
view_formats: wgt_view_formats,
848+
view_formats,
842849
})
843850
}
844851

@@ -1170,17 +1177,22 @@ impl crate::Device for super::Device {
11701177
&self,
11711178
desc: &crate::TextureDescriptor,
11721179
) -> Result<super::Texture, crate::DeviceError> {
1173-
let (raw, req, copy_size, wgt_view_formats, raw_flags) =
1174-
self.create_image_without_memory(desc, None)?;
1180+
let ImageWithoutMemory {
1181+
raw,
1182+
requirements,
1183+
copy_size,
1184+
view_formats,
1185+
raw_flags,
1186+
} = self.create_image_without_memory(desc, None)?;
11751187

11761188
let block = unsafe {
11771189
self.mem_allocator.lock().alloc(
11781190
&*self.shared,
11791191
gpu_alloc::Request {
1180-
size: req.size,
1181-
align_mask: req.alignment - 1,
1192+
size: requirements.size,
1193+
align_mask: requirements.alignment - 1,
11821194
usage: gpu_alloc::UsageFlags::FAST_DEVICE_ACCESS,
1183-
memory_types: req.memory_type_bits & self.valid_ash_memory_types,
1195+
memory_types: requirements.memory_type_bits & self.valid_ash_memory_types,
11841196
},
11851197
)?
11861198
};
@@ -1209,7 +1221,7 @@ impl crate::Device for super::Device {
12091221
format: desc.format,
12101222
raw_flags,
12111223
copy_size,
1212-
view_formats: wgt_view_formats,
1224+
view_formats,
12131225
})
12141226
}
12151227
unsafe fn destroy_texture(&self, texture: super::Texture) {
@@ -2669,3 +2681,11 @@ impl From<gpu_descriptor::AllocationError> for crate::DeviceError {
26692681
fn handle_unexpected(err: vk::Result) -> ! {
26702682
panic!("Unexpected Vulkan error: `{err}`")
26712683
}
2684+
2685+
struct ImageWithoutMemory {
2686+
raw: vk::Image,
2687+
requirements: vk::MemoryRequirements,
2688+
copy_size: crate::CopyExtent,
2689+
view_formats: Vec<wgt::TextureFormat>,
2690+
raw_flags: vk::ImageCreateFlags,
2691+
}

0 commit comments

Comments
 (0)