1#![allow(
2 clippy::module_name_repetitions,
3 clippy::too_many_lines,
4 clippy::type_complexity
5)]
6
7use crate::{
8 ffi,
9 util::{c_string, take_optional_string},
10 ComputePipelineState, DynamicLibrary, MetalDevice, MetalLibrary, RenderPipelineState,
11};
12use core::ffi::{c_char, c_void, CStr};
13use core::ptr;
14use core::sync::atomic::{AtomicBool, Ordering};
15use doom_fish_utils::callback_context::CallbackContext;
16use std::path::Path;
17use std::sync::{Mutex, PoisonError};
18
19macro_rules! opaque_symbol_handle {
20 ($(#[$meta:meta])* pub struct $name:ident;) => {
21 $(#[$meta])*
22pub struct $name {
24 ptr: *mut c_void,
25 }
26
27 unsafe impl Send for $name {}
31 unsafe impl Sync for $name {}
32
33 impl Drop for $name {
34 fn drop(&mut self) {
35 if !self.ptr.is_null() {
36 unsafe { ffi::ametal_object_release(self.ptr) };
37 self.ptr = ptr::null_mut();
38 }
39 }
40 }
41
42 impl $name {
43#[must_use]
45 pub const fn as_ptr(&self) -> *mut c_void {
46 self.ptr
47 }
48
49 #[must_use]
58 pub unsafe fn from_raw(ptr: *mut c_void) -> Self {
59 Self { ptr }
60 }
61
62 #[allow(dead_code)]
63 fn wrap(ptr: *mut c_void) -> Option<Self> {
64 if ptr.is_null() {
65 None
66 } else {
67 Some(Self { ptr })
68 }
69 }
70
71#[must_use]
73 pub fn label(&self) -> Option<String> {
74 unsafe { take_optional_string(ffi::ametal_object_copy_label(self.ptr)) }
75 }
76 }
77 };
78}
79
80macro_rules! opaque_symbol_class {
81 ($(#[$meta:meta])* pub struct $name:ident => $objc:literal;) => {
82 opaque_symbol_handle!(
83 $(#[$meta])*
84pub struct $name;
86 );
87
88 impl $name {
89#[must_use]
91 pub fn new() -> Option<Self> {
92 Self::wrap(unsafe {
93 ffi::ametal_new_class_instance(concat!($objc, "\0").as_ptr().cast())
94 })
95 }
96 }
97 };
98}
99
100macro_rules! raw_value_type {
101 ($(#[$meta:meta])* pub struct $name:ident($ty:ty);) => {
102 $(#[$meta])*
103#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
105 #[repr(transparent)]
106 pub struct $name(pub $ty);
107
108 impl $name {
109#[must_use]
111 pub const fn from_raw(raw: $ty) -> Self {
112 Self(raw)
113 }
114
115#[must_use]
117 pub const fn as_raw(self) -> $ty {
118 self.0
119 }
120 }
121 };
122}
123
124macro_rules! metal_string_constant {
125 ($(#[$meta:meta])* pub fn $name:ident => $symbol:literal;) => {
126 $(#[$meta])*
127#[must_use]
129 pub fn $name() -> Option<String> {
130 unsafe {
131 take_optional_string(
132 ffi::ametal_copy_metal_string_constant(concat!($symbol, "\0").as_ptr().cast()),
133 )
134 }
135 }
136 };
137}
138
139unsafe fn take_device_array(ptr: *mut *mut c_void, count: usize) -> Vec<MetalDevice> {
151 if ptr.is_null() || count == 0 {
152 return Vec::new();
153 }
154
155 let slice = core::slice::from_raw_parts(ptr, count);
156 let values = slice
157 .iter()
158 .copied()
159 .map(|device| unsafe { MetalDevice::from_raw(device) })
160 .collect();
161 libc::free(ptr.cast());
162 values
163}
164
165pub type MetalCommonCounter = String;
167pub type MetalCommonCounterSet = String;
169pub type MetalDeviceNotificationName = String;
171pub type MetalAutoreleasedArgument = MetalArgument;
173pub type MetalArgumentType = MetalBindingType;
175pub type MetalAutoreleasedComputePipelineReflection = MetalComputePipelineReflection;
177pub type MetalAutoreleasedRenderPipelineReflection = MetalRenderPipelineReflection;
179pub type MetalNewLibraryCompletionHandler =
181 Box<dyn FnMut(Result<MetalLibrary, String>) + Send + 'static>;
182pub type MetalNewDynamicLibraryCompletionHandler =
184 Box<dyn FnMut(Result<DynamicLibrary, String>) + Send + 'static>;
185pub type MetalNewComputePipelineStateCompletionHandler =
187 Box<dyn FnMut(Result<ComputePipelineState, String>) + Send + 'static>;
188pub type MetalNewComputePipelineStateWithReflectionCompletionHandler = Box<
190 dyn FnMut(Result<(ComputePipelineState, MetalComputePipelineReflection), String>)
191 + Send
192 + 'static,
193>;
194pub type MetalNewRenderPipelineStateCompletionHandler =
196 Box<dyn FnMut(Result<RenderPipelineState, String>) + Send + 'static>;
197pub type MetalNewRenderPipelineStateWithReflectionCompletionHandler = Box<
199 dyn FnMut(Result<(RenderPipelineState, MetalRenderPipelineReflection), String>)
200 + Send
201 + 'static,
202>;
203pub type MetalTimestamp = u64;
205
206#[derive(Debug, Clone, Copy, Default, PartialEq)]
218pub struct MetalCoordinate2D {
219 pub x: f32,
221 pub y: f32,
223}
224
225impl MetalCoordinate2D {
226 #[must_use]
228 pub const fn new(x: f32, y: f32) -> Self {
229 Self { x, y }
230 }
231}
232
233#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
245pub struct MetalSize {
246 pub width: usize,
248 pub height: usize,
250 pub depth: usize,
252}
253
254impl MetalSize {
255 #[must_use]
257 pub const fn new(width: usize, height: usize, depth: usize) -> Self {
258 Self {
259 width,
260 height,
261 depth,
262 }
263 }
264}
265
266raw_value_type!(
267 pub struct MetalGpuAddress(u64);
278);
279
280#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
291pub struct MetalOrigin {
292 pub x: usize,
294 pub y: usize,
296 pub z: usize,
298}
299
300impl MetalOrigin {
301 #[must_use]
303 pub const fn new(x: usize, y: usize, z: usize) -> Self {
304 Self { x, y, z }
305 }
306}
307
308#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
320pub struct MetalRegion {
321 pub origin: MetalOrigin,
323 pub size: MetalSize,
325}
326
327impl MetalRegion {
328 #[must_use]
330 pub const fn new(origin: MetalOrigin, size: MetalSize) -> Self {
331 Self { origin, size }
332 }
333
334 #[must_use]
336 pub const fn new_1d(x: usize, width: usize) -> Self {
337 Self {
338 origin: MetalOrigin::new(x, 0, 0),
339 size: MetalSize::new(width, 1, 1),
340 }
341 }
342
343 #[must_use]
345 pub const fn new_2d(x: usize, y: usize, width: usize, height: usize) -> Self {
346 Self {
347 origin: MetalOrigin::new(x, y, 0),
348 size: MetalSize::new(width, height, 1),
349 }
350 }
351
352 #[must_use]
354 pub const fn new_3d(
355 x: usize,
356 y: usize,
357 z: usize,
358 width: usize,
359 height: usize,
360 depth: usize,
361 ) -> Self {
362 Self {
363 origin: MetalOrigin::new(x, y, z),
364 size: MetalSize::new(width, height, depth),
365 }
366 }
367}
368
369#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
380#[repr(transparent)]
381pub struct MetalResourceId {
382 pub value: u64,
384}
385
386impl MetalResourceId {
387 #[must_use]
389 pub const fn new(value: u64) -> Self {
390 Self { value }
391 }
392}
393
394#[derive(Debug, Clone, Copy, Default, PartialEq)]
405pub struct MetalPackedFloat3 {
406 pub x: f32,
408 pub y: f32,
410 pub z: f32,
412}
413
414impl MetalPackedFloat3 {
415 #[must_use]
417 pub const fn new(x: f32, y: f32, z: f32) -> Self {
418 Self { x, y, z }
419 }
420}
421
422#[derive(Debug, Clone, Copy, PartialEq)]
433pub struct MetalPackedFloatQuaternion {
434 pub x: f32,
436 pub y: f32,
438 pub z: f32,
440 pub w: f32,
442}
443
444impl Default for MetalPackedFloatQuaternion {
445 fn default() -> Self {
446 Self {
447 x: 0.0,
448 y: 0.0,
449 z: 0.0,
450 w: 1.0,
451 }
452 }
453}
454
455impl MetalPackedFloatQuaternion {
456 #[must_use]
458 pub const fn new(x: f32, y: f32, z: f32, w: f32) -> Self {
459 Self { x, y, z, w }
460 }
461}
462
463#[derive(Debug, Clone, Copy, Default, PartialEq)]
479pub struct MetalPackedFloat4x3 {
480 pub columns: [MetalPackedFloat3; 4],
482}
483
484impl MetalPackedFloat4x3 {
485 #[must_use]
487 pub const fn new(
488 column0: MetalPackedFloat3,
489 column1: MetalPackedFloat3,
490 column2: MetalPackedFloat3,
491 column3: MetalPackedFloat3,
492 ) -> Self {
493 Self {
494 columns: [column0, column1, column2, column3],
495 }
496 }
497}
498
499raw_value_type!(
500 pub struct MetalSparseTextureMappingMode(usize);
502);
503
504type DeviceObserverHandler = Mutex<Box<dyn FnMut(MetalDevice, &str) + Send>>;
505
506pub struct MetalDeviceObserver {
508 ptr: *mut c_void,
509 removed: AtomicBool,
510 context: CallbackContext<DeviceObserverHandler>,
511}
512
513unsafe impl Send for MetalDeviceObserver {}
514unsafe impl Sync for MetalDeviceObserver {}
515
516impl Drop for MetalDeviceObserver {
517 fn drop(&mut self) {
518 self.remove();
519 unsafe { ffi::ametal_object_release(self.ptr) };
520 }
521}
522
523impl MetalDeviceObserver {
524 #[must_use]
525 pub const fn as_ptr(&self) -> *mut c_void {
526 self.ptr
527 }
528
529 pub fn remove(&self) {
531 if self.removed.swap(true, Ordering::AcqRel) {
532 return;
533 }
534 self.context.deactivate();
535 unsafe { ffi::ametal_remove_device_observer(self.ptr) };
536 }
537}
538
539unsafe extern "C" fn device_observer_trampoline(
540 device: *mut c_void,
541 notification_name: *const c_char,
542 context: *mut c_void,
543) {
544 let device = (!device.is_null()).then(|| unsafe { MetalDevice::from_raw(device) });
545 let notification_name = if notification_name.is_null() {
546 String::new()
547 } else {
548 unsafe { CStr::from_ptr(notification_name) }
549 .to_string_lossy()
550 .into_owned()
551 };
552 let _ = unsafe {
553 CallbackContext::<DeviceObserverHandler>::with(
554 context,
555 "MetalDeviceObserver",
556 move |handler| {
557 if let Some(device) = device {
558 let mut handler = handler.lock().unwrap_or_else(PoisonError::into_inner);
559 (*handler)(device, ¬ification_name);
560 }
561 },
562 )
563 };
564}
565
566impl MetalTensorDataType {
567 pub const FLOAT32: Self = Self(3);
568 pub const FLOAT16: Self = Self(16);
569 pub const BFLOAT16: Self = Self(121);
570 pub const INT8: Self = Self(45);
571 pub const UINT8: Self = Self(49);
572 pub const INT16: Self = Self(37);
573 pub const UINT16: Self = Self(41);
574 pub const INT32: Self = Self(29);
575 pub const UINT32: Self = Self(33);
576 pub const INT4: Self = Self(143);
577 pub const UINT4: Self = Self(144);
578
579 const fn bits(self) -> Option<usize> {
580 match self.0 {
581 3 | 29 | 33 => Some(32),
582 16 | 121 | 37 | 41 => Some(16),
583 45 | 49 => Some(8),
584 143 | 144 => Some(4),
585 _ => None,
586 }
587 }
588}
589
590impl MetalTensorUsage {
591 pub const COMPUTE: Self = Self(1);
592 pub const RENDER: Self = Self(1 << 1);
593 pub const MACHINE_LEARNING: Self = Self(1 << 2);
594}
595
596#[derive(Debug, Clone, PartialEq, Eq, Hash)]
597pub struct TensorDescriptor {
598 pub dimensions: Vec<usize>,
599 pub data_type: MetalTensorDataType,
600 pub usage: MetalTensorUsage,
601 pub storage_mode: usize,
602}
603
604impl TensorDescriptor {
605 #[must_use]
606 pub fn new(dimensions: &[usize], data_type: MetalTensorDataType) -> Self {
607 Self {
608 dimensions: dimensions.to_vec(),
609 data_type,
610 usage: MetalTensorUsage(MetalTensorUsage::COMPUTE.0 | MetalTensorUsage::RENDER.0),
611 storage_mode: crate::storage_mode::SHARED,
612 }
613 }
614}
615
616#[derive(Debug, Clone, PartialEq, Eq)]
617pub enum TensorError {
618 Unsupported,
619 InvalidRank { rank: usize },
620 UnsupportedDataType { data_type: usize },
621 InvalidUsage { usage: usize },
622 UnsupportedStorageMode { storage_mode: usize },
623 TooLarge { maximum_bytes: usize },
624 Native(String),
625}
626
627impl core::fmt::Display for TensorError {
628 fn fmt(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
629 match self {
630 Self::Unsupported => formatter.write_str("MTLTensor requires macOS 26.0 or later"),
631 Self::InvalidRank { rank } => {
632 write!(formatter, "tensor rank {rank} exceeds the maximum of 16")
633 }
634 Self::UnsupportedDataType { data_type } => {
635 write!(formatter, "tensor data type {data_type} is unknown")
636 }
637 Self::InvalidUsage { usage } => {
638 write!(formatter, "tensor usage {usage:#x} has unknown bits")
639 }
640 Self::UnsupportedStorageMode { storage_mode } => {
641 write!(
642 formatter,
643 "storage mode {storage_mode} cannot back a tensor"
644 )
645 }
646 Self::TooLarge { maximum_bytes } => write!(
647 formatter,
648 "the tensor needs more than the device's {maximum_bytes}-byte buffer limit"
649 ),
650 Self::Native(message) => formatter.write_str(message),
651 }
652 }
653}
654
655impl std::error::Error for TensorError {}
656
657impl MetalDevice {
658 #[must_use]
659 pub fn max_buffer_length(&self) -> usize {
660 unsafe { ffi::ametal_device_max_buffer_length(self.as_ptr()) }
661 }
662
663 #[allow(clippy::missing_errors_doc)]
664 pub fn new_tensor(&self, descriptor: &TensorDescriptor) -> Result<MetalTensor, TensorError> {
665 if !unsafe { ffi::ametal_tensors_supported() } {
666 return Err(TensorError::Unsupported);
667 }
668 let rank = descriptor.dimensions.len();
669 if rank > 16 {
670 return Err(TensorError::InvalidRank { rank });
671 }
672 let bits = descriptor
673 .data_type
674 .bits()
675 .ok_or(TensorError::UnsupportedDataType {
676 data_type: descriptor.data_type.0,
677 })?;
678 if descriptor.usage.0 & !0x7 != 0 {
679 return Err(TensorError::InvalidUsage {
680 usage: descriptor.usage.0,
681 });
682 }
683 if !matches!(
684 descriptor.storage_mode,
685 crate::storage_mode::SHARED
686 | crate::storage_mode::MANAGED
687 | crate::storage_mode::PRIVATE
688 ) {
689 return Err(TensorError::UnsupportedStorageMode {
690 storage_mode: descriptor.storage_mode,
691 });
692 }
693 let maximum_bytes = self.max_buffer_length();
694 let bytes = descriptor
695 .dimensions
696 .iter()
697 .try_fold(bits, |total, extent| {
698 isize::try_from(*extent).ok()?;
699 total.checked_mul(*extent)
700 })
701 .map(|total_bits| total_bits.div_ceil(8));
702 if bytes.is_none_or(|bytes| bytes > maximum_bytes) {
703 return Err(TensorError::TooLarge { maximum_bytes });
704 }
705 let mut err: *mut c_char = ptr::null_mut();
706 let tensor = unsafe {
707 ffi::ametal_device_new_tensor(
708 self.as_ptr(),
709 descriptor.dimensions.as_ptr(),
710 rank,
711 descriptor.data_type.0,
712 descriptor.usage.0,
713 descriptor.storage_mode,
714 &raw mut err,
715 )
716 };
717 MetalTensor::wrap(tensor).ok_or_else(|| {
718 TensorError::Native(
719 unsafe { take_optional_string(err) }.unwrap_or_else(|| {
720 "MTLDevice.makeTensor(descriptor:) returned nil".to_string()
721 }),
722 )
723 })
724 }
725}
726
727#[must_use]
729pub fn copy_all_devices() -> Vec<MetalDevice> {
730 let mut count = 0;
731 let ptr = unsafe { ffi::ametal_copy_all_devices(&raw mut count) };
732 unsafe { take_device_array(ptr, count) }
733}
734
735#[must_use]
737pub fn copy_all_devices_with_observer<F>(
738 handler: F,
739) -> (Vec<MetalDevice>, Option<MetalDeviceObserver>)
740where
741 F: FnMut(MetalDevice, &str) + Send + 'static,
742{
743 let context: CallbackContext<DeviceObserverHandler> =
744 CallbackContext::new(Mutex::new(Box::new(handler)));
745 let mut count = 0;
746 let mut observer = ptr::null_mut();
747 let devices = unsafe {
748 ffi::ametal_copy_all_devices_with_observer(
749 &raw mut count,
750 &raw mut observer,
751 Some(device_observer_trampoline),
752 context.retained_ptr(),
753 Some(CallbackContext::<DeviceObserverHandler>::RELEASE),
754 )
755 };
756 let devices = unsafe { take_device_array(devices, count) };
757 let observer = (!observer.is_null()).then(|| MetalDeviceObserver {
758 ptr: observer,
759 removed: AtomicBool::new(false),
760 context,
761 });
762 (devices, observer)
763}
764
765pub fn remove_device_observer(observer: &MetalDeviceObserver) {
767 observer.remove();
768}
769
770pub struct MetalIoCompressionContext {
772 ptr: *mut c_void,
773}
774
775impl Drop for MetalIoCompressionContext {
776 fn drop(&mut self) {
777 if !self.ptr.is_null() {
778 unsafe { ffi::ametal_io_flush_and_destroy_compression_context(self.ptr) };
779 self.ptr = ptr::null_mut();
780 }
781 }
782}
783
784impl MetalIoCompressionContext {
785 #[must_use]
787 pub const fn as_ptr(&self) -> *mut c_void {
788 self.ptr
789 }
790
791 #[must_use]
800 pub unsafe fn from_raw(ptr: *mut c_void) -> Self {
801 Self { ptr }
802 }
803
804 pub fn append_data(&self, data: &[u8]) {
806 unsafe {
807 ffi::ametal_io_compression_context_append_data(self.ptr, data.as_ptr(), data.len());
808 }
809 }
810
811 #[must_use]
813 pub fn flush_and_destroy(mut self) -> MetalIoCompressionStatus {
814 let status = unsafe { ffi::ametal_io_flush_and_destroy_compression_context(self.ptr) };
815 self.ptr = ptr::null_mut();
816 MetalIoCompressionStatus::from_raw(status)
817 }
818}
819
820#[must_use]
822pub fn io_compression_context_default_chunk_size() -> usize {
823 unsafe { ffi::ametal_io_compression_context_default_chunk_size() }
824}
825
826#[must_use]
828pub fn create_io_compression_context(
829 path: &Path,
830 method: MetalIoCompressionMethod,
831 chunk_size: Option<usize>,
832) -> Option<MetalIoCompressionContext> {
833 let path = c_string(path.to_string_lossy().as_ref()).ok()?;
834 let chunk_size = chunk_size.unwrap_or_else(io_compression_context_default_chunk_size);
835 let ptr = unsafe {
836 ffi::ametal_io_create_compression_context(path.as_ptr(), method.as_raw(), chunk_size)
837 };
838 if ptr.is_null() {
839 None
840 } else {
841 Some(unsafe { MetalIoCompressionContext::from_raw(ptr) })
842 }
843}
844
845metal_string_constant!(pub fn metal4_command_queue_error_domain => "MTL4CommandQueueErrorDomain";);
846metal_string_constant!(pub fn metal_binary_archive_domain => "MTLBinaryArchiveDomain";);
847metal_string_constant!(pub fn metal_capture_error_domain => "MTLCaptureErrorDomain";);
848metal_string_constant!(pub fn metal_command_buffer_encoder_info_error_key => "MTLCommandBufferEncoderInfoErrorKey";);
849metal_string_constant!(pub fn metal_command_buffer_error_domain => "MTLCommandBufferErrorDomain";);
850metal_string_constant!(pub fn metal_common_counter_clipper_invocations => "MTLCommonCounterClipperInvocations";);
851metal_string_constant!(pub fn metal_common_counter_clipper_primitives_out => "MTLCommonCounterClipperPrimitivesOut";);
852metal_string_constant!(pub fn metal_common_counter_compute_kernel_invocations => "MTLCommonCounterComputeKernelInvocations";);
853metal_string_constant!(pub fn metal_common_counter_fragment_cycles => "MTLCommonCounterFragmentCycles";);
854metal_string_constant!(pub fn metal_common_counter_fragment_invocations => "MTLCommonCounterFragmentInvocations";);
855metal_string_constant!(pub fn metal_common_counter_fragments_passed => "MTLCommonCounterFragmentsPassed";);
856metal_string_constant!(pub fn metal_common_counter_post_tessellation_vertex_cycles => "MTLCommonCounterPostTessellationVertexCycles";);
857metal_string_constant!(pub fn metal_common_counter_post_tessellation_vertex_invocations => "MTLCommonCounterPostTessellationVertexInvocations";);
858metal_string_constant!(pub fn metal_common_counter_render_target_write_cycles => "MTLCommonCounterRenderTargetWriteCycles";);
859metal_string_constant!(pub fn metal_common_counter_set_stage_utilization => "MTLCommonCounterSetStageUtilization";);
860metal_string_constant!(pub fn metal_common_counter_set_statistic => "MTLCommonCounterSetStatistic";);
861metal_string_constant!(pub fn metal_common_counter_set_timestamp => "MTLCommonCounterSetTimestamp";);
862metal_string_constant!(pub fn metal_common_counter_tessellation_cycles => "MTLCommonCounterTessellationCycles";);
863metal_string_constant!(pub fn metal_common_counter_tessellation_input_patches => "MTLCommonCounterTessellationInputPatches";);
864metal_string_constant!(pub fn metal_common_counter_timestamp => "MTLCommonCounterTimestamp";);
865metal_string_constant!(pub fn metal_common_counter_total_cycles => "MTLCommonCounterTotalCycles";);
866metal_string_constant!(pub fn metal_common_counter_vertex_cycles => "MTLCommonCounterVertexCycles";);
867metal_string_constant!(pub fn metal_common_counter_vertex_invocations => "MTLCommonCounterVertexInvocations";);
868metal_string_constant!(pub fn metal_counter_error_domain => "MTLCounterErrorDomain";);
869metal_string_constant!(pub fn metal_device_removal_requested_notification => "MTLDeviceRemovalRequestedNotification";);
870metal_string_constant!(pub fn metal_device_was_added_notification => "MTLDeviceWasAddedNotification";);
871metal_string_constant!(pub fn metal_device_was_removed_notification => "MTLDeviceWasRemovedNotification";);
872metal_string_constant!(pub fn metal_dynamic_library_domain => "MTLDynamicLibraryDomain";);
873metal_string_constant!(pub fn metal_io_error_domain => "MTLIOErrorDomain";);
874metal_string_constant!(pub fn metal_library_error_domain => "MTLLibraryErrorDomain";);
875metal_string_constant!(pub fn metal_log_state_error_domain => "MTLLogStateErrorDomain";);
876metal_string_constant!(pub fn metal_tensor_domain => "MTLTensorDomain";);
877
878raw_value_type!(
879 pub struct Metal4AlphaToCoverageState(usize);
881);
882raw_value_type!(
883 pub struct Metal4AlphaToOneState(usize);
885);
886raw_value_type!(
887 pub struct Metal4BinaryFunctionOptions(usize);
889);
890raw_value_type!(
891 pub struct Metal4BlendState(usize);
893);
894raw_value_type!(
895 pub struct Metal4CommandQueueError(usize);
897);
898raw_value_type!(
899 pub struct Metal4CompilerTaskStatus(usize);
901);
902raw_value_type!(
903 pub struct Metal4CounterHeapType(usize);
905);
906raw_value_type!(
907 pub struct Metal4IndirectCommandBufferSupportState(usize);
909);
910raw_value_type!(
911 pub struct Metal4LogicalToPhysicalColorAttachmentMappingState(usize);
913);
914raw_value_type!(
915 pub struct Metal4PipelineDataSetSerializerConfiguration(usize);
917);
918raw_value_type!(
919 pub struct Metal4RenderEncoderOptions(usize);
921);
922raw_value_type!(
923 pub struct Metal4ShaderReflection(usize);
925);
926raw_value_type!(
927 pub struct Metal4TimestampGranularity(usize);
929);
930raw_value_type!(
931 pub struct Metal4VisibilityOptions(usize);
933);
934raw_value_type!(
935 pub struct MetalAccelerationStructureInstanceDescriptorType(usize);
937);
938raw_value_type!(
939 pub struct MetalAccelerationStructureInstanceOptions(usize);
941);
942raw_value_type!(
943 pub struct MetalAccelerationStructureRefitOptions(usize);
945);
946raw_value_type!(
947 pub struct MetalAccelerationStructureUsage(usize);
949);
950raw_value_type!(
951 pub struct MetalArgumentAccess(usize);
953);
954raw_value_type!(
955 pub struct MetalAttributeFormat(usize);
957);
958raw_value_type!(
959 pub struct MetalBarrierScope(usize);
961);
962raw_value_type!(
963 pub struct MetalBinaryArchiveError(usize);
965);
966raw_value_type!(
967 pub struct MetalBindingType(usize);
969);
970raw_value_type!(
971 pub struct MetalBlitOption(usize);
973);
974raw_value_type!(
975 pub struct MetalBufferSparseTier(usize);
977);
978raw_value_type!(
979 pub struct MetalCaptureError(usize);
981);
982raw_value_type!(
983 pub struct MetalCommandBufferError(usize);
985);
986raw_value_type!(
987 pub struct MetalCommandBufferErrorOption(usize);
989);
990raw_value_type!(
991 pub struct MetalCommandEncoderErrorState(usize);
993);
994raw_value_type!(
995 pub struct MetalCompileSymbolVisibility(usize);
997);
998raw_value_type!(
999 pub struct MetalCounterSampleBufferError(usize);
1001);
1002raw_value_type!(
1003 pub struct MetalCullMode(usize);
1005);
1006raw_value_type!(
1007 pub struct MetalCurveBasis(usize);
1009);
1010raw_value_type!(
1011 pub struct MetalCurveEndCaps(usize);
1013);
1014raw_value_type!(
1015 pub struct MetalCurveType(usize);
1017);
1018raw_value_type!(
1019 pub struct MetalDataType(usize);
1021);
1022raw_value_type!(
1023 pub struct MetalDepthClipMode(usize);
1025);
1026raw_value_type!(
1027 pub struct MetalDeviceLocation(usize);
1029);
1030raw_value_type!(
1031 pub struct MetalDispatchType(usize);
1033);
1034raw_value_type!(
1035 pub struct MetalDynamicLibraryError(usize);
1037);
1038raw_value_type!(
1039 pub struct MetalFeatureSet(usize);
1041);
1042raw_value_type!(
1043 pub struct MetalFunctionLogType(usize);
1045);
1046raw_value_type!(
1047 pub struct MetalFunctionOptions(usize);
1049);
1050raw_value_type!(
1051 pub struct MetalFunctionType(usize);
1053);
1054raw_value_type!(
1055 pub struct MetalHeapType(usize);
1057);
1058raw_value_type!(
1059 pub struct MetalIndexType(usize);
1061);
1062raw_value_type!(
1063 pub struct MetalIoCommandQueueType(usize);
1065);
1066raw_value_type!(
1067 pub struct MetalIoCompressionMethod(usize);
1069);
1070raw_value_type!(
1071 pub struct MetalIoCompressionStatus(usize);
1073);
1074raw_value_type!(
1075 pub struct MetalIoPriority(usize);
1077);
1078raw_value_type!(
1079 pub struct MetalIoStatus(usize);
1081);
1082raw_value_type!(
1083 pub struct MetalLanguageVersion(usize);
1085);
1086raw_value_type!(
1087 pub struct MetalLibraryError(usize);
1089);
1090raw_value_type!(
1091 pub struct MetalLibraryOptimizationLevel(usize);
1093);
1094raw_value_type!(
1095 pub struct MetalLibraryType(usize);
1097);
1098raw_value_type!(
1099 pub struct MetalLogStateError(usize);
1101);
1102raw_value_type!(
1103 pub struct MetalMathFloatingPointFunctions(usize);
1105);
1106raw_value_type!(
1107 pub struct MetalMathMode(usize);
1109);
1110raw_value_type!(
1111 pub struct MetalMatrixLayout(usize);
1113);
1114raw_value_type!(
1115 pub struct MetalMotionBorderMode(usize);
1117);
1118raw_value_type!(
1119 pub struct MetalMultisampleDepthResolveFilter(usize);
1121);
1122raw_value_type!(
1123 pub struct MetalMultisampleStencilResolveFilter(usize);
1125);
1126raw_value_type!(
1127 pub struct MetalMutability(usize);
1129);
1130raw_value_type!(
1131 pub struct MetalPatchType(usize);
1133);
1134raw_value_type!(
1135 pub struct MetalPipelineOption(usize);
1137);
1138raw_value_type!(
1139 pub struct MetalPrimitiveTopologyClass(usize);
1141);
1142raw_value_type!(
1143 pub struct MetalReadWriteTextureTier(usize);
1145);
1146raw_value_type!(
1147 pub struct MetalRenderStages(usize);
1149);
1150raw_value_type!(
1151 pub struct MetalResourceUsage(usize);
1153);
1154raw_value_type!(
1155 pub struct MetalShaderValidation(usize);
1157);
1158raw_value_type!(
1159 pub struct MetalSparsePageSize(usize);
1161);
1162raw_value_type!(
1163 pub struct MetalSparseTextureRegionAlignmentMode(usize);
1165);
1166raw_value_type!(
1167 pub struct MetalStages(usize);
1169);
1170raw_value_type!(
1171 pub struct MetalStepFunction(usize);
1173);
1174raw_value_type!(
1175 pub struct MetalStitchedLibraryOptions(usize);
1177);
1178raw_value_type!(
1179 pub struct MetalStoreActionOptions(usize);
1181);
1182raw_value_type!(
1183 pub struct MetalTensorDataType(usize);
1185);
1186raw_value_type!(
1187 pub struct MetalTensorError(usize);
1189);
1190raw_value_type!(
1191 pub struct MetalTensorUsage(usize);
1193);
1194raw_value_type!(
1195 pub struct MetalTessellationControlPointIndexType(usize);
1197);
1198raw_value_type!(
1199 pub struct MetalTessellationFactorFormat(usize);
1201);
1202raw_value_type!(
1203 pub struct MetalTessellationFactorStepFunction(usize);
1205);
1206raw_value_type!(
1207 pub struct MetalTessellationPartitionMode(usize);
1209);
1210raw_value_type!(
1211 pub struct MetalTextureCompressionType(usize);
1213);
1214raw_value_type!(
1215 pub struct MetalTextureSparseTier(usize);
1217);
1218raw_value_type!(
1219 pub struct MetalTextureSwizzle(usize);
1221);
1222raw_value_type!(
1223 pub struct MetalTransformType(usize);
1225);
1226raw_value_type!(
1227 pub struct MetalTriangleFillMode(usize);
1229);
1230raw_value_type!(
1231 pub struct MetalVertexFormat(usize);
1233);
1234raw_value_type!(
1235 pub struct MetalVertexStepFunction(usize);
1237);
1238raw_value_type!(
1239 pub struct MetalVisibilityResultMode(usize);
1241);
1242raw_value_type!(
1243 pub struct MetalVisibilityResultType(usize);
1245);
1246raw_value_type!(
1247 pub struct MetalWinding(usize);
1249);
1250opaque_symbol_handle!(
1251 pub struct Metal4Archive;
1253);
1254opaque_symbol_handle!(
1255 pub struct Metal4ArgumentTable;
1257);
1258opaque_symbol_handle!(
1259 pub struct Metal4BinaryFunction;
1261);
1262opaque_symbol_handle!(
1263 pub struct Metal4CommandAllocator;
1265);
1266opaque_symbol_handle!(
1267 pub struct Metal4CommandBuffer;
1269);
1270opaque_symbol_handle!(
1271 pub struct Metal4CommandEncoder;
1273);
1274opaque_symbol_handle!(
1275 pub struct Metal4CommandQueue;
1277);
1278opaque_symbol_handle!(
1279 pub struct Metal4CommitFeedback;
1281);
1282opaque_symbol_handle!(
1283 pub struct Metal4Compiler;
1285);
1286opaque_symbol_handle!(
1287 pub struct Metal4CompilerTask;
1289);
1290opaque_symbol_handle!(
1291 pub struct Metal4ComputeCommandEncoder;
1293);
1294opaque_symbol_handle!(
1295 pub struct Metal4CounterHeap;
1297);
1298opaque_symbol_handle!(
1299 pub struct Metal4FxFrameInterpolator;
1301);
1302opaque_symbol_handle!(
1303 pub struct Metal4FxSpatialScaler;
1305);
1306opaque_symbol_handle!(
1307 pub struct Metal4FxTemporalDenoisedScaler;
1309);
1310opaque_symbol_handle!(
1311 pub struct Metal4FxTemporalScaler;
1313);
1314opaque_symbol_handle!(
1315 pub struct Metal4MachineLearningCommandEncoder;
1317);
1318opaque_symbol_handle!(
1319 pub struct Metal4MachineLearningPipelineState;
1321);
1322opaque_symbol_handle!(
1323 pub struct Metal4PipelineDataSetSerializer;
1325);
1326opaque_symbol_handle!(
1327 pub struct Metal4RenderCommandEncoder;
1329);
1330opaque_symbol_handle!(
1331 pub struct MetalAccelerationStructureCommandEncoder;
1333);
1334opaque_symbol_handle!(
1335 pub struct MetalAllocation;
1337);
1338opaque_symbol_handle!(
1339 pub struct MetalBinding;
1341);
1342opaque_symbol_handle!(
1343 pub struct MetalBufferBinding;
1345);
1346opaque_symbol_handle!(
1347 pub struct MetalCommandBufferEncoderInfo;
1349);
1350opaque_symbol_handle!(
1351 pub struct MetalCommandEncoder;
1353);
1354opaque_symbol_handle!(
1355 pub struct MetalCounter;
1357);
1358opaque_symbol_handle!(
1359 pub struct MetalDrawable;
1361);
1362opaque_symbol_handle!(
1363 pub struct MetalFunctionHandle;
1365);
1366opaque_symbol_handle!(
1367 pub struct MetalFunctionLog;
1369);
1370opaque_symbol_handle!(
1371 pub struct MetalFunctionLogDebugLocation;
1373);
1374opaque_symbol_handle!(
1375 pub struct MetalFunctionStitchingAttribute;
1377);
1378opaque_symbol_handle!(
1379 pub struct MetalFunctionStitchingNode;
1381);
1382opaque_symbol_handle!(
1383 pub struct MetalFxFrameInterpolator;
1385);
1386opaque_symbol_handle!(
1387 pub struct MetalFxFrameInterpolatorBase;
1389);
1390opaque_symbol_handle!(
1391 pub struct MetalFxSpatialScalerBase;
1393);
1394opaque_symbol_handle!(
1395 pub struct MetalFxTemporalDenoisedScaler;
1397);
1398opaque_symbol_handle!(
1399 pub struct MetalFxTemporalDenoisedScalerBase;
1401);
1402opaque_symbol_handle!(
1403 pub struct MetalFxTemporalScalerBase;
1405);
1406opaque_symbol_handle!(
1407 pub struct MetalIndirectComputeCommand;
1409);
1410opaque_symbol_handle!(
1411 pub struct MetalIndirectComputeCommandEncoder;
1413);
1414opaque_symbol_handle!(
1415 pub struct MetalIndirectRenderCommand;
1417);
1418opaque_symbol_handle!(
1419 pub struct MetalIndirectRenderCommandEncoder;
1421);
1422opaque_symbol_handle!(
1423 pub struct MetalIoCommandBuffer;
1425);
1426opaque_symbol_handle!(
1427 pub struct MetalIoCommandQueue;
1429);
1430opaque_symbol_handle!(
1431 pub struct MetalIoFileHandle;
1433);
1434opaque_symbol_handle!(
1435 pub struct MetalIoScratchBuffer;
1437);
1438opaque_symbol_handle!(
1439 pub struct MetalIoScratchBufferAllocator;
1441);
1442opaque_symbol_handle!(
1443 pub struct MetalLogContainer;
1445);
1446opaque_symbol_handle!(
1447 pub struct MetalObjectPayloadBinding;
1449);
1450opaque_symbol_handle!(
1451 pub struct MetalParallelRenderCommandEncoder;
1453);
1454opaque_symbol_handle!(
1455 pub struct MetalRasterizationRateMap;
1457);
1458opaque_symbol_handle!(
1459 pub struct MetalResource;
1461);
1462opaque_symbol_handle!(
1463 pub struct MetalResourceStateCommandEncoder;
1465);
1466opaque_symbol_handle!(
1467 pub struct MetalResourceViewPool;
1469);
1470opaque_symbol_handle!(
1471 pub struct MetalTensor;
1473);
1474opaque_symbol_handle!(
1475 pub struct MetalTensorBinding;
1477);
1478opaque_symbol_handle!(
1479 pub struct MetalTextureBinding;
1481);
1482opaque_symbol_handle!(
1483 pub struct MetalTextureViewPool;
1485);
1486opaque_symbol_handle!(
1487 pub struct MetalThreadgroupBinding;
1489);
1490opaque_symbol_class!(pub struct Metal4AccelerationStructureBoundingBoxGeometryDescriptor => "MTL4AccelerationStructureBoundingBoxGeometryDescriptor";);
1491opaque_symbol_class!(pub struct Metal4AccelerationStructureCurveGeometryDescriptor => "MTL4AccelerationStructureCurveGeometryDescriptor";);
1492opaque_symbol_class!(pub struct Metal4AccelerationStructureDescriptor => "MTL4AccelerationStructureDescriptor";);
1493opaque_symbol_class!(pub struct Metal4AccelerationStructureGeometryDescriptor => "MTL4AccelerationStructureGeometryDescriptor";);
1494opaque_symbol_class!(pub struct Metal4AccelerationStructureMotionBoundingBoxGeometryDescriptor => "MTL4AccelerationStructureMotionBoundingBoxGeometryDescriptor";);
1495opaque_symbol_class!(pub struct Metal4AccelerationStructureMotionCurveGeometryDescriptor => "MTL4AccelerationStructureMotionCurveGeometryDescriptor";);
1496opaque_symbol_class!(pub struct Metal4AccelerationStructureMotionTriangleGeometryDescriptor => "MTL4AccelerationStructureMotionTriangleGeometryDescriptor";);
1497opaque_symbol_class!(pub struct Metal4AccelerationStructureTriangleGeometryDescriptor => "MTL4AccelerationStructureTriangleGeometryDescriptor";);
1498opaque_symbol_class!(pub struct Metal4ArgumentTableDescriptor => "MTL4ArgumentTableDescriptor";);
1499opaque_symbol_class!(pub struct Metal4BinaryFunctionDescriptor => "MTL4BinaryFunctionDescriptor";);
1500opaque_symbol_class!(pub struct Metal4CommandAllocatorDescriptor => "MTL4CommandAllocatorDescriptor";);
1501opaque_symbol_class!(pub struct Metal4CommandBufferOptions => "MTL4CommandBufferOptions";);
1502opaque_symbol_class!(pub struct Metal4CommandQueueDescriptor => "MTL4CommandQueueDescriptor";);
1503opaque_symbol_class!(pub struct Metal4CommitOptions => "MTL4CommitOptions";);
1504opaque_symbol_class!(pub struct Metal4CompilerDescriptor => "MTL4CompilerDescriptor";);
1505opaque_symbol_class!(pub struct Metal4CompilerTaskOptions => "MTL4CompilerTaskOptions";);
1506opaque_symbol_class!(pub struct Metal4ComputePipelineDescriptor => "MTL4ComputePipelineDescriptor";);
1507opaque_symbol_class!(pub struct Metal4CounterHeapDescriptor => "MTL4CounterHeapDescriptor";);
1508opaque_symbol_class!(pub struct Metal4FunctionDescriptor => "MTL4FunctionDescriptor";);
1509opaque_symbol_class!(pub struct Metal4IndirectInstanceAccelerationStructureDescriptor => "MTL4IndirectInstanceAccelerationStructureDescriptor";);
1510opaque_symbol_class!(pub struct Metal4InstanceAccelerationStructureDescriptor => "MTL4InstanceAccelerationStructureDescriptor";);
1511opaque_symbol_class!(pub struct Metal4LibraryDescriptor => "MTL4LibraryDescriptor";);
1512opaque_symbol_class!(pub struct Metal4LibraryFunctionDescriptor => "MTL4LibraryFunctionDescriptor";);
1513opaque_symbol_class!(pub struct Metal4MachineLearningPipelineDescriptor => "MTL4MachineLearningPipelineDescriptor";);
1514opaque_symbol_class!(pub struct Metal4MachineLearningPipelineReflection => "MTL4MachineLearningPipelineReflection";);
1515opaque_symbol_class!(pub struct Metal4MeshRenderPipelineDescriptor => "MTL4MeshRenderPipelineDescriptor";);
1516opaque_symbol_class!(pub struct Metal4PipelineDataSetSerializerDescriptor => "MTL4PipelineDataSetSerializerDescriptor";);
1517opaque_symbol_class!(pub struct Metal4PipelineDescriptor => "MTL4PipelineDescriptor";);
1518opaque_symbol_class!(pub struct Metal4PipelineOptions => "MTL4PipelineOptions";);
1519opaque_symbol_class!(pub struct Metal4PipelineStageDynamicLinkingDescriptor => "MTL4PipelineStageDynamicLinkingDescriptor";);
1520opaque_symbol_class!(pub struct Metal4PrimitiveAccelerationStructureDescriptor => "MTL4PrimitiveAccelerationStructureDescriptor";);
1521opaque_symbol_class!(pub struct Metal4RenderPassDescriptor => "MTL4RenderPassDescriptor";);
1522opaque_symbol_class!(pub struct Metal4RenderPipelineBinaryFunctionsDescriptor => "MTL4RenderPipelineBinaryFunctionsDescriptor";);
1523opaque_symbol_class!(pub struct Metal4RenderPipelineColorAttachmentDescriptor => "MTL4RenderPipelineColorAttachmentDescriptor";);
1524opaque_symbol_class!(pub struct Metal4RenderPipelineColorAttachmentDescriptorArray => "MTL4RenderPipelineColorAttachmentDescriptorArray";);
1525opaque_symbol_class!(pub struct Metal4RenderPipelineDescriptor => "MTL4RenderPipelineDescriptor";);
1526opaque_symbol_class!(pub struct Metal4RenderPipelineDynamicLinkingDescriptor => "MTL4RenderPipelineDynamicLinkingDescriptor";);
1527opaque_symbol_class!(pub struct Metal4SpecializedFunctionDescriptor => "MTL4SpecializedFunctionDescriptor";);
1528opaque_symbol_class!(pub struct Metal4StaticLinkingDescriptor => "MTL4StaticLinkingDescriptor";);
1529opaque_symbol_class!(pub struct Metal4StitchedFunctionDescriptor => "MTL4StitchedFunctionDescriptor";);
1530opaque_symbol_class!(pub struct Metal4TileRenderPipelineDescriptor => "MTL4TileRenderPipelineDescriptor";);
1531opaque_symbol_class!(pub struct MetalAccelerationStructureBoundingBoxGeometryDescriptor => "MTLAccelerationStructureBoundingBoxGeometryDescriptor";);
1532opaque_symbol_class!(pub struct MetalAccelerationStructureCurveGeometryDescriptor => "MTLAccelerationStructureCurveGeometryDescriptor";);
1533opaque_symbol_class!(pub struct MetalAccelerationStructureDescriptor => "MTLAccelerationStructureDescriptor";);
1534opaque_symbol_class!(pub struct MetalAccelerationStructureGeometryDescriptor => "MTLAccelerationStructureGeometryDescriptor";);
1535opaque_symbol_class!(pub struct MetalAccelerationStructureMotionBoundingBoxGeometryDescriptor => "MTLAccelerationStructureMotionBoundingBoxGeometryDescriptor";);
1536opaque_symbol_class!(pub struct MetalAccelerationStructureMotionCurveGeometryDescriptor => "MTLAccelerationStructureMotionCurveGeometryDescriptor";);
1537opaque_symbol_class!(pub struct MetalAccelerationStructureMotionTriangleGeometryDescriptor => "MTLAccelerationStructureMotionTriangleGeometryDescriptor";);
1538opaque_symbol_class!(pub struct MetalAccelerationStructurePassDescriptor => "MTLAccelerationStructurePassDescriptor";);
1539opaque_symbol_class!(pub struct MetalAccelerationStructurePassSampleBufferAttachmentDescriptor => "MTLAccelerationStructurePassSampleBufferAttachmentDescriptor";);
1540opaque_symbol_class!(pub struct MetalAccelerationStructurePassSampleBufferAttachmentDescriptorArray => "MTLAccelerationStructurePassSampleBufferAttachmentDescriptorArray";);
1541opaque_symbol_class!(pub struct MetalAccelerationStructureTriangleGeometryDescriptor => "MTLAccelerationStructureTriangleGeometryDescriptor";);
1542opaque_symbol_class!(pub struct MetalArchitecture => "MTLArchitecture";);
1543opaque_symbol_class!(pub struct MetalArgument => "MTLArgument";);
1544opaque_symbol_class!(pub struct MetalArrayType => "MTLArrayType";);
1545opaque_symbol_class!(pub struct MetalAttribute => "MTLAttribute";);
1546opaque_symbol_class!(pub struct MetalAttributeDescriptor => "MTLAttributeDescriptor";);
1547opaque_symbol_class!(pub struct MetalAttributeDescriptorArray => "MTLAttributeDescriptorArray";);
1548opaque_symbol_class!(pub struct MetalBinaryArchiveDescriptor => "MTLBinaryArchiveDescriptor";);
1549opaque_symbol_class!(pub struct MetalBlitPassDescriptor => "MTLBlitPassDescriptor";);
1550opaque_symbol_class!(pub struct MetalBlitPassSampleBufferAttachmentDescriptor => "MTLBlitPassSampleBufferAttachmentDescriptor";);
1551opaque_symbol_class!(pub struct MetalBlitPassSampleBufferAttachmentDescriptorArray => "MTLBlitPassSampleBufferAttachmentDescriptorArray";);
1552opaque_symbol_class!(pub struct MetalBufferLayoutDescriptor => "MTLBufferLayoutDescriptor";);
1553opaque_symbol_class!(pub struct MetalBufferLayoutDescriptorArray => "MTLBufferLayoutDescriptorArray";);
1554opaque_symbol_class!(
1555 pub struct MetalCaptureDescriptor => "MTLCaptureDescriptor";
1557);
1558opaque_symbol_class!(pub struct MetalCommandBufferDescriptor => "MTLCommandBufferDescriptor";);
1559opaque_symbol_class!(pub struct MetalCommandQueueDescriptor => "MTLCommandQueueDescriptor";);
1560opaque_symbol_class!(pub struct MetalCompileOptions => "MTLCompileOptions";);
1561opaque_symbol_class!(pub struct MetalComputePassDescriptor => "MTLComputePassDescriptor";);
1562opaque_symbol_class!(pub struct MetalComputePassSampleBufferAttachmentDescriptor => "MTLComputePassSampleBufferAttachmentDescriptor";);
1563opaque_symbol_class!(pub struct MetalComputePassSampleBufferAttachmentDescriptorArray => "MTLComputePassSampleBufferAttachmentDescriptorArray";);
1564opaque_symbol_class!(pub struct MetalComputePipelineReflection => "MTLComputePipelineReflection";);
1565opaque_symbol_class!(pub struct MetalCounterSampleBufferDescriptor => "MTLCounterSampleBufferDescriptor";);
1566opaque_symbol_class!(pub struct MetalFunctionConstant => "MTLFunctionConstant";);
1567opaque_symbol_class!(pub struct MetalFunctionConstantValues => "MTLFunctionConstantValues";);
1568opaque_symbol_class!(pub struct MetalFunctionDescriptor => "MTLFunctionDescriptor";);
1569opaque_symbol_class!(pub struct MetalFunctionReflection => "MTLFunctionReflection";);
1570opaque_symbol_class!(pub struct MetalFunctionStitchingAttributeAlwaysInline => "MTLFunctionStitchingAttributeAlwaysInline";);
1571opaque_symbol_class!(pub struct MetalFunctionStitchingFunctionNode => "MTLFunctionStitchingFunctionNode";);
1572opaque_symbol_class!(pub struct MetalFunctionStitchingGraph => "MTLFunctionStitchingGraph";);
1573opaque_symbol_class!(pub struct MetalFunctionStitchingInputNode => "MTLFunctionStitchingInputNode";);
1574opaque_symbol_class!(pub struct MetalFxFrameInterpolatorDescriptor => "MTLFXFrameInterpolatorDescriptor";);
1575opaque_symbol_class!(pub struct MetalFxTemporalDenoisedScalerDescriptor => "MTLFXTemporalDenoisedScalerDescriptor";);
1576opaque_symbol_class!(pub struct MetalHeapDescriptor => "MTLHeapDescriptor";);
1577opaque_symbol_class!(pub struct MetalIndirectCommandBufferDescriptor => "MTLIndirectCommandBufferDescriptor";);
1578opaque_symbol_class!(pub struct MetalIndirectInstanceAccelerationStructureDescriptor => "MTLIndirectInstanceAccelerationStructureDescriptor";);
1579opaque_symbol_class!(pub struct MetalInstanceAccelerationStructureDescriptor => "MTLInstanceAccelerationStructureDescriptor";);
1580opaque_symbol_class!(pub struct MetalIntersectionFunctionDescriptor => "MTLIntersectionFunctionDescriptor";);
1581opaque_symbol_class!(pub struct MetalIntersectionFunctionTableDescriptor => "MTLIntersectionFunctionTableDescriptor";);
1582opaque_symbol_class!(pub struct MetalIoCommandQueueDescriptor => "MTLIOCommandQueueDescriptor";);
1583opaque_symbol_class!(pub struct MetalLinkedFunctions => "MTLLinkedFunctions";);
1584opaque_symbol_class!(pub struct MetalLogStateDescriptor => "MTLLogStateDescriptor";);
1585opaque_symbol_class!(pub struct MetalLogicalToPhysicalColorAttachmentMap => "MTLLogicalToPhysicalColorAttachmentMap";);
1586opaque_symbol_class!(pub struct MetalMeshRenderPipelineDescriptor => "MTLMeshRenderPipelineDescriptor";);
1587opaque_symbol_class!(pub struct MetalMotionKeyframeData => "MTLMotionKeyframeData";);
1588opaque_symbol_class!(pub struct MetalPipelineBufferDescriptor => "MTLPipelineBufferDescriptor";);
1589opaque_symbol_class!(pub struct MetalPipelineBufferDescriptorArray => "MTLPipelineBufferDescriptorArray";);
1590opaque_symbol_class!(pub struct MetalPointerType => "MTLPointerType";);
1591opaque_symbol_class!(pub struct MetalPrimitiveAccelerationStructureDescriptor => "MTLPrimitiveAccelerationStructureDescriptor";);
1592opaque_symbol_class!(pub struct MetalRasterizationRateLayerArray => "MTLRasterizationRateLayerArray";);
1593opaque_symbol_handle!(
1594 pub struct MetalRasterizationRateLayerDescriptor;
1595);
1596
1597impl MetalRasterizationRateLayerDescriptor {
1598 #[must_use]
1599 pub fn with_sample_count(horizontal: usize, vertical: usize) -> Option<Self> {
1600 const MAX_SAMPLES: usize = 16_384;
1601 if horizontal == 0 || vertical == 0 || horizontal > MAX_SAMPLES || vertical > MAX_SAMPLES {
1602 return None;
1603 }
1604 Self::wrap(unsafe {
1605 ffi::ametal_rasterization_rate_layer_descriptor_new(horizontal, vertical)
1606 })
1607 }
1608}
1609opaque_symbol_class!(pub struct MetalRasterizationRateMapDescriptor => "MTLRasterizationRateMapDescriptor";);
1610opaque_symbol_class!(pub struct MetalRasterizationRateSampleArray => "MTLRasterizationRateSampleArray";);
1611opaque_symbol_class!(pub struct MetalRenderPassAttachmentDescriptor => "MTLRenderPassAttachmentDescriptor";);
1612opaque_symbol_class!(pub struct MetalRenderPassColorAttachmentDescriptor => "MTLRenderPassColorAttachmentDescriptor";);
1613opaque_symbol_class!(pub struct MetalRenderPassColorAttachmentDescriptorArray => "MTLRenderPassColorAttachmentDescriptorArray";);
1614opaque_symbol_class!(pub struct MetalRenderPassDepthAttachmentDescriptor => "MTLRenderPassDepthAttachmentDescriptor";);
1615opaque_symbol_class!(pub struct MetalRenderPassDescriptor => "MTLRenderPassDescriptor";);
1616opaque_symbol_class!(pub struct MetalRenderPassSampleBufferAttachmentDescriptor => "MTLRenderPassSampleBufferAttachmentDescriptor";);
1617opaque_symbol_class!(pub struct MetalRenderPassSampleBufferAttachmentDescriptorArray => "MTLRenderPassSampleBufferAttachmentDescriptorArray";);
1618opaque_symbol_class!(pub struct MetalRenderPassStencilAttachmentDescriptor => "MTLRenderPassStencilAttachmentDescriptor";);
1619opaque_symbol_class!(pub struct MetalRenderPipelineColorAttachmentDescriptorArray => "MTLRenderPipelineColorAttachmentDescriptorArray";);
1620opaque_symbol_class!(pub struct MetalRenderPipelineFunctionsDescriptor => "MTLRenderPipelineFunctionsDescriptor";);
1621opaque_symbol_class!(pub struct MetalRenderPipelineReflection => "MTLRenderPipelineReflection";);
1622opaque_symbol_class!(pub struct MetalResidencySetDescriptor => "MTLResidencySetDescriptor";);
1623opaque_symbol_class!(pub struct MetalResourceStatePassDescriptor => "MTLResourceStatePassDescriptor";);
1624opaque_symbol_class!(pub struct MetalResourceStatePassSampleBufferAttachmentDescriptor => "MTLResourceStatePassSampleBufferAttachmentDescriptor";);
1625opaque_symbol_class!(pub struct MetalResourceStatePassSampleBufferAttachmentDescriptorArray => "MTLResourceStatePassSampleBufferAttachmentDescriptorArray";);
1626opaque_symbol_class!(pub struct MetalResourceViewPoolDescriptor => "MTLResourceViewPoolDescriptor";);
1627opaque_symbol_class!(pub struct MetalSharedEventHandle => "MTLSharedEventHandle";);
1628opaque_symbol_class!(pub struct MetalSharedEventListener => "MTLSharedEventListener";);
1629opaque_symbol_class!(pub struct MetalSharedTextureHandle => "MTLSharedTextureHandle";);
1630opaque_symbol_class!(pub struct MetalStageInputOutputDescriptor => "MTLStageInputOutputDescriptor";);
1631opaque_symbol_class!(pub struct MetalStitchedLibraryDescriptor => "MTLStitchedLibraryDescriptor";);
1632opaque_symbol_class!(pub struct MetalStructMember => "MTLStructMember";);
1633opaque_symbol_class!(pub struct MetalStructType => "MTLStructType";);
1634opaque_symbol_class!(pub struct MetalTensorDescriptor => "MTLTensorDescriptor";);
1635opaque_symbol_class!(pub struct MetalTensorExtents => "MTLTensorExtents";);
1636opaque_symbol_class!(pub struct MetalTensorReferenceType => "MTLTensorReferenceType";);
1637opaque_symbol_class!(pub struct MetalTextureReferenceType => "MTLTextureReferenceType";);
1638opaque_symbol_class!(pub struct MetalTextureViewDescriptor => "MTLTextureViewDescriptor";);
1639opaque_symbol_class!(pub struct MetalTileRenderPipelineColorAttachmentDescriptorArray => "MTLTileRenderPipelineColorAttachmentDescriptorArray";);
1640opaque_symbol_class!(pub struct MetalType => "MTLType";);
1641opaque_symbol_class!(pub struct MetalVertexAttribute => "MTLVertexAttribute";);
1642opaque_symbol_class!(pub struct MetalVertexAttributeDescriptor => "MTLVertexAttributeDescriptor";);
1643opaque_symbol_class!(pub struct MetalVertexAttributeDescriptorArray => "MTLVertexAttributeDescriptorArray";);
1644opaque_symbol_class!(pub struct MetalVertexBufferLayoutDescriptor => "MTLVertexBufferLayoutDescriptor";);
1645opaque_symbol_class!(pub struct MetalVertexBufferLayoutDescriptorArray => "MTLVertexBufferLayoutDescriptorArray";);
1646opaque_symbol_class!(pub struct MetalVertexDescriptor => "MTLVertexDescriptor";);
1647opaque_symbol_class!(pub struct MetalVisibleFunctionTableDescriptor => "MTLVisibleFunctionTableDescriptor";);