use objc2::{Message, extern_protocol, msg_send, rc::Retained, runtime::ProtocolObject};
use objc2_foundation::{NSObjectProtocol, NSString};
use crate::{MTLComputeCommandEncoder, MTLDevice, MTLRenderCommandEncoder, MTLRenderStages};
extern_protocol!(
pub unsafe trait MTLCommandEncoder: NSObjectProtocol {
#[unsafe(method(device))]
#[unsafe(method_family = none)]
fn device(&self) -> Retained<ProtocolObject<dyn MTLDevice>>;
#[unsafe(method(endEncoding))]
#[unsafe(method_family = none)]
fn end_encoding(&self);
#[unsafe(method(barrierAfterQueueStages:beforeStages:))]
#[unsafe(method_family = none)]
fn barrier_after_queue_stages_before_stages(
&self,
after_queue_stages: MTLRenderStages,
before_stages: MTLRenderStages,
);
}
);
#[allow(unused)]
pub trait MTLCommandEncoderExt: MTLCommandEncoder + Message {
fn device(&self) -> Retained<ProtocolObject<dyn MTLDevice>>;
fn label(&self) -> Option<String>;
fn set_label(
&self,
label: Option<&str>,
);
fn insert_debug_signpost(
&self,
string: &str,
);
fn push_debug_group(
&self,
string: &str,
);
fn pop_debug_group(&self);
}
impl MTLCommandEncoderExt for ProtocolObject<dyn MTLCommandEncoder> {
fn device(&self) -> Retained<ProtocolObject<dyn MTLDevice>> {
unsafe { msg_send![self, device] }
}
fn label(&self) -> Option<String> {
let label: Option<Retained<NSString>> = unsafe { msg_send![self, label] };
label.map(|s| s.to_string())
}
fn set_label(
&self,
label: Option<&str>,
) {
unsafe {
let _: () = msg_send![self, setLabel: label.map(NSString::from_str).as_deref()];
}
}
fn insert_debug_signpost(
&self,
string: &str,
) {
unsafe {
let _: () = msg_send![self, insertDebugSignpost: &*NSString::from_str(string)];
}
}
fn push_debug_group(
&self,
string: &str,
) {
unsafe {
let _: () = msg_send![self, pushDebugGroup: &*NSString::from_str(string)];
}
}
fn pop_debug_group(&self) {
unsafe {
let _: () = msg_send![self, popDebugGroup];
}
}
}
impl MTLCommandEncoderExt for ProtocolObject<dyn MTLComputeCommandEncoder> {
fn device(&self) -> Retained<ProtocolObject<dyn MTLDevice>> {
unsafe { msg_send![self, device] }
}
fn label(&self) -> Option<String> {
let label: Option<Retained<NSString>> = unsafe { msg_send![self, label] };
label.map(|s| s.to_string())
}
fn set_label(
&self,
label: Option<&str>,
) {
unsafe {
let _: () = msg_send![self, setLabel: label.map(NSString::from_str).as_deref()];
}
}
fn insert_debug_signpost(
&self,
string: &str,
) {
unsafe {
let _: () = msg_send![self, insertDebugSignpost: &*NSString::from_str(string)];
}
}
fn push_debug_group(
&self,
string: &str,
) {
unsafe {
let _: () = msg_send![self, pushDebugGroup: &*NSString::from_str(string)];
}
}
fn pop_debug_group(&self) {
unsafe {
let _: () = msg_send![self, popDebugGroup];
}
}
}
impl MTLCommandEncoderExt for ProtocolObject<dyn MTLRenderCommandEncoder> {
fn device(&self) -> Retained<ProtocolObject<dyn MTLDevice>> {
unsafe { msg_send![self, device] }
}
fn label(&self) -> Option<String> {
let label: Option<Retained<NSString>> = unsafe { msg_send![self, label] };
label.map(|s| s.to_string())
}
fn set_label(
&self,
label: Option<&str>,
) {
unsafe {
let _: () = msg_send![self, setLabel: label.map(NSString::from_str).as_deref()];
}
}
fn insert_debug_signpost(
&self,
string: &str,
) {
unsafe {
let _: () = msg_send![self, insertDebugSignpost: &*NSString::from_str(string)];
}
}
fn push_debug_group(
&self,
string: &str,
) {
unsafe {
let _: () = msg_send![self, pushDebugGroup: &*NSString::from_str(string)];
}
}
fn pop_debug_group(&self) {
unsafe {
let _: () = msg_send![self, popDebugGroup];
}
}
}