diff --git a/src/capturedescriptor.rs b/src/capturedescriptor.rs new file mode 100644 index 00000000..ac36a925 --- /dev/null +++ b/src/capturedescriptor.rs @@ -0,0 +1,79 @@ +// Copyright 2020 GFX developers +// +// Licensed under the Apache License, Version 2.0, or the MIT license , at your option. This file may not be +// copied, modified, or distributed except according to those terms. + +use super::*; + +use std::path::Path; + +/// https://developer.apple.com/documentation/metal/mtlcapturedestination?language=objc +#[repr(u64)] +#[allow(non_camel_case_types)] +#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)] +pub enum MTLCaptureDestination { + DeveloperTools = 1, + GpuTraceDocument = 2, +} + +/// https://developer.apple.com/documentation/metal/mtlcapturedescriptor +pub enum MTLCaptureDescriptor {} + +foreign_obj_type! { + type CType = MTLCaptureDescriptor; + pub struct CaptureDescriptor; + pub struct CaptureDescriptorRef; +} + +impl CaptureDescriptor { + pub fn new() -> CaptureDescriptor { + unsafe { + let class = class!(MTLCaptureDescriptor); + msg_send![class, new] + } + } +} + +impl CaptureDescriptorRef { + /// https://developer.apple.com/documentation/metal/mtlcapturedescriptor/3237248-captureobject + pub fn set_capture_device(&self, device: &DeviceRef) { + unsafe { msg_send![self, setCaptureObject: device] } + } + + /// https://developer.apple.com/documentation/metal/mtlcapturedescriptor/3237248-captureobject + pub fn set_capture_scope(&self, scope: &CaptureScopeRef) { + unsafe { msg_send![self, setCaptureObject: scope] } + } + + /// https://developer.apple.com/documentation/metal/mtlcapturedescriptor/3237248-captureobject + pub fn set_capture_command_queue(&self, command_queue: &CommandQueueRef) { + unsafe { msg_send![self, setCaptureObject: command_queue] } + } + + /// https://developer.apple.com/documentation/metal/mtlcapturedescriptor/3237250-outputurl + pub fn output_url(&self) -> &Path { + let output_url = unsafe { msg_send![self, outputURL] }; + let output_url = nsstring_as_str(output_url); + + Path::new(output_url) + } + + /// https://developer.apple.com/documentation/metal/mtlcapturedescriptor/3237250-outputurl + pub fn set_output_url>(&self, output_url: P) { + let output_url = nsstring_from_str(output_url.as_ref().to_str().unwrap()); + + unsafe { msg_send![self, setOutputURL: output_url] } + } + + /// https://developer.apple.com/documentation/metal/mtlcapturedescriptor?language=objc + pub fn destination(&self) -> MTLCaptureDestination { + unsafe { msg_send![self, destination] } + } + + /// https://developer.apple.com/documentation/metal/mtlcapturedescriptor?language=objc + pub fn set_destination(&self, destination: MTLCaptureDestination) { + unsafe { msg_send![self, setDestination: destination] } + } +} diff --git a/src/capturemanager.rs b/src/capturemanager.rs index 24174d9b..95180c42 100644 --- a/src/capturemanager.rs +++ b/src/capturemanager.rs @@ -6,6 +6,7 @@ // copied, modified, or distributed except according to those terms. use super::*; +use std::ffi::CStr; pub enum MTLCaptureScope {} @@ -69,6 +70,16 @@ impl CaptureManagerRef { unsafe { msg_send![self, setDefaultCaptureScope: scope] } } + /// https://developer.apple.com/documentation/metal/mtlcapturemanager/3237259-startcapture + pub fn start_capture(&self, descriptor: &CaptureDescriptorRef) -> Result<(), String> { + unsafe { + try_objc! { err => + msg_send![self, startCaptureWithDescriptor: descriptor + error: &mut err] + } + } + } + pub fn start_capture_with_device(&self, device: &DeviceRef) { unsafe { msg_send![self, startCaptureWithDevice: device] } } @@ -88,4 +99,9 @@ impl CaptureManagerRef { pub fn is_capturing(&self) -> bool { unsafe { msg_send![self, isCapturing] } } + + /// https://developer.apple.com/documentation/metal/mtlcapturemanager/3237260-supportsdestination?language=objc + pub fn supports_destination(&self, destination: MTLCaptureDestination) -> bool { + unsafe { msg_send![self, supportsDestination: destination] } + } } diff --git a/src/lib.rs b/src/lib.rs index 2ef4ddce..de8b9b57 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -358,6 +358,7 @@ impl CoreAnimationLayerRef { mod argument; mod buffer; +mod capturedescriptor; mod capturemanager; mod commandbuffer; mod commandqueue; @@ -381,6 +382,7 @@ mod vertexdescriptor; pub use { argument::*, buffer::*, + capturedescriptor::*, capturemanager::*, commandbuffer::*, commandqueue::*,