use objc2::{Message, extern_protocol, msg_send, rc::Retained, runtime::ProtocolObject};
use objc2_foundation::{NSObjectProtocol, NSString};
use crate::{MTLBuffer, MTLCoordinate2D, MTLDevice, device::MTLSizeAndAlign, types::MTLSize};
extern_protocol!(
#[expect(
clippy::missing_safety_doc,
reason = "extern_protocol does not attach this safety section to its generated unsafe trait"
)]
pub unsafe trait MTLRasterizationRateMap: NSObjectProtocol + Send + Sync {
#[unsafe(method(device))]
#[unsafe(method_family = none)]
fn device(&self) -> Retained<ProtocolObject<dyn MTLDevice>>;
#[unsafe(method(screenSize))]
#[unsafe(method_family = none)]
fn screen_size(&self) -> MTLSize;
#[unsafe(method(physicalGranularity))]
#[unsafe(method_family = none)]
fn physical_granularity(&self) -> MTLSize;
#[unsafe(method(layerCount))]
#[unsafe(method_family = none)]
fn layer_count(&self) -> usize;
#[unsafe(method(parameterBufferSizeAndAlign))]
#[unsafe(method_family = none)]
fn parameter_buffer_size_and_align(&self) -> MTLSizeAndAlign;
#[unsafe(method(copyParameterDataToBuffer:offset:))]
#[unsafe(method_family = none)]
fn copy_parameter_data_to_buffer_offset(
&self,
buffer: &ProtocolObject<dyn MTLBuffer>,
offset: usize,
);
#[unsafe(method(physicalSizeForLayer:))]
#[unsafe(method_family = none)]
fn physical_size_for_layer(
&self,
layer_index: usize,
) -> MTLSize;
#[unsafe(method(mapScreenToPhysicalCoordinates:forLayer:))]
#[unsafe(method_family = none)]
fn map_screen_to_physical_coordinates_for_layer(
&self,
screen_coordinates: MTLCoordinate2D,
layer_index: usize,
) -> MTLCoordinate2D;
#[unsafe(method(mapPhysicalToScreenCoordinates:forLayer:))]
#[unsafe(method_family = none)]
fn map_physical_to_screen_coordinates_for_layer(
&self,
physical_coordinates: MTLCoordinate2D,
layer_index: usize,
) -> MTLCoordinate2D;
}
);
pub trait MTLRasterizationRateMapExt: MTLRasterizationRateMap + Message {
fn label(&self) -> Option<String>
where
Self: Sized,
{
let label: Option<Retained<NSString>> = unsafe { msg_send![self, label] };
label.map(|label| label.to_string())
}
}
impl<T: MTLRasterizationRateMap + Message> MTLRasterizationRateMapExt for T {}