1use core::ffi::*;
4use core::ptr::NonNull;
5use objc2::__framework_prelude::*;
6#[cfg(feature = "objc2-core-foundation")]
7use objc2_core_foundation::*;
8use objc2_foundation::*;
9
10use crate::*;
11
12#[repr(transparent)]
35#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
36pub struct MTLCommandBufferStatus(pub NSUInteger);
37impl MTLCommandBufferStatus {
38 #[doc(alias = "MTLCommandBufferStatusNotEnqueued")]
39 pub const NotEnqueued: Self = Self(0);
40 #[doc(alias = "MTLCommandBufferStatusEnqueued")]
41 pub const Enqueued: Self = Self(1);
42 #[doc(alias = "MTLCommandBufferStatusCommitted")]
43 pub const Committed: Self = Self(2);
44 #[doc(alias = "MTLCommandBufferStatusScheduled")]
45 pub const Scheduled: Self = Self(3);
46 #[doc(alias = "MTLCommandBufferStatusCompleted")]
47 pub const Completed: Self = Self(4);
48 #[doc(alias = "MTLCommandBufferStatusError")]
49 pub const Error: Self = Self(5);
50}
51
52unsafe impl Encode for MTLCommandBufferStatus {
53 const ENCODING: Encoding = NSUInteger::ENCODING;
54}
55
56unsafe impl RefEncode for MTLCommandBufferStatus {
57 const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
58}
59
60extern "C" {
61 pub static MTLCommandBufferErrorDomain: &'static NSErrorDomain;
65}
66
67#[repr(transparent)]
102#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
103pub struct MTLCommandBufferError(pub NSUInteger);
104impl MTLCommandBufferError {
105 #[doc(alias = "MTLCommandBufferErrorNone")]
106 pub const None: Self = Self(0);
107 #[doc(alias = "MTLCommandBufferErrorInternal")]
108 pub const Internal: Self = Self(1);
109 #[doc(alias = "MTLCommandBufferErrorTimeout")]
110 pub const Timeout: Self = Self(2);
111 #[doc(alias = "MTLCommandBufferErrorPageFault")]
112 pub const PageFault: Self = Self(3);
113 #[doc(alias = "MTLCommandBufferErrorBlacklisted")]
114 #[deprecated]
115 pub const Blacklisted: Self = Self(4);
116 #[doc(alias = "MTLCommandBufferErrorAccessRevoked")]
117 pub const AccessRevoked: Self = Self(4);
118 #[doc(alias = "MTLCommandBufferErrorNotPermitted")]
119 pub const NotPermitted: Self = Self(7);
120 #[doc(alias = "MTLCommandBufferErrorOutOfMemory")]
121 pub const OutOfMemory: Self = Self(8);
122 #[doc(alias = "MTLCommandBufferErrorInvalidResource")]
123 pub const InvalidResource: Self = Self(9);
124 #[doc(alias = "MTLCommandBufferErrorMemoryless")]
125 pub const Memoryless: Self = Self(10);
126 #[doc(alias = "MTLCommandBufferErrorDeviceRemoved")]
127 pub const DeviceRemoved: Self = Self(11);
128 #[doc(alias = "MTLCommandBufferErrorStackOverflow")]
129 pub const StackOverflow: Self = Self(12);
130}
131
132unsafe impl Encode for MTLCommandBufferError {
133 const ENCODING: Encoding = NSUInteger::ENCODING;
134}
135
136unsafe impl RefEncode for MTLCommandBufferError {
137 const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
138}
139
140extern "C" {
141 pub static MTLCommandBufferEncoderInfoErrorKey: &'static NSErrorUserInfoKey;
145}
146
147#[repr(transparent)]
158#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
159pub struct MTLCommandBufferErrorOption(pub NSUInteger);
160bitflags::bitflags! {
161 impl MTLCommandBufferErrorOption: NSUInteger {
162 #[doc(alias = "MTLCommandBufferErrorOptionNone")]
163 const None = 0;
164 #[doc(alias = "MTLCommandBufferErrorOptionEncoderExecutionStatus")]
165 const EncoderExecutionStatus = 1<<0;
166 }
167}
168
169unsafe impl Encode for MTLCommandBufferErrorOption {
170 const ENCODING: Encoding = NSUInteger::ENCODING;
171}
172
173unsafe impl RefEncode for MTLCommandBufferErrorOption {
174 const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
175}
176
177#[repr(transparent)]
197#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
198pub struct MTLCommandEncoderErrorState(pub NSInteger);
199impl MTLCommandEncoderErrorState {
200 #[doc(alias = "MTLCommandEncoderErrorStateUnknown")]
201 pub const Unknown: Self = Self(0);
202 #[doc(alias = "MTLCommandEncoderErrorStateCompleted")]
203 pub const Completed: Self = Self(1);
204 #[doc(alias = "MTLCommandEncoderErrorStateAffected")]
205 pub const Affected: Self = Self(2);
206 #[doc(alias = "MTLCommandEncoderErrorStatePending")]
207 pub const Pending: Self = Self(3);
208 #[doc(alias = "MTLCommandEncoderErrorStateFaulted")]
209 pub const Faulted: Self = Self(4);
210}
211
212unsafe impl Encode for MTLCommandEncoderErrorState {
213 const ENCODING: Encoding = NSInteger::ENCODING;
214}
215
216unsafe impl RefEncode for MTLCommandEncoderErrorState {
217 const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
218}
219
220extern_class!(
221 #[unsafe(super(NSObject))]
225 #[derive(Debug, PartialEq, Eq, Hash)]
226 pub struct MTLCommandBufferDescriptor;
227);
228
229extern_conformance!(
230 unsafe impl NSCopying for MTLCommandBufferDescriptor {}
231);
232
233unsafe impl CopyingHelper for MTLCommandBufferDescriptor {
234 type Result = Self;
235}
236
237extern_conformance!(
238 unsafe impl NSObjectProtocol for MTLCommandBufferDescriptor {}
239);
240
241impl MTLCommandBufferDescriptor {
242 extern_methods!(
243 #[unsafe(method(retainedReferences))]
245 #[unsafe(method_family = none)]
246 pub fn retainedReferences(&self) -> bool;
247
248 #[unsafe(method(setRetainedReferences:))]
250 #[unsafe(method_family = none)]
251 pub fn setRetainedReferences(&self, retained_references: bool);
252
253 #[unsafe(method(errorOptions))]
255 #[unsafe(method_family = none)]
256 pub fn errorOptions(&self) -> MTLCommandBufferErrorOption;
257
258 #[unsafe(method(setErrorOptions:))]
260 #[unsafe(method_family = none)]
261 pub fn setErrorOptions(&self, error_options: MTLCommandBufferErrorOption);
262
263 #[cfg(feature = "MTLLogState")]
264 #[unsafe(method(logState))]
266 #[unsafe(method_family = none)]
267 pub fn logState(&self) -> Option<Retained<ProtocolObject<dyn MTLLogState>>>;
268
269 #[cfg(feature = "MTLLogState")]
270 #[unsafe(method(setLogState:))]
272 #[unsafe(method_family = none)]
273 pub fn setLogState(&self, log_state: Option<&ProtocolObject<dyn MTLLogState>>);
274 );
275}
276
277impl MTLCommandBufferDescriptor {
279 extern_methods!(
280 #[unsafe(method(init))]
281 #[unsafe(method_family = init)]
282 pub fn init(this: Allocated<Self>) -> Retained<Self>;
283
284 #[unsafe(method(new))]
285 #[unsafe(method_family = new)]
286 pub fn new() -> Retained<Self>;
287 );
288}
289
290impl DefaultRetained for MTLCommandBufferDescriptor {
291 #[inline]
292 fn default_retained() -> Retained<Self> {
293 Self::new()
294 }
295}
296
297extern_protocol!(
298 pub unsafe trait MTLCommandBufferEncoderInfo: NSObjectProtocol {
302 #[unsafe(method(label))]
304 #[unsafe(method_family = none)]
305 fn label(&self) -> Retained<NSString>;
306
307 #[unsafe(method(debugSignposts))]
309 #[unsafe(method_family = none)]
310 fn debugSignposts(&self) -> Retained<NSArray<NSString>>;
311
312 #[unsafe(method(errorState))]
314 #[unsafe(method_family = none)]
315 fn errorState(&self) -> MTLCommandEncoderErrorState;
316 }
317);
318
319#[cfg(feature = "block2")]
321pub type MTLCommandBufferHandler =
322 *mut block2::DynBlock<dyn Fn(NonNull<ProtocolObject<dyn MTLCommandBuffer>>)>;
323
324#[repr(transparent)]
335#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
336pub struct MTLDispatchType(pub NSUInteger);
337impl MTLDispatchType {
338 #[doc(alias = "MTLDispatchTypeSerial")]
339 pub const Serial: Self = Self(0);
340 #[doc(alias = "MTLDispatchTypeConcurrent")]
341 pub const Concurrent: Self = Self(1);
342}
343
344unsafe impl Encode for MTLDispatchType {
345 const ENCODING: Encoding = NSUInteger::ENCODING;
346}
347
348unsafe impl RefEncode for MTLDispatchType {
349 const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
350}
351
352extern_protocol!(
353 pub unsafe trait MTLCommandBuffer: NSObjectProtocol {
357 #[cfg(feature = "MTLDevice")]
358 #[unsafe(method(device))]
360 #[unsafe(method_family = none)]
361 fn device(&self) -> Retained<ProtocolObject<dyn MTLDevice>>;
362
363 #[cfg(feature = "MTLCommandQueue")]
364 #[unsafe(method(commandQueue))]
366 #[unsafe(method_family = none)]
367 fn commandQueue(&self) -> Retained<ProtocolObject<dyn MTLCommandQueue>>;
368
369 #[unsafe(method(retainedReferences))]
371 #[unsafe(method_family = none)]
372 fn retainedReferences(&self) -> bool;
373
374 #[unsafe(method(errorOptions))]
376 #[unsafe(method_family = none)]
377 fn errorOptions(&self) -> MTLCommandBufferErrorOption;
378
379 #[unsafe(method(label))]
381 #[unsafe(method_family = none)]
382 fn label(&self) -> Option<Retained<NSString>>;
383
384 #[unsafe(method(setLabel:))]
388 #[unsafe(method_family = none)]
389 fn setLabel(&self, label: Option<&NSString>);
390
391 #[cfg(feature = "objc2-core-foundation")]
392 #[unsafe(method(kernelStartTime))]
393 #[unsafe(method_family = none)]
394 fn kernelStartTime(&self) -> CFTimeInterval;
395
396 #[cfg(feature = "objc2-core-foundation")]
397 #[unsafe(method(kernelEndTime))]
398 #[unsafe(method_family = none)]
399 fn kernelEndTime(&self) -> CFTimeInterval;
400
401 #[cfg(feature = "MTLFunctionLog")]
402 #[unsafe(method(logs))]
404 #[unsafe(method_family = none)]
405 fn logs(&self) -> Retained<ProtocolObject<dyn MTLLogContainer>>;
406
407 #[cfg(feature = "objc2-core-foundation")]
408 #[unsafe(method(GPUStartTime))]
410 #[unsafe(method_family = none)]
411 fn GPUStartTime(&self) -> CFTimeInterval;
412
413 #[cfg(feature = "objc2-core-foundation")]
414 #[unsafe(method(GPUEndTime))]
416 #[unsafe(method_family = none)]
417 fn GPUEndTime(&self) -> CFTimeInterval;
418
419 #[unsafe(method(enqueue))]
421 #[unsafe(method_family = none)]
422 fn enqueue(&self);
423
424 #[unsafe(method(commit))]
426 #[unsafe(method_family = none)]
427 fn commit(&self);
428
429 #[cfg(feature = "block2")]
430 #[unsafe(method(addScheduledHandler:))]
436 #[unsafe(method_family = none)]
437 unsafe fn addScheduledHandler(&self, block: MTLCommandBufferHandler);
438
439 #[cfg(feature = "MTLDrawable")]
440 #[unsafe(method(presentDrawable:))]
444 #[unsafe(method_family = none)]
445 fn presentDrawable(&self, drawable: &ProtocolObject<dyn MTLDrawable>);
446
447 #[cfg(all(feature = "MTLDrawable", feature = "objc2-core-foundation"))]
448 #[unsafe(method(presentDrawable:atTime:))]
452 #[unsafe(method_family = none)]
453 fn presentDrawable_atTime(
454 &self,
455 drawable: &ProtocolObject<dyn MTLDrawable>,
456 presentation_time: CFTimeInterval,
457 );
458
459 #[cfg(all(feature = "MTLDrawable", feature = "objc2-core-foundation"))]
460 #[unsafe(method(presentDrawable:afterMinimumDuration:))]
469 #[unsafe(method_family = none)]
470 fn presentDrawable_afterMinimumDuration(
471 &self,
472 drawable: &ProtocolObject<dyn MTLDrawable>,
473 duration: CFTimeInterval,
474 );
475
476 #[unsafe(method(waitUntilScheduled))]
478 #[unsafe(method_family = none)]
479 fn waitUntilScheduled(&self);
480
481 #[cfg(feature = "block2")]
482 #[unsafe(method(addCompletedHandler:))]
488 #[unsafe(method_family = none)]
489 unsafe fn addCompletedHandler(&self, block: MTLCommandBufferHandler);
490
491 #[unsafe(method(waitUntilCompleted))]
493 #[unsafe(method_family = none)]
494 fn waitUntilCompleted(&self);
495
496 #[unsafe(method(status))]
498 #[unsafe(method_family = none)]
499 fn status(&self) -> MTLCommandBufferStatus;
500
501 #[unsafe(method(error))]
503 #[unsafe(method_family = none)]
504 fn error(&self) -> Option<Retained<NSError>>;
505
506 #[cfg(all(feature = "MTLBlitCommandEncoder", feature = "MTLCommandEncoder"))]
507 #[unsafe(method(blitCommandEncoder))]
509 #[unsafe(method_family = none)]
510 fn blitCommandEncoder(&self)
511 -> Option<Retained<ProtocolObject<dyn MTLBlitCommandEncoder>>>;
512
513 #[cfg(all(
514 feature = "MTLCommandEncoder",
515 feature = "MTLRenderCommandEncoder",
516 feature = "MTLRenderPass"
517 ))]
518 #[unsafe(method(renderCommandEncoderWithDescriptor:))]
520 #[unsafe(method_family = none)]
521 fn renderCommandEncoderWithDescriptor(
522 &self,
523 render_pass_descriptor: &MTLRenderPassDescriptor,
524 ) -> Option<Retained<ProtocolObject<dyn MTLRenderCommandEncoder>>>;
525
526 #[cfg(all(
527 feature = "MTLCommandEncoder",
528 feature = "MTLComputeCommandEncoder",
529 feature = "MTLComputePass"
530 ))]
531 #[unsafe(method(computeCommandEncoderWithDescriptor:))]
533 #[unsafe(method_family = none)]
534 fn computeCommandEncoderWithDescriptor(
535 &self,
536 compute_pass_descriptor: &MTLComputePassDescriptor,
537 ) -> Option<Retained<ProtocolObject<dyn MTLComputeCommandEncoder>>>;
538
539 #[cfg(all(
540 feature = "MTLBlitCommandEncoder",
541 feature = "MTLBlitPass",
542 feature = "MTLCommandEncoder"
543 ))]
544 #[unsafe(method(blitCommandEncoderWithDescriptor:))]
546 #[unsafe(method_family = none)]
547 fn blitCommandEncoderWithDescriptor(
548 &self,
549 blit_pass_descriptor: &MTLBlitPassDescriptor,
550 ) -> Option<Retained<ProtocolObject<dyn MTLBlitCommandEncoder>>>;
551
552 #[cfg(all(feature = "MTLCommandEncoder", feature = "MTLComputeCommandEncoder"))]
553 #[unsafe(method(computeCommandEncoder))]
555 #[unsafe(method_family = none)]
556 fn computeCommandEncoder(
557 &self,
558 ) -> Option<Retained<ProtocolObject<dyn MTLComputeCommandEncoder>>>;
559
560 #[cfg(all(feature = "MTLCommandEncoder", feature = "MTLComputeCommandEncoder"))]
561 #[unsafe(method(computeCommandEncoderWithDispatchType:))]
565 #[unsafe(method_family = none)]
566 fn computeCommandEncoderWithDispatchType(
567 &self,
568 dispatch_type: MTLDispatchType,
569 ) -> Option<Retained<ProtocolObject<dyn MTLComputeCommandEncoder>>>;
570
571 #[cfg(feature = "MTLEvent")]
572 #[unsafe(method(encodeWaitForEvent:value:))]
576 #[unsafe(method_family = none)]
577 fn encodeWaitForEvent_value(&self, event: &ProtocolObject<dyn MTLEvent>, value: u64);
578
579 #[cfg(feature = "MTLEvent")]
580 #[unsafe(method(encodeSignalEvent:value:))]
584 #[unsafe(method_family = none)]
585 fn encodeSignalEvent_value(&self, event: &ProtocolObject<dyn MTLEvent>, value: u64);
586
587 #[cfg(all(
588 feature = "MTLCommandEncoder",
589 feature = "MTLParallelRenderCommandEncoder",
590 feature = "MTLRenderPass"
591 ))]
592 #[unsafe(method(parallelRenderCommandEncoderWithDescriptor:))]
594 #[unsafe(method_family = none)]
595 fn parallelRenderCommandEncoderWithDescriptor(
596 &self,
597 render_pass_descriptor: &MTLRenderPassDescriptor,
598 ) -> Option<Retained<ProtocolObject<dyn MTLParallelRenderCommandEncoder>>>;
599
600 #[cfg(all(
601 feature = "MTLCommandEncoder",
602 feature = "MTLResourceStateCommandEncoder"
603 ))]
604 #[unsafe(method(resourceStateCommandEncoder))]
605 #[unsafe(method_family = none)]
606 fn resourceStateCommandEncoder(
607 &self,
608 ) -> Option<Retained<ProtocolObject<dyn MTLResourceStateCommandEncoder>>>;
609
610 #[cfg(all(
611 feature = "MTLCommandEncoder",
612 feature = "MTLResourceStateCommandEncoder",
613 feature = "MTLResourceStatePass"
614 ))]
615 #[unsafe(method(resourceStateCommandEncoderWithDescriptor:))]
616 #[unsafe(method_family = none)]
617 fn resourceStateCommandEncoderWithDescriptor(
618 &self,
619 resource_state_pass_descriptor: &MTLResourceStatePassDescriptor,
620 ) -> Option<Retained<ProtocolObject<dyn MTLResourceStateCommandEncoder>>>;
621
622 #[cfg(all(
623 feature = "MTLAccelerationStructureCommandEncoder",
624 feature = "MTLCommandEncoder"
625 ))]
626 #[unsafe(method(accelerationStructureCommandEncoder))]
627 #[unsafe(method_family = none)]
628 fn accelerationStructureCommandEncoder(
629 &self,
630 ) -> Option<Retained<ProtocolObject<dyn MTLAccelerationStructureCommandEncoder>>>;
631
632 #[cfg(all(
633 feature = "MTLAccelerationStructureCommandEncoder",
634 feature = "MTLCommandEncoder"
635 ))]
636 #[unsafe(method(accelerationStructureCommandEncoderWithDescriptor:))]
637 #[unsafe(method_family = none)]
638 fn accelerationStructureCommandEncoderWithDescriptor(
639 &self,
640 descriptor: &MTLAccelerationStructurePassDescriptor,
641 ) -> Retained<ProtocolObject<dyn MTLAccelerationStructureCommandEncoder>>;
642
643 #[unsafe(method(pushDebugGroup:))]
645 #[unsafe(method_family = none)]
646 fn pushDebugGroup(&self, string: &NSString);
647
648 #[unsafe(method(popDebugGroup))]
650 #[unsafe(method_family = none)]
651 fn popDebugGroup(&self);
652
653 #[cfg(feature = "MTLResidencySet")]
654 #[unsafe(method(useResidencySet:))]
656 #[unsafe(method_family = none)]
657 fn useResidencySet(&self, residency_set: &ProtocolObject<dyn MTLResidencySet>);
658
659 #[cfg(feature = "MTLResidencySet")]
660 #[unsafe(method(useResidencySets:count:))]
667 #[unsafe(method_family = none)]
668 unsafe fn useResidencySets_count(
669 &self,
670 residency_sets: NonNull<NonNull<ProtocolObject<dyn MTLResidencySet>>>,
671 count: NSUInteger,
672 );
673 }
674);