use objc2::{
extern_class, extern_conformance, extern_methods, msg_send,
rc::{Allocated, Retained},
runtime::{NSObject, ProtocolObject},
};
use objc2_foundation::{CopyingHelper, NSArray, NSCopying, NSObjectProtocol, NSString};
use crate::{
MTLBinaryArchive, MTLFunction, MTLLinkedFunctions, MTLPipelineBufferDescriptorArray, MTLPixelFormat,
MTLRenderPipelineColorAttachmentDescriptorArray, MTLShaderValidation, MTLSize,
};
extern_class!(
#[unsafe(super(NSObject))]
#[derive(Debug, PartialEq, Eq, Hash)]
pub struct MTLMeshRenderPipelineDescriptor;
);
extern_conformance!(
unsafe impl NSCopying for MTLMeshRenderPipelineDescriptor {}
);
unsafe impl CopyingHelper for MTLMeshRenderPipelineDescriptor {
type Result = Self;
}
extern_conformance!(
unsafe impl NSObjectProtocol for MTLMeshRenderPipelineDescriptor {}
);
impl MTLMeshRenderPipelineDescriptor {
extern_methods!(
#[unsafe(method(objectFunction))]
#[unsafe(method_family = none)]
pub fn object_function(&self) -> Option<Retained<ProtocolObject<dyn MTLFunction>>>;
#[unsafe(method(setObjectFunction:))]
#[unsafe(method_family = none)]
pub fn set_object_function(
&self,
function: Option<&ProtocolObject<dyn MTLFunction>>,
);
#[unsafe(method(meshFunction))]
#[unsafe(method_family = none)]
pub fn mesh_function(&self) -> Option<Retained<ProtocolObject<dyn MTLFunction>>>;
#[unsafe(method(setMeshFunction:))]
#[unsafe(method_family = none)]
pub fn set_mesh_function(
&self,
function: Option<&ProtocolObject<dyn MTLFunction>>,
);
#[unsafe(method(fragmentFunction))]
#[unsafe(method_family = none)]
pub fn fragment_function(&self) -> Option<Retained<ProtocolObject<dyn MTLFunction>>>;
#[unsafe(method(setFragmentFunction:))]
#[unsafe(method_family = none)]
pub fn set_fragment_function(
&self,
function: Option<&ProtocolObject<dyn MTLFunction>>,
);
#[unsafe(method(maxTotalThreadsPerObjectThreadgroup))]
#[unsafe(method_family = none)]
pub fn max_total_threads_per_object_threadgroup(&self) -> usize;
#[unsafe(method(setMaxTotalThreadsPerObjectThreadgroup:))]
#[unsafe(method_family = none)]
pub fn set_max_total_threads_per_object_threadgroup(
&self,
value: usize,
);
#[unsafe(method(maxTotalThreadsPerMeshThreadgroup))]
#[unsafe(method_family = none)]
pub fn max_total_threads_per_mesh_threadgroup(&self) -> usize;
#[unsafe(method(setMaxTotalThreadsPerMeshThreadgroup:))]
#[unsafe(method_family = none)]
pub fn set_max_total_threads_per_mesh_threadgroup(
&self,
value: usize,
);
#[unsafe(method(objectThreadgroupSizeIsMultipleOfThreadExecutionWidth))]
#[unsafe(method_family = none)]
pub fn object_threadgroup_size_is_multiple_of_thread_execution_width(&self) -> bool;
#[unsafe(method(setObjectThreadgroupSizeIsMultipleOfThreadExecutionWidth:))]
#[unsafe(method_family = none)]
pub fn set_object_threadgroup_size_is_multiple_of_thread_execution_width(
&self,
value: bool,
);
#[unsafe(method(meshThreadgroupSizeIsMultipleOfThreadExecutionWidth))]
#[unsafe(method_family = none)]
pub fn mesh_threadgroup_size_is_multiple_of_thread_execution_width(&self) -> bool;
#[unsafe(method(setMeshThreadgroupSizeIsMultipleOfThreadExecutionWidth:))]
#[unsafe(method_family = none)]
pub fn set_mesh_threadgroup_size_is_multiple_of_thread_execution_width(
&self,
value: bool,
);
#[unsafe(method(payloadMemoryLength))]
#[unsafe(method_family = none)]
pub fn payload_memory_length(&self) -> usize;
#[unsafe(method(setPayloadMemoryLength:))]
#[unsafe(method_family = none)]
pub fn set_payload_memory_length(
&self,
value: usize,
);
#[unsafe(method(maxTotalThreadgroupsPerMeshGrid))]
#[unsafe(method_family = none)]
pub fn max_total_threadgroups_per_mesh_grid(&self) -> usize;
#[unsafe(method(setMaxTotalThreadgroupsPerMeshGrid:))]
#[unsafe(method_family = none)]
pub fn set_max_total_threadgroups_per_mesh_grid(
&self,
value: usize,
);
#[unsafe(method(objectBuffers))]
#[unsafe(method_family = none)]
pub fn object_buffers(&self) -> Retained<MTLPipelineBufferDescriptorArray>;
#[unsafe(method(meshBuffers))]
#[unsafe(method_family = none)]
pub fn mesh_buffers(&self) -> Retained<MTLPipelineBufferDescriptorArray>;
#[unsafe(method(fragmentBuffers))]
#[unsafe(method_family = none)]
pub fn fragment_buffers(&self) -> Retained<MTLPipelineBufferDescriptorArray>;
#[unsafe(method(rasterSampleCount))]
#[unsafe(method_family = none)]
pub fn raster_sample_count(&self) -> usize;
#[unsafe(method(setRasterSampleCount:))]
#[unsafe(method_family = none)]
pub fn set_raster_sample_count(
&self,
value: usize,
);
#[unsafe(method(isAlphaToCoverageEnabled))]
#[unsafe(method_family = none)]
pub fn is_alpha_to_coverage_enabled(&self) -> bool;
#[unsafe(method(setAlphaToCoverageEnabled:))]
#[unsafe(method_family = none)]
pub fn set_alpha_to_coverage_enabled(
&self,
enabled: bool,
);
#[unsafe(method(isAlphaToOneEnabled))]
#[unsafe(method_family = none)]
pub fn is_alpha_to_one_enabled(&self) -> bool;
#[unsafe(method(setAlphaToOneEnabled:))]
#[unsafe(method_family = none)]
pub fn set_alpha_to_one_enabled(
&self,
enabled: bool,
);
#[unsafe(method(isRasterizationEnabled))]
#[unsafe(method_family = none)]
pub fn is_rasterization_enabled(&self) -> bool;
#[unsafe(method(setRasterizationEnabled:))]
#[unsafe(method_family = none)]
pub fn set_rasterization_enabled(
&self,
enabled: bool,
);
#[unsafe(method(maxVertexAmplificationCount))]
#[unsafe(method_family = none)]
pub fn max_vertex_amplification_count(&self) -> usize;
#[unsafe(method(setMaxVertexAmplificationCount:))]
#[unsafe(method_family = none)]
pub fn set_max_vertex_amplification_count(
&self,
value: usize,
);
#[unsafe(method(colorAttachments))]
#[unsafe(method_family = none)]
pub fn color_attachments(&self) -> Retained<MTLRenderPipelineColorAttachmentDescriptorArray>;
#[unsafe(method(depthAttachmentPixelFormat))]
#[unsafe(method_family = none)]
pub fn depth_attachment_pixel_format(&self) -> MTLPixelFormat;
#[unsafe(method(setDepthAttachmentPixelFormat:))]
#[unsafe(method_family = none)]
pub fn set_depth_attachment_pixel_format(
&self,
format: MTLPixelFormat,
);
#[unsafe(method(stencilAttachmentPixelFormat))]
#[unsafe(method_family = none)]
pub fn stencil_attachment_pixel_format(&self) -> MTLPixelFormat;
#[unsafe(method(setStencilAttachmentPixelFormat:))]
#[unsafe(method_family = none)]
pub fn set_stencil_attachment_pixel_format(
&self,
format: MTLPixelFormat,
);
#[unsafe(method(supportIndirectCommandBuffers))]
#[unsafe(method_family = none)]
pub fn support_indirect_command_buffers(&self) -> bool;
#[unsafe(method(setSupportIndirectCommandBuffers:))]
#[unsafe(method_family = none)]
pub fn set_support_indirect_command_buffers(
&self,
enabled: bool,
);
#[unsafe(method(objectLinkedFunctions))]
#[unsafe(method_family = none)]
pub fn object_linked_functions(&self) -> Retained<MTLLinkedFunctions>;
#[unsafe(method(setObjectLinkedFunctions:))]
#[unsafe(method_family = none)]
pub fn set_object_linked_functions(
&self,
functions: Option<&MTLLinkedFunctions>,
);
#[unsafe(method(meshLinkedFunctions))]
#[unsafe(method_family = none)]
pub fn mesh_linked_functions(&self) -> Retained<MTLLinkedFunctions>;
#[unsafe(method(setMeshLinkedFunctions:))]
#[unsafe(method_family = none)]
pub fn set_mesh_linked_functions(
&self,
functions: Option<&MTLLinkedFunctions>,
);
#[unsafe(method(fragmentLinkedFunctions))]
#[unsafe(method_family = none)]
pub fn fragment_linked_functions(&self) -> Retained<MTLLinkedFunctions>;
#[unsafe(method(setFragmentLinkedFunctions:))]
#[unsafe(method_family = none)]
pub fn set_fragment_linked_functions(
&self,
functions: Option<&MTLLinkedFunctions>,
);
#[unsafe(method(reset))]
#[unsafe(method_family = none)]
pub fn reset(&self);
#[unsafe(method(shaderValidation))]
#[unsafe(method_family = none)]
pub fn shader_validation(&self) -> MTLShaderValidation;
#[unsafe(method(setShaderValidation:))]
#[unsafe(method_family = none)]
pub fn set_shader_validation(
&self,
validation: MTLShaderValidation,
);
#[unsafe(method(requiredThreadsPerObjectThreadgroup))]
#[unsafe(method_family = none)]
pub fn required_threads_per_object_threadgroup(&self) -> MTLSize;
#[unsafe(method(setRequiredThreadsPerObjectThreadgroup:))]
#[unsafe(method_family = none)]
pub fn set_required_threads_per_object_threadgroup(
&self,
size: MTLSize,
);
#[unsafe(method(requiredThreadsPerMeshThreadgroup))]
#[unsafe(method_family = none)]
pub fn required_threads_per_mesh_threadgroup(&self) -> MTLSize;
#[unsafe(method(setRequiredThreadsPerMeshThreadgroup:))]
#[unsafe(method_family = none)]
pub fn set_required_threads_per_mesh_threadgroup(
&self,
size: MTLSize,
);
);
pub fn binary_archives(&self) -> Option<Box<[Retained<ProtocolObject<dyn MTLBinaryArchive>>]>> {
let archives: Option<Retained<NSArray<ProtocolObject<dyn MTLBinaryArchive>>>> =
unsafe { msg_send![self, binaryArchives] };
archives.map(|archives| archives.to_vec().into_boxed_slice())
}
pub fn set_binary_archives(
&self,
archives: Option<&[&ProtocolObject<dyn MTLBinaryArchive>]>,
) {
let archives = archives.map(NSArray::from_slice);
unsafe {
let _: () = msg_send![self, setBinaryArchives: archives.as_deref()];
}
}
pub fn label(&self) -> Option<String> {
let label: Option<Retained<NSString>> = unsafe { msg_send![self, label] };
label.map(|label| label.to_string())
}
pub fn set_label(
&self,
label: Option<&str>,
) {
unsafe {
let _: () = msg_send![self, setLabel: label.map(NSString::from_str).as_deref()];
}
}
}
impl MTLMeshRenderPipelineDescriptor {
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(test)]
mod tests {
use objc2::{rc::Retained, runtime::ProtocolObject};
use super::MTLMeshRenderPipelineDescriptor;
use crate::MTLBinaryArchive;
#[test]
fn collection_method_has_rust_native_signature() {
let _: fn(&MTLMeshRenderPipelineDescriptor) -> Option<Box<[Retained<ProtocolObject<dyn MTLBinaryArchive>>]>> =
MTLMeshRenderPipelineDescriptor::binary_archives;
}
}