objc2-metal 0.3.2

Bindings to the Metal framework
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
//! This file has been automatically generated by `objc2`'s `header-translator`.
//! DO NOT EDIT
use core::ffi::*;
use core::ptr::NonNull;
use objc2::__framework_prelude::*;
use objc2_foundation::*;

use crate::*;

extern_class!(
    /// Groups together properties you use to create a mesh render pipeline state object.
    ///
    /// Compared to ``MTLMeshRenderPipelineDescriptor``, this interface doesn't offer a mechanism to hint to Metal mutability
    /// of object, mesh, or fragment buffers. Additionally, when you use this descriptor, you don't specify binary archives.
    ///
    /// See also [Apple's documentation](https://developer.apple.com/documentation/metal/mtl4meshrenderpipelinedescriptor?language=objc)
    #[unsafe(super(MTL4PipelineDescriptor, NSObject))]
    #[derive(Debug, PartialEq, Eq, Hash)]
    #[cfg(feature = "MTL4PipelineState")]
    pub struct MTL4MeshRenderPipelineDescriptor;
);

#[cfg(feature = "MTL4PipelineState")]
extern_conformance!(
    unsafe impl NSCopying for MTL4MeshRenderPipelineDescriptor {}
);

#[cfg(feature = "MTL4PipelineState")]
unsafe impl CopyingHelper for MTL4MeshRenderPipelineDescriptor {
    type Result = Self;
}

#[cfg(feature = "MTL4PipelineState")]
extern_conformance!(
    unsafe impl NSObjectProtocol for MTL4MeshRenderPipelineDescriptor {}
);

#[cfg(feature = "MTL4PipelineState")]
impl MTL4MeshRenderPipelineDescriptor {
    extern_methods!(
        #[cfg(feature = "MTL4FunctionDescriptor")]
        /// Assigns a function descriptor representing the function this pipeline executes for each *object* in the object shader stage.
        #[unsafe(method(objectFunctionDescriptor))]
        #[unsafe(method_family = none)]
        pub fn objectFunctionDescriptor(&self) -> Option<Retained<MTL4FunctionDescriptor>>;

        #[cfg(feature = "MTL4FunctionDescriptor")]
        /// Setter for [`objectFunctionDescriptor`][Self::objectFunctionDescriptor].
        ///
        /// This is [copied][objc2_foundation::NSCopying::copy] when set.
        #[unsafe(method(setObjectFunctionDescriptor:))]
        #[unsafe(method_family = none)]
        pub fn setObjectFunctionDescriptor(
            &self,
            object_function_descriptor: Option<&MTL4FunctionDescriptor>,
        );

        #[cfg(feature = "MTL4FunctionDescriptor")]
        /// Assigns a function descriptor representing the function this pipeline executes for each primitive in the mesh shader stage.
        #[unsafe(method(meshFunctionDescriptor))]
        #[unsafe(method_family = none)]
        pub fn meshFunctionDescriptor(&self) -> Option<Retained<MTL4FunctionDescriptor>>;

        #[cfg(feature = "MTL4FunctionDescriptor")]
        /// Setter for [`meshFunctionDescriptor`][Self::meshFunctionDescriptor].
        ///
        /// This is [copied][objc2_foundation::NSCopying::copy] when set.
        #[unsafe(method(setMeshFunctionDescriptor:))]
        #[unsafe(method_family = none)]
        pub fn setMeshFunctionDescriptor(
            &self,
            mesh_function_descriptor: Option<&MTL4FunctionDescriptor>,
        );

        #[cfg(feature = "MTL4FunctionDescriptor")]
        /// Assigns a function descriptor representing the function this pipeline executes for each fragment.
        #[unsafe(method(fragmentFunctionDescriptor))]
        #[unsafe(method_family = none)]
        pub fn fragmentFunctionDescriptor(&self) -> Option<Retained<MTL4FunctionDescriptor>>;

        #[cfg(feature = "MTL4FunctionDescriptor")]
        /// Setter for [`fragmentFunctionDescriptor`][Self::fragmentFunctionDescriptor].
        ///
        /// This is [copied][objc2_foundation::NSCopying::copy] when set.
        #[unsafe(method(setFragmentFunctionDescriptor:))]
        #[unsafe(method_family = none)]
        pub fn setFragmentFunctionDescriptor(
            &self,
            fragment_function_descriptor: Option<&MTL4FunctionDescriptor>,
        );

        /// Controls the largest number of threads the pipeline state can execute in a single object shader threadgroup dispatch.
        ///
        /// This number represents the maximum size of the product of the components of parameter `threadsPerObjectThreadgroup`
        /// that Metal can use when drawing with this pipeline in mesh shader dispatch methods, such as
        /// ``MTL4RenderCommandEncoder/drawMeshThreadgroups:threadsPerObjectThreadgroup:threadsPerMeshThreadgroup:``.
        ///
        /// The compiler's optimizer can use the value of this property to generate more efficient code, specifically when
        /// the value doesn't exceed the thread execution width of the underlying GPU.
        ///
        /// The default value of this property is `0`, which indicates that the number you pass to attribute
        /// `[[max_total_threads_per_threadgroup(N)]]` of the pipeline's object function determines the maximum
        /// total threads per threadgroup.
        ///
        /// When you specify both the `[[max_total_threads_per_threadgroup(N)]]` attribute and this property, you are responsible
        /// for making sure these values match.
        ///
        /// Additionally, you are responsible for ensuring this value doesn't exceed the "maximum threads per threadgroup"
        /// device limit documented in the "Metal Feature Set Tables" PDF:
        /// <https
        /// ://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf>.
        #[unsafe(method(maxTotalThreadsPerObjectThreadgroup))]
        #[unsafe(method_family = none)]
        pub fn maxTotalThreadsPerObjectThreadgroup(&self) -> NSUInteger;

        /// Setter for [`maxTotalThreadsPerObjectThreadgroup`][Self::maxTotalThreadsPerObjectThreadgroup].
        #[unsafe(method(setMaxTotalThreadsPerObjectThreadgroup:))]
        #[unsafe(method_family = none)]
        pub fn setMaxTotalThreadsPerObjectThreadgroup(
            &self,
            max_total_threads_per_object_threadgroup: NSUInteger,
        );

        /// Controls the largest number of threads the pipeline state can execute in a single mesh shader threadgroup dispatch.
        ///
        /// This number represents the maximum size of the product of the components of parameter `threadsPerMeshThreadgroup`
        /// that Metal can use when drawing with this pipeline in mesh shader dispatch methods, such as
        /// ``MTL4RenderCommandEncoder/drawMeshThreadgroups:threadsPerObjectThreadgroup:threadsPerMeshThreadgroup:``.
        ///
        /// The compiler's optimizer can use the value of this property to generate more efficient code, specifically when
        /// the value doesn't exceed the thread execution width of the underlying GPU.
        ///
        /// The default value of this property is `0`, thish indicates that the Metal Shader Language attribute
        /// `[[max_total_threads_per_threadgroup]]` you attache to the pipeline's mesh shader function determines
        /// the value of this property.
        ///
        /// When you specify both the `[[max_total_threads_per_threadgroup(N)]]` attribute and this property, you are responsible
        /// for making sure these values match.
        ///
        /// Additionally, you are responsible for ensuring this value doesn't exceed the "maximum threads per threadgroup"
        /// device limit documented in the "Metal Feature Set Tables" PDF:
        /// <https
        /// ://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf>.
        #[unsafe(method(maxTotalThreadsPerMeshThreadgroup))]
        #[unsafe(method_family = none)]
        pub fn maxTotalThreadsPerMeshThreadgroup(&self) -> NSUInteger;

        /// Setter for [`maxTotalThreadsPerMeshThreadgroup`][Self::maxTotalThreadsPerMeshThreadgroup].
        #[unsafe(method(setMaxTotalThreadsPerMeshThreadgroup:))]
        #[unsafe(method_family = none)]
        pub fn setMaxTotalThreadsPerMeshThreadgroup(
            &self,
            max_total_threads_per_mesh_threadgroup: NSUInteger,
        );

        #[cfg(feature = "MTLTypes")]
        /// Controls the required number of object threads-per-threadgroup when drawing with a mesh shader pipeline you create
        /// from this descriptor.
        ///
        /// This argument is optional, unless this pipeline uses `CooperativeTensors`, in which case you are responsible for providing it.
        ///
        /// When this value is set to non-zero, you are responsible for ensuring the parameter `threadsPerObjectThreadgroup`
        /// in any mesh dispatch draw calls that use this mesh render pipeline, such as
        /// ``MTL4RenderCommandEncoder/drawMeshThreadgroups:threadsPerObjectThreadgroup:threadsPerMeshThreadgroup:``,
        /// match it.
        ///
        /// Setting this value to a size of 0 in every dimension disables this property.
        #[unsafe(method(requiredThreadsPerObjectThreadgroup))]
        #[unsafe(method_family = none)]
        pub fn requiredThreadsPerObjectThreadgroup(&self) -> MTLSize;

        #[cfg(feature = "MTLTypes")]
        /// Setter for [`requiredThreadsPerObjectThreadgroup`][Self::requiredThreadsPerObjectThreadgroup].
        #[unsafe(method(setRequiredThreadsPerObjectThreadgroup:))]
        #[unsafe(method_family = none)]
        pub fn setRequiredThreadsPerObjectThreadgroup(
            &self,
            required_threads_per_object_threadgroup: MTLSize,
        );

        #[cfg(feature = "MTLTypes")]
        /// Controls the required number of mesh threads-per-threadgroup when drawing with a mesh shader pipeline you create
        /// from this descriptor.
        ///
        /// This argument is optional, unless this pipeline uses `CooperativeTensors`, in which case you are responsible for providing it.
        ///
        /// When this value is set to non-zero, you are responsible for ensuring the parameter `threadsPerMeshThreadgroup`
        /// in any mesh dispatch draw calls that use this mesh render pipeline, such as
        /// ``MTL4RenderCommandEncoder/drawMeshThreadgroups:threadsPerObjectThreadgroup:threadsPerMeshThreadgroup:``,
        /// match it.
        ///
        /// Setting this value to a size of 0 in every dimension disables this property.
        #[unsafe(method(requiredThreadsPerMeshThreadgroup))]
        #[unsafe(method_family = none)]
        pub fn requiredThreadsPerMeshThreadgroup(&self) -> MTLSize;

        #[cfg(feature = "MTLTypes")]
        /// Setter for [`requiredThreadsPerMeshThreadgroup`][Self::requiredThreadsPerMeshThreadgroup].
        #[unsafe(method(setRequiredThreadsPerMeshThreadgroup:))]
        #[unsafe(method_family = none)]
        pub fn setRequiredThreadsPerMeshThreadgroup(
            &self,
            required_threads_per_mesh_threadgroup: MTLSize,
        );

        /// Provides a guarantee to Metal regarding the number of threadgroup threads for the object stage of a pipeline you
        /// create from this descriptor.
        ///
        /// If you set this property to
        /// <doc
        /// ://com.apple.documentation/documentation/swift/true>, you state to Metal that when
        /// you use a mesh render pipeline you create from this descriptor, the number of threadgroup threads you dispatch for
        /// the object stage is a multiple of its ``MTLRenderPipelineState/objectThreadExecutionWidth``. The compiler's optimizer can use this guarantee to generate
        /// more efficient code.
        ///
        /// This property's default value is
        /// <doc
        /// ://com.apple.documentation/documentation/swift/false>.
        #[unsafe(method(objectThreadgroupSizeIsMultipleOfThreadExecutionWidth))]
        #[unsafe(method_family = none)]
        pub fn objectThreadgroupSizeIsMultipleOfThreadExecutionWidth(&self) -> bool;

        /// Setter for [`objectThreadgroupSizeIsMultipleOfThreadExecutionWidth`][Self::objectThreadgroupSizeIsMultipleOfThreadExecutionWidth].
        #[unsafe(method(setObjectThreadgroupSizeIsMultipleOfThreadExecutionWidth:))]
        #[unsafe(method_family = none)]
        pub fn setObjectThreadgroupSizeIsMultipleOfThreadExecutionWidth(
            &self,
            object_threadgroup_size_is_multiple_of_thread_execution_width: bool,
        );

        /// Provides a guarantee to Metal regarding the number of threadgroup threads for the mesh stage of a pipeline you
        /// create from this descriptor.
        ///
        /// If you set this property to
        /// <doc
        /// ://com.apple.documentation/documentation/swift/true>, you state to Metal that when
        /// you use a mesh render pipeline you create from this descriptor, the number of threadgroup threads you dispatch for
        /// the mesh stage is a multiple of its ``MTLRenderPipelineState/meshThreadExecutionWidth``. The compiler's optimizer
        /// can use this guarantee to generate more efficient code.
        ///
        /// This property's default value is
        /// <doc
        /// ://com.apple.documentation/documentation/swift/false>.
        #[unsafe(method(meshThreadgroupSizeIsMultipleOfThreadExecutionWidth))]
        #[unsafe(method_family = none)]
        pub fn meshThreadgroupSizeIsMultipleOfThreadExecutionWidth(&self) -> bool;

        /// Setter for [`meshThreadgroupSizeIsMultipleOfThreadExecutionWidth`][Self::meshThreadgroupSizeIsMultipleOfThreadExecutionWidth].
        #[unsafe(method(setMeshThreadgroupSizeIsMultipleOfThreadExecutionWidth:))]
        #[unsafe(method_family = none)]
        pub fn setMeshThreadgroupSizeIsMultipleOfThreadExecutionWidth(
            &self,
            mesh_threadgroup_size_is_multiple_of_thread_execution_width: bool,
        );

        /// Reserves storage for the object-to-mesh stage payload.
        ///
        /// This property determines the size, in bytes, of the buffer you indicate via the Metal Shading Language `[[payload]]`
        /// attribute in the object and mesh shader functions of the mesh render pipeline.
        ///
        /// If this value is `0`, Metal derives the size from the (dereferenced) type you declare for the payload in the object
        /// shader function. If the type is a pointer, Metal reserves space for a single element.
        ///
        /// The default value is `0`.
        #[unsafe(method(payloadMemoryLength))]
        #[unsafe(method_family = none)]
        pub fn payloadMemoryLength(&self) -> NSUInteger;

        /// Setter for [`payloadMemoryLength`][Self::payloadMemoryLength].
        #[unsafe(method(setPayloadMemoryLength:))]
        #[unsafe(method_family = none)]
        pub fn setPayloadMemoryLength(&self, payload_memory_length: NSUInteger);

        /// Controls the largest number of threads the pipeline state can execute when the object stage of a mesh
        /// render pipeline you create from this descriptor dispatches its mesh stage.
        ///
        /// This number represents the maximum size of the product of the components of the parameter you pass to Metal
        /// Shading Language's built-in function `mesh_grid_properties::set_threadgroups_per_grid`.
        ///
        /// The default value of this property is `0`, which indicates that the Metal Shading Language attribute
        /// `[[max_total_threadgroups_per_mesh_grid(N)]]` you attach to the pipeline's mesh shader function determines
        /// the value of this property.
        ///
        /// When you specify both the `[[max_total_threadgroups_per_mesh_grid(N)]]` attribute and this property, you are
        /// responsible for making sure these values match.
        ///
        /// Additionally, you are responsible for ensuring this value doesn't exceed the "maximum threads per mesh grid"
        /// device limit documented in the "Metal Feature Set Tables" PDF:
        /// <https
        /// ://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf>.
        #[unsafe(method(maxTotalThreadgroupsPerMeshGrid))]
        #[unsafe(method_family = none)]
        pub fn maxTotalThreadgroupsPerMeshGrid(&self) -> NSUInteger;

        /// Setter for [`maxTotalThreadgroupsPerMeshGrid`][Self::maxTotalThreadgroupsPerMeshGrid].
        #[unsafe(method(setMaxTotalThreadgroupsPerMeshGrid:))]
        #[unsafe(method_family = none)]
        pub fn setMaxTotalThreadgroupsPerMeshGrid(
            &self,
            max_total_threadgroups_per_mesh_grid: NSUInteger,
        );

        /// Sets number of samples this pipeline applies for each fragment.
        #[unsafe(method(rasterSampleCount))]
        #[unsafe(method_family = none)]
        pub fn rasterSampleCount(&self) -> NSUInteger;

        /// Setter for [`rasterSampleCount`][Self::rasterSampleCount].
        ///
        /// # Safety
        ///
        /// This might not be bounds-checked.
        #[unsafe(method(setRasterSampleCount:))]
        #[unsafe(method_family = none)]
        pub unsafe fn setRasterSampleCount(&self, raster_sample_count: NSUInteger);

        /// Indicates whether to read and use the alpha channel fragment output of color attachments to compute a sample coverage mask.
        #[unsafe(method(alphaToCoverageState))]
        #[unsafe(method_family = none)]
        pub fn alphaToCoverageState(&self) -> MTL4AlphaToCoverageState;

        /// Setter for [`alphaToCoverageState`][Self::alphaToCoverageState].
        #[unsafe(method(setAlphaToCoverageState:))]
        #[unsafe(method_family = none)]
        pub fn setAlphaToCoverageState(&self, alpha_to_coverage_state: MTL4AlphaToCoverageState);

        /// Indicates whether the pipeline forces alpha channel values of color attachments to the largest representable value.
        #[unsafe(method(alphaToOneState))]
        #[unsafe(method_family = none)]
        pub fn alphaToOneState(&self) -> MTL4AlphaToOneState;

        /// Setter for [`alphaToOneState`][Self::alphaToOneState].
        #[unsafe(method(setAlphaToOneState:))]
        #[unsafe(method_family = none)]
        pub fn setAlphaToOneState(&self, alpha_to_one_state: MTL4AlphaToOneState);

        /// Determines whether the pipeline rasterizes primitives.
        ///
        /// By default, this value is
        /// <doc
        /// ://com.apple.documentation/documentation/swift/true>, specifying that this pipeline
        /// rasterizes primitives. Set this property to
        /// <doc
        /// ://com.apple.documentation/documentation/swift/false> when you
        /// don't provide a fragment shader function via function ``fragmentFunctionDescriptor``.
        #[unsafe(method(isRasterizationEnabled))]
        #[unsafe(method_family = none)]
        pub fn isRasterizationEnabled(&self) -> bool;

        /// Setter for [`isRasterizationEnabled`][Self::isRasterizationEnabled].
        #[unsafe(method(setRasterizationEnabled:))]
        #[unsafe(method_family = none)]
        pub fn setRasterizationEnabled(&self, rasterization_enabled: bool);

        /// Determines the maximum value that can you can pass as the pipeline's amplification count.
        ///
        /// This property controls the maximum count you pass to ``MTL4RenderCommandEncoder/setVertexAmplificationCount:viewMappings:``
        /// when using vertex amplification with this pipeline.
        #[unsafe(method(maxVertexAmplificationCount))]
        #[unsafe(method_family = none)]
        pub fn maxVertexAmplificationCount(&self) -> NSUInteger;

        /// Setter for [`maxVertexAmplificationCount`][Self::maxVertexAmplificationCount].
        ///
        /// # Safety
        ///
        /// This might not be bounds-checked.
        #[unsafe(method(setMaxVertexAmplificationCount:))]
        #[unsafe(method_family = none)]
        pub unsafe fn setMaxVertexAmplificationCount(
            &self,
            max_vertex_amplification_count: NSUInteger,
        );

        #[cfg(feature = "MTL4RenderPipeline")]
        /// Accesses an array containing descriptions of the color attachments this pipeline writes to.
        #[unsafe(method(colorAttachments))]
        #[unsafe(method_family = none)]
        pub fn colorAttachments(
            &self,
        ) -> Retained<MTL4RenderPipelineColorAttachmentDescriptorArray>;

        #[cfg(feature = "MTL4LinkingDescriptor")]
        /// Provides static linking information for the object stage of the render pipeline.
        ///
        /// Use this property to link extra shader functions to the object stage of the render pipeline.
        #[unsafe(method(objectStaticLinkingDescriptor))]
        #[unsafe(method_family = none)]
        pub fn objectStaticLinkingDescriptor(&self) -> Retained<MTL4StaticLinkingDescriptor>;

        #[cfg(feature = "MTL4LinkingDescriptor")]
        /// Setter for [`objectStaticLinkingDescriptor`][Self::objectStaticLinkingDescriptor].
        ///
        /// This is [copied][objc2_foundation::NSCopying::copy] when set.
        #[unsafe(method(setObjectStaticLinkingDescriptor:))]
        #[unsafe(method_family = none)]
        pub fn setObjectStaticLinkingDescriptor(
            &self,
            object_static_linking_descriptor: Option<&MTL4StaticLinkingDescriptor>,
        );

        #[cfg(feature = "MTL4LinkingDescriptor")]
        /// Provides static linking information for the mesh stage of the render pipeline.
        ///
        /// Use this property to link extra shader functions to the mesh stage of the render pipeline.
        #[unsafe(method(meshStaticLinkingDescriptor))]
        #[unsafe(method_family = none)]
        pub fn meshStaticLinkingDescriptor(&self) -> Retained<MTL4StaticLinkingDescriptor>;

        #[cfg(feature = "MTL4LinkingDescriptor")]
        /// Setter for [`meshStaticLinkingDescriptor`][Self::meshStaticLinkingDescriptor].
        ///
        /// This is [copied][objc2_foundation::NSCopying::copy] when set.
        #[unsafe(method(setMeshStaticLinkingDescriptor:))]
        #[unsafe(method_family = none)]
        pub fn setMeshStaticLinkingDescriptor(
            &self,
            mesh_static_linking_descriptor: Option<&MTL4StaticLinkingDescriptor>,
        );

        #[cfg(feature = "MTL4LinkingDescriptor")]
        /// Provides static linking information for the fragment stage of the render pipeline.
        ///
        /// Use this property to link extra shader functions to the fragment stage of the render pipeline.
        #[unsafe(method(fragmentStaticLinkingDescriptor))]
        #[unsafe(method_family = none)]
        pub fn fragmentStaticLinkingDescriptor(&self) -> Retained<MTL4StaticLinkingDescriptor>;

        #[cfg(feature = "MTL4LinkingDescriptor")]
        /// Setter for [`fragmentStaticLinkingDescriptor`][Self::fragmentStaticLinkingDescriptor].
        ///
        /// This is [copied][objc2_foundation::NSCopying::copy] when set.
        #[unsafe(method(setFragmentStaticLinkingDescriptor:))]
        #[unsafe(method_family = none)]
        pub fn setFragmentStaticLinkingDescriptor(
            &self,
            fragment_static_linking_descriptor: Option<&MTL4StaticLinkingDescriptor>,
        );

        /// Indicates whether you can use the render pipeline to create new pipelines by adding binary functions to the object
        /// shader function’s callable functions list.
        #[unsafe(method(supportObjectBinaryLinking))]
        #[unsafe(method_family = none)]
        pub fn supportObjectBinaryLinking(&self) -> bool;

        /// Setter for [`supportObjectBinaryLinking`][Self::supportObjectBinaryLinking].
        #[unsafe(method(setSupportObjectBinaryLinking:))]
        #[unsafe(method_family = none)]
        pub fn setSupportObjectBinaryLinking(&self, support_object_binary_linking: bool);

        /// Indicates whether you can use the render pipeline to create new pipelines by adding binary functions to the mesh
        /// shader function’s callable functions list.
        #[unsafe(method(supportMeshBinaryLinking))]
        #[unsafe(method_family = none)]
        pub fn supportMeshBinaryLinking(&self) -> bool;

        /// Setter for [`supportMeshBinaryLinking`][Self::supportMeshBinaryLinking].
        #[unsafe(method(setSupportMeshBinaryLinking:))]
        #[unsafe(method_family = none)]
        pub fn setSupportMeshBinaryLinking(&self, support_mesh_binary_linking: bool);

        /// Indicates whether you can use the render pipeline to create new pipelines by adding binary functions to the fragment
        /// shader function’s callable functions list.
        #[unsafe(method(supportFragmentBinaryLinking))]
        #[unsafe(method_family = none)]
        pub fn supportFragmentBinaryLinking(&self) -> bool;

        /// Setter for [`supportFragmentBinaryLinking`][Self::supportFragmentBinaryLinking].
        #[unsafe(method(setSupportFragmentBinaryLinking:))]
        #[unsafe(method_family = none)]
        pub fn setSupportFragmentBinaryLinking(&self, support_fragment_binary_linking: bool);

        #[cfg(feature = "MTL4RenderPipeline")]
        /// Sets the logical-to-physical rendering remap state.
        ///
        /// Use this property to assign how a ``MTL4RenderCommandEncoder`` instance maps the output of your fragment shader to
        /// physical color attachments.
        #[unsafe(method(colorAttachmentMappingState))]
        #[unsafe(method_family = none)]
        pub fn colorAttachmentMappingState(
            &self,
        ) -> MTL4LogicalToPhysicalColorAttachmentMappingState;

        #[cfg(feature = "MTL4RenderPipeline")]
        /// Setter for [`colorAttachmentMappingState`][Self::colorAttachmentMappingState].
        #[unsafe(method(setColorAttachmentMappingState:))]
        #[unsafe(method_family = none)]
        pub fn setColorAttachmentMappingState(
            &self,
            color_attachment_mapping_state: MTL4LogicalToPhysicalColorAttachmentMappingState,
        );

        /// Indicates whether the pipeline supports indirect command buffers.
        #[unsafe(method(supportIndirectCommandBuffers))]
        #[unsafe(method_family = none)]
        pub fn supportIndirectCommandBuffers(&self) -> MTL4IndirectCommandBufferSupportState;

        /// Setter for [`supportIndirectCommandBuffers`][Self::supportIndirectCommandBuffers].
        #[unsafe(method(setSupportIndirectCommandBuffers:))]
        #[unsafe(method_family = none)]
        pub fn setSupportIndirectCommandBuffers(
            &self,
            support_indirect_command_buffers: MTL4IndirectCommandBufferSupportState,
        );

        /// Resets this descriptor to its default state.
        #[unsafe(method(reset))]
        #[unsafe(method_family = none)]
        pub fn reset(&self);
    );
}

/// Methods declared on superclass `NSObject`.
#[cfg(feature = "MTL4PipelineState")]
impl MTL4MeshRenderPipelineDescriptor {
    extern_methods!(
        #[unsafe(method(init))]
        #[unsafe(method_family = init)]
        pub fn init(this: Allocated<Self>) -> Retained<Self>;

        #[unsafe(method(new))]
        #[unsafe(method_family = new)]
        pub fn new() -> Retained<Self>;
    );
}

#[cfg(feature = "MTL4PipelineState")]
impl DefaultRetained for MTL4MeshRenderPipelineDescriptor {
    #[inline]
    fn default_retained() -> Retained<Self> {
        Self::new()
    }
}