use objc2::{Message, extern_protocol, msg_send, rc::Retained, runtime::ProtocolObject};
use objc2_foundation::{NSObjectProtocol, NSString};
use crate::{
MTLBuffer, MTLDevice,
device::MTLSizeAndAlign,
types::{Coordinate2D, MTLSize},
};
extern_protocol!(
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(mapScreenToPhysicalCoordinates:forLayer:))]
#[unsafe(method_family = none)]
fn map_screen_to_physical_coordinates_for_layer(
&self,
screen_coordinates: Coordinate2D,
layer_index: usize,
) -> Coordinate2D;
#[unsafe(method(mapPhysicalToScreenCoordinates:forLayer:))]
#[unsafe(method_family = none)]
fn map_physical_to_screen_coordinates_for_layer(
&self,
physical_coordinates: Coordinate2D,
layer_index: usize,
) -> Coordinate2D;
}
);
#[allow(unused)]
pub trait MTLRasterizationRateMapExt: MTLRasterizationRateMap + Message {
fn label(&self) -> Option<String>;
}
impl MTLRasterizationRateMapExt for ProtocolObject<dyn MTLRasterizationRateMap> {
fn label(&self) -> Option<String> {
let s: Option<Retained<NSString>> = unsafe { msg_send![self, label] };
s.map(|s| s.to_string())
}
}