commit 87a1e2a5ca9e692e21e6589ecbbcb29caab79b5f
parent b1b84d814fc4fdc453893b3bd8b9c82750c54f76
Author: agoloman <agoloman@mozilla.com>
Date: Tue, 9 Dec 2025 08:25:06 +0200
Revert "Bug 1984493 - Create `mod macos` in `wgpu_bindings::server` r=webgpu-reviewers,teoxoy" for causing macos build bustages @rust.mk.
This reverts commit 6cedbdbba038c732243e83e0f36fa184f3d06a5b.
Diffstat:
1 file changed, 184 insertions(+), 209 deletions(-)
diff --git a/gfx/wgpu_bindings/src/server.rs b/gfx/wgpu_bindings/src/server.rs
@@ -1813,6 +1813,118 @@ impl Global {
}
}
+ #[cfg(target_os = "macos")]
+ fn create_texture_with_shared_texture_iosurface(
+ &self,
+ device_id: id::DeviceId,
+ texture_id: id::TextureId,
+ desc: &wgc::resource::TextureDescriptor,
+ swap_chain_id: Option<SwapChainId>,
+ ) -> bool {
+ use metal::foreign_types::ForeignType as _;
+
+ let ret = unsafe {
+ wgpu_server_ensure_shared_texture_for_swap_chain(
+ self.owner,
+ swap_chain_id.unwrap(),
+ device_id,
+ texture_id,
+ desc.size.width,
+ desc.size.height,
+ desc.format,
+ desc.usage,
+ )
+ };
+ if ret != true {
+ let msg = c"Failed to create shared texture";
+ unsafe {
+ gfx_critical_note(msg.as_ptr());
+ }
+ return false;
+ }
+
+ let io_surface_id =
+ unsafe { wgpu_server_get_external_io_surface_id(self.owner, texture_id) };
+ if io_surface_id == 0 {
+ let msg = c"Failed to get io surface id";
+ unsafe {
+ gfx_critical_note(msg.as_ptr());
+ }
+ return false;
+ }
+
+ let io_surface = io_surface::lookup(io_surface_id);
+
+ let desc_ref = &desc;
+
+ let raw_texture: metal::Texture = unsafe {
+ let Some(hal_device) = self.device_as_hal::<wgc::api::Metal>(device_id) else {
+ emit_critical_invalid_note("metal device");
+ return false;
+ };
+
+ let device = hal_device.raw_device();
+
+ objc::rc::autoreleasepool(|| {
+ let descriptor = metal::TextureDescriptor::new();
+ let usage = metal::MTLTextureUsage::RenderTarget
+ | metal::MTLTextureUsage::ShaderRead
+ | metal::MTLTextureUsage::PixelFormatView;
+
+ descriptor.set_texture_type(metal::MTLTextureType::D2);
+ descriptor.set_width(desc_ref.size.width as u64);
+ descriptor.set_height(desc_ref.size.height as u64);
+ descriptor.set_mipmap_level_count(desc_ref.mip_level_count as u64);
+ descriptor.set_pixel_format(metal::MTLPixelFormat::BGRA8Unorm);
+ descriptor.set_usage(usage);
+ descriptor.set_storage_mode(metal::MTLStorageMode::Private);
+
+ let raw_device = device.lock();
+ msg_send![*raw_device, newTextureWithDescriptor: descriptor iosurface:io_surface.obj plane:0]
+ })
+ };
+
+ if raw_texture.as_ptr().is_null() {
+ let msg = c"Failed to create metal::Texture for swap chain";
+ unsafe {
+ gfx_critical_note(msg.as_ptr());
+ }
+ return false;
+ }
+
+ if let Some(label) = &desc_ref.label {
+ raw_texture.set_label(&label);
+ }
+
+ let hal_texture = unsafe {
+ <wgh::api::Metal as wgh::Api>::Device::texture_from_raw(
+ raw_texture,
+ wgt::TextureFormat::Bgra8Unorm,
+ metal::MTLTextureType::D2,
+ 1,
+ 1,
+ wgh::CopyExtent {
+ width: desc.size.width,
+ height: desc.size.height,
+ depth: 1,
+ },
+ )
+ };
+
+ let (_, error) = unsafe {
+ self.create_texture_from_hal(Box::new(hal_texture), device_id, &desc, Some(texture_id))
+ };
+ if let Some(err) = error {
+ let msg = CString::new(format!("create_texture_from_hal() failed: {:?}", err)).unwrap();
+ unsafe {
+ gfx_critical_note(msg.as_ptr());
+ }
+ return false;
+ }
+
+ true
+ }
+
fn device_action(
&self,
device_id: id::DeviceId,
@@ -3131,220 +3243,83 @@ pub unsafe extern "C" fn wgpu_server_device_wait_fence_from_shared_handle(
res.is_ok()
}
+/// Imports a Metal texture from the specified plane of an IOSurface.
#[cfg(target_os = "macos")]
-mod macos {
- use std::ffi::CString;
-
- use super::{emit_critical_invalid_note, gfx_critical_note, Global};
- use crate::{
- error::ErrorBuffer,
- server::{
- wgpu_server_ensure_shared_texture_for_swap_chain,
- wgpu_server_get_external_io_surface_id,
- },
- wgpu_string, SwapChainId,
- };
-
- use nsstring::nsACString;
- use objc::msg_send;
- use wgc::id;
-
- /// Imports a Metal texture from the specified plane of an IOSurface.
- #[no_mangle]
- pub unsafe extern "C" fn wgpu_server_device_import_texture_from_iosurface(
- global: &Global,
- device_id: id::DeviceId,
- id_in: id::TextureId,
- desc: &wgt::TextureDescriptor<Option<&nsACString>, crate::FfiSlice<wgt::TextureFormat>>,
- io_surface_id: u32,
- plane: usize,
- mut error_buf: ErrorBuffer,
- ) {
- let desc = desc.map_label_and_view_formats(|l| wgpu_string(*l), |v| v.as_slice().to_vec());
+#[no_mangle]
+pub unsafe extern "C" fn wgpu_server_device_import_texture_from_iosurface(
+ global: &Global,
+ device_id: id::DeviceId,
+ id_in: id::TextureId,
+ desc: &wgt::TextureDescriptor<Option<&nsACString>, crate::FfiSlice<wgt::TextureFormat>>,
+ io_surface_id: u32,
+ plane: usize,
+ mut error_buf: ErrorBuffer,
+) {
+ let desc = desc.map_label_and_view_formats(|l| wgpu_string(*l), |v| v.as_slice().to_vec());
- let surface = io_surface::lookup(io_surface_id);
+ let surface = io_surface::lookup(io_surface_id);
- let Some(hal_device) = global.device_as_hal::<wgc::api::Metal>(device_id) else {
- emit_critical_invalid_note("metal device");
- global.create_texture_error(Some(id_in), &desc);
- return;
- };
- let metal_device = hal_device.raw_device().lock();
-
- let metal_desc = metal::TextureDescriptor::new();
- let texture_type = match desc.dimension {
- wgt::TextureDimension::D1 => metal::MTLTextureType::D1,
- wgt::TextureDimension::D2 => {
- if desc.sample_count > 1 {
- metal_desc.set_sample_count(desc.sample_count as u64);
- metal::MTLTextureType::D2Multisample
- } else if desc.size.depth_or_array_layers > 1 {
- metal_desc.set_array_length(desc.size.depth_or_array_layers as u64);
- metal::MTLTextureType::D2Array
- } else {
- metal::MTLTextureType::D2
- }
- }
- wgt::TextureDimension::D3 => {
- metal_desc.set_depth(desc.size.depth_or_array_layers as u64);
- metal::MTLTextureType::D3
+ let Some(hal_device) = global.device_as_hal::<wgc::api::Metal>(device_id) else {
+ emit_critical_invalid_note("metal device");
+ global.create_texture_error(Some(id_in), &desc);
+ return;
+ };
+ let metal_device = hal_device.raw_device().lock();
+
+ let metal_desc = metal::TextureDescriptor::new();
+ let texture_type = match desc.dimension {
+ wgt::TextureDimension::D1 => metal::MTLTextureType::D1,
+ wgt::TextureDimension::D2 => {
+ if desc.sample_count > 1 {
+ metal_desc.set_sample_count(desc.sample_count as u64);
+ metal::MTLTextureType::D2Multisample
+ } else if desc.size.depth_or_array_layers > 1 {
+ metal_desc.set_array_length(desc.size.depth_or_array_layers as u64);
+ metal::MTLTextureType::D2Array
+ } else {
+ metal::MTLTextureType::D2
}
- };
- metal_desc.set_texture_type(texture_type);
- let format = match desc.format {
- wgt::TextureFormat::Rgba8Unorm => metal::MTLPixelFormat::RGBA8Unorm,
- wgt::TextureFormat::Bgra8Unorm => metal::MTLPixelFormat::BGRA8Unorm,
- wgt::TextureFormat::R8Unorm => metal::MTLPixelFormat::R8Unorm,
- wgt::TextureFormat::Rg8Unorm => metal::MTLPixelFormat::RG8Unorm,
- wgt::TextureFormat::R16Unorm => metal::MTLPixelFormat::R16Unorm,
- wgt::TextureFormat::Rg16Unorm => metal::MTLPixelFormat::RG16Unorm,
- _ => unreachable!(),
- };
- metal_desc.set_pixel_format(format);
- metal_desc.set_width(desc.size.width as u64);
- metal_desc.set_height(desc.size.height as u64);
- metal_desc.set_mipmap_level_count(desc.mip_level_count as u64);
- metal_desc.set_storage_mode(metal::MTLStorageMode::Private);
- metal_desc.set_usage(metal::MTLTextureUsage::ShaderRead);
-
- let metal_texture: metal::Texture = msg_send![
- *metal_device,
- newTextureWithDescriptor:metal_desc iosurface:surface.obj plane:plane
- ];
-
- let hal_texture = <wgh::api::Metal as wgh::Api>::Device::texture_from_raw(
- metal_texture,
- desc.format,
- texture_type,
- desc.array_layer_count(),
- desc.mip_level_count,
- wgh::CopyExtent::map_extent_to_copy_size(&desc.size, desc.dimension),
- );
-
- let (_, error) = unsafe {
- global.create_texture_from_hal(Box::new(hal_texture), device_id, &desc, Some(id_in))
- };
- if let Some(err) = error {
- error_buf.init(err, device_id);
}
- }
-
- impl super::Global {
- pub(super) fn create_texture_with_shared_texture_iosurface(
- &self,
- device_id: id::DeviceId,
- texture_id: id::TextureId,
- desc: &wgc::resource::TextureDescriptor,
- swap_chain_id: Option<SwapChainId>,
- ) -> bool {
- use metal::foreign_types::ForeignType as _;
-
- let ret = unsafe {
- wgpu_server_ensure_shared_texture_for_swap_chain(
- self.owner,
- swap_chain_id.unwrap(),
- device_id,
- texture_id,
- desc.size.width,
- desc.size.height,
- desc.format,
- desc.usage,
- )
- };
- if ret != true {
- let msg = c"Failed to create shared texture";
- unsafe {
- gfx_critical_note(msg.as_ptr());
- }
- return false;
- }
-
- let io_surface_id =
- unsafe { wgpu_server_get_external_io_surface_id(self.owner, texture_id) };
- if io_surface_id == 0 {
- let msg = c"Failed to get io surface id";
- unsafe {
- gfx_critical_note(msg.as_ptr());
- }
- return false;
- }
-
- let io_surface = io_surface::lookup(io_surface_id);
-
- let desc_ref = &desc;
-
- let raw_texture: metal::Texture = unsafe {
- let Some(hal_device) = self.device_as_hal::<wgc::api::Metal>(device_id) else {
- emit_critical_invalid_note("metal device");
- return false;
- };
-
- let device = hal_device.raw_device();
-
- objc::rc::autoreleasepool(|| {
- let descriptor = metal::TextureDescriptor::new();
- let usage = metal::MTLTextureUsage::RenderTarget
- | metal::MTLTextureUsage::ShaderRead
- | metal::MTLTextureUsage::PixelFormatView;
-
- descriptor.set_texture_type(metal::MTLTextureType::D2);
- descriptor.set_width(desc_ref.size.width as u64);
- descriptor.set_height(desc_ref.size.height as u64);
- descriptor.set_mipmap_level_count(desc_ref.mip_level_count as u64);
- descriptor.set_pixel_format(metal::MTLPixelFormat::BGRA8Unorm);
- descriptor.set_usage(usage);
- descriptor.set_storage_mode(metal::MTLStorageMode::Private);
-
- let raw_device = device.lock();
- msg_send![*raw_device, newTextureWithDescriptor: descriptor iosurface:io_surface.obj plane:0]
- })
- };
-
- if raw_texture.as_ptr().is_null() {
- let msg = c"Failed to create metal::Texture for swap chain";
- unsafe {
- gfx_critical_note(msg.as_ptr());
- }
- return false;
- }
-
- if let Some(label) = &desc_ref.label {
- raw_texture.set_label(&label);
- }
-
- let hal_texture = unsafe {
- <wgh::api::Metal as wgh::Api>::Device::texture_from_raw(
- raw_texture,
- wgt::TextureFormat::Bgra8Unorm,
- metal::MTLTextureType::D2,
- 1,
- 1,
- wgh::CopyExtent {
- width: desc.size.width,
- height: desc.size.height,
- depth: 1,
- },
- )
- };
-
- let (_, error) = unsafe {
- self.create_texture_from_hal(
- Box::new(hal_texture),
- device_id,
- &desc,
- Some(texture_id),
- )
- };
- if let Some(err) = error {
- let msg =
- CString::new(format!("create_texture_from_hal() failed: {:?}", err)).unwrap();
- unsafe {
- gfx_critical_note(msg.as_ptr());
- }
- return false;
- }
-
- true
+ wgt::TextureDimension::D3 => {
+ metal_desc.set_depth(desc.size.depth_or_array_layers as u64);
+ metal::MTLTextureType::D3
}
+ };
+ metal_desc.set_texture_type(texture_type);
+ let format = match desc.format {
+ wgt::TextureFormat::Rgba8Unorm => metal::MTLPixelFormat::RGBA8Unorm,
+ wgt::TextureFormat::Bgra8Unorm => metal::MTLPixelFormat::BGRA8Unorm,
+ wgt::TextureFormat::R8Unorm => metal::MTLPixelFormat::R8Unorm,
+ wgt::TextureFormat::Rg8Unorm => metal::MTLPixelFormat::RG8Unorm,
+ wgt::TextureFormat::R16Unorm => metal::MTLPixelFormat::R16Unorm,
+ wgt::TextureFormat::Rg16Unorm => metal::MTLPixelFormat::RG16Unorm,
+ _ => unreachable!(),
+ };
+ metal_desc.set_pixel_format(format);
+ metal_desc.set_width(desc.size.width as u64);
+ metal_desc.set_height(desc.size.height as u64);
+ metal_desc.set_mipmap_level_count(desc.mip_level_count as u64);
+ metal_desc.set_storage_mode(metal::MTLStorageMode::Private);
+ metal_desc.set_usage(metal::MTLTextureUsage::ShaderRead);
+
+ let metal_texture: metal::Texture = msg_send![
+ *metal_device,
+ newTextureWithDescriptor:metal_desc iosurface:surface.obj plane:plane
+ ];
+
+ let hal_texture = <wgh::api::Metal as wgh::Api>::Device::texture_from_raw(
+ metal_texture,
+ desc.format,
+ texture_type,
+ desc.array_layer_count(),
+ desc.mip_level_count,
+ wgh::CopyExtent::map_extent_to_copy_size(&desc.size, desc.dimension),
+ );
+
+ let (_, error) = unsafe {
+ global.create_texture_from_hal(Box::new(hal_texture), device_id, &desc, Some(id_in))
+ };
+ if let Some(err) = error {
+ error_buf.init(err, device_id);
}
}