From 2873ea71916810cef7ce69f079116151ea0afab3 Mon Sep 17 00:00:00 2001 From: Adam Nemecek Date: Fri, 2 Oct 2020 17:26:13 -0700 Subject: [PATCH 1/2] added CAMetalLayer methods --- src/lib.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 1f1d7459..99fd6b88 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -316,6 +316,10 @@ impl MetalLayerRef { unsafe { msg_send![self, setDevice: device] } } + pub fn preferred_device(&self) -> &DeviceRef { + unsafe { msg_send![self, preferredDevice] } + } + pub fn pixel_format(&self) -> MTLPixelFormat { unsafe { msg_send![self, pixelFormat] } } @@ -346,6 +350,20 @@ impl MetalLayerRef { unsafe { msg_send![self, setPresentsWithTransaction: transaction] } } + pub fn display_sync_enabled(&self) -> bool { + unsafe { + match msg_send![self, displaySyncEnabled] { + YES => true, + NO => false, + _ => unreachable!(), + } + } + } + + pub fn set_display_sync_enabled(&self, sync_enabled: bool) { + unsafe { msg_send![self, setDisplaySyncEnabled: sync_enabled] } + } + pub fn set_edge_antialiasing_mask(&self, mask: u64) { unsafe { msg_send![self, setEdgeAntialiasingMask: mask] } } From a146870ea45afcc1aa82ce580e7941f59d3971b3 Mon Sep 17 00:00:00 2001 From: Adam Nemecek Date: Fri, 2 Oct 2020 18:04:50 -0700 Subject: [PATCH 2/2] moved unsafe into function bodies --- src/device.rs | 16 ++++++++++------ src/lib.rs | 12 ++++++------ src/library.rs | 12 ++++++------ src/pipeline/render.rs | 32 ++++++++++++++++++-------------- src/sampler.rs | 4 ++-- src/sync.rs | 14 ++++++++------ src/vertexdescriptor.rs | 4 ++-- 7 files changed, 52 insertions(+), 42 deletions(-) diff --git a/src/device.rs b/src/device.rs index f39d797b..61a84492 100644 --- a/src/device.rs +++ b/src/device.rs @@ -1426,15 +1426,19 @@ impl DeviceRef { } #[cfg(feature = "private")] - pub unsafe fn vendor(&self) -> &str { - let name = msg_send![self, vendorName]; - crate::nsstring_as_str(name) + pub fn vendor(&self) -> &str { + unsafe { + let name = msg_send![self, vendorName]; + crate::nsstring_as_str(name) + } } #[cfg(feature = "private")] - pub unsafe fn family_name(&self) -> &str { - let name = msg_send![self, familyName]; - crate::nsstring_as_str(name) + pub fn family_name(&self) -> &str { + unsafe { + let name = msg_send![self, familyName]; + crate::nsstring_as_str(name) + } } pub fn registry_id(&self) -> u64 { diff --git a/src/lib.rs b/src/lib.rs index 99fd6b88..1624f5b2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -224,8 +224,8 @@ where type CType = NSArray; type Ref = ArrayRef; - unsafe fn from_ptr(p: *mut NSArray) -> Self { - Array(p) + fn from_ptr(p: *mut NSArray) -> Self { + unsafe { Array(p) } } fn as_ptr(&self) -> *mut NSArray { @@ -469,13 +469,13 @@ pub use { pub use mps::*; #[inline] -unsafe fn obj_drop(p: *mut T) { - msg_send![(p as *mut Object), release] +fn obj_drop(p: *mut T) { + unsafe { msg_send![(p as *mut Object), release] } } #[inline] -unsafe fn obj_clone(p: *mut T) -> *mut T { - msg_send![(p as *mut Object), retain] +fn obj_clone(p: *mut T) -> *mut T { + unsafe { msg_send![(p as *mut Object), retain] } } #[allow(non_camel_case_types)] diff --git a/src/library.rs b/src/library.rs index 6a8df76b..78ca7f67 100644 --- a/src/library.rs +++ b/src/library.rs @@ -121,13 +121,13 @@ impl FunctionConstantValues { } impl FunctionConstantValuesRef { - pub unsafe fn set_constant_value_at_index( + pub fn set_constant_value_at_index( &self, index: NSUInteger, ty: MTLDataType, value: *const std::os::raw::c_void, ) { - msg_send![self, setConstantValue:value type:ty atIndex:index] + unsafe { msg_send![self, setConstantValue:value type:ty atIndex:index] } } } @@ -149,12 +149,12 @@ impl CompileOptions { } impl CompileOptionsRef { - pub unsafe fn preprocessor_defines(&self) -> *mut Object { - msg_send![self, preprocessorMacros] + pub fn preprocessor_defines(&self) -> *mut Object { + unsafe { msg_send![self, preprocessorMacros] } } - pub unsafe fn set_preprocessor_defines(&self, defines: *mut Object) { - msg_send![self, setPreprocessorMacros: defines] + pub fn set_preprocessor_defines(&self, defines: *mut Object) { + unsafe { msg_send![self, setPreprocessorMacros: defines] } } pub fn is_fast_math_enabled(&self) -> bool { diff --git a/src/pipeline/render.rs b/src/pipeline/render.rs index a8038a13..7e21adc9 100644 --- a/src/pipeline/render.rs +++ b/src/pipeline/render.rs @@ -163,7 +163,7 @@ foreign_obj_type! { impl RenderPipelineReflection { #[cfg(feature = "private")] - pub unsafe fn new( + pub fn new( vertex_data: *mut std::ffi::c_void, fragment_data: *mut std::ffi::c_void, vertex_desc: *mut std::ffi::c_void, @@ -171,18 +171,20 @@ impl RenderPipelineReflection { options: u64, flags: u64, ) -> Self { - let class = class!(MTLRenderPipelineReflection); - let this: RenderPipelineReflection = msg_send![class, alloc]; - let this_alias: *mut Object = msg_send![this.as_ref(), initWithVertexData:vertex_data + unsafe { + let class = class!(MTLRenderPipelineReflection); + let this: RenderPipelineReflection = msg_send![class, alloc]; + let this_alias: *mut Object = msg_send![this.as_ref(), initWithVertexData:vertex_data fragmentData:fragment_data serializedVertexDescriptor:vertex_desc device:device options:options flags:flags]; - if this_alias.is_null() { - panic!("[MTLRenderPipelineReflection init] failed"); + if this_alias.is_null() { + panic!("[MTLRenderPipelineReflection init] failed"); + } + this } - this } } @@ -339,17 +341,19 @@ impl RenderPipelineDescriptorRef { } #[cfg(feature = "private")] - pub unsafe fn serialize_vertex_data(&self) -> *mut std::ffi::c_void { - use std::ptr; - let flags = 0; - let err: *mut Object = ptr::null_mut(); - msg_send![self, newSerializedVertexDataWithFlags:flags + pub fn serialize_vertex_data(&self) -> *mut std::ffi::c_void { + unsafe { + use std::ptr; + let flags = 0; + let err: *mut Object = ptr::null_mut(); + msg_send![self, newSerializedVertexDataWithFlags:flags error:err] + } } #[cfg(feature = "private")] - pub unsafe fn serialize_fragment_data(&self) -> *mut std::ffi::c_void { - msg_send![self, serializeFragmentData] + pub fn serialize_fragment_data(&self) -> *mut std::ffi::c_void { + unsafe { msg_send![self, serializeFragmentData] } } pub fn support_indirect_command_buffers(&self) -> bool { diff --git a/src/sampler.rs b/src/sampler.rs index d63eacb0..9f82132d 100644 --- a/src/sampler.rs +++ b/src/sampler.rs @@ -95,8 +95,8 @@ impl SamplerDescriptorRef { } #[cfg(feature = "private")] - pub unsafe fn set_lod_bias(&self, bias: f32) { - msg_send![self, setLodBias: bias] + pub fn set_lod_bias(&self, bias: f32) { + unsafe { msg_send![self, setLodBias: bias] } } pub fn set_lod_min_clamp(&self, clamp: f32) { diff --git a/src/sync.rs b/src/sync.rs index de3d7afb..b0c98da7 100644 --- a/src/sync.rs +++ b/src/sync.rs @@ -90,13 +90,15 @@ foreign_obj_type! { } impl SharedEventListener { - pub unsafe fn from_queue_handle(queue: dispatch_queue_t) -> Self { - let listener: SharedEventListener = msg_send![class!(MTLSharedEventListener), alloc]; - let ptr: *mut Object = msg_send![listener.as_ref(), initWithDispatchQueue: queue]; - if ptr.is_null() { - panic!("[MTLSharedEventListener alloc] initWithDispatchQueue failed"); + pub fn from_queue_handle(queue: dispatch_queue_t) -> Self { + unsafe { + let listener: SharedEventListener = msg_send![class!(MTLSharedEventListener), alloc]; + let ptr: *mut Object = msg_send![listener.as_ref(), initWithDispatchQueue: queue]; + if ptr.is_null() { + panic!("[MTLSharedEventListener alloc] initWithDispatchQueue failed"); + } + listener } - listener } #[cfg(feature = "dispatch-queue")] diff --git a/src/vertexdescriptor.rs b/src/vertexdescriptor.rs index 5fba52f6..946e8441 100644 --- a/src/vertexdescriptor.rs +++ b/src/vertexdescriptor.rs @@ -238,8 +238,8 @@ impl VertexDescriptorRef { } #[cfg(feature = "private")] - pub unsafe fn serialize_descriptor(&self) -> *mut std::ffi::c_void { - msg_send![self, newSerializedDescriptor] + pub fn serialize_descriptor(&self) -> *mut std::ffi::c_void { + unsafe { msg_send![self, newSerializedDescriptor] } } pub fn reset(&self) {