// Copyright 2016 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::*; /// Only available on macos(10.15), ios(13.0) #[repr(u64)] #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)] pub enum MTLHeapType { Automatic = 0, Placement = 1, /// Only available on macos(11.0), macCatalyst(14.0) Sparse = 2, } pub enum MTLHeap {} foreign_obj_type! { type CType = MTLHeap; pub struct Heap; pub struct HeapRef; } impl HeapRef { pub fn device(&self) -> &DeviceRef { unsafe { msg_send![self, device] } } pub fn label(&self) -> &str { unsafe { let label = msg_send![self, label]; crate::nsstring_as_str(label) } } pub fn set_label(&self, label: &str) { unsafe { let nslabel = crate::nsstring_from_str(label); let () = msg_send![self, setLabel: nslabel]; } } pub fn cpu_cache_mode(&self) -> MTLCPUCacheMode { unsafe { msg_send![self, cpuCacheMode] } } pub fn storage_mode(&self) -> MTLStorageMode { unsafe { msg_send![self, storageMode] } } /// Only available on macos(10.15), ios(13.0) pub fn hazard_tracking_mode(&self) -> MTLHazardTrackingMode { unsafe { msg_send![self, hazardTrackingMode] } } /// Only available on macos(10.15), ios(13.0) pub fn resource_options(&self) -> MTLResourceOptions { unsafe { msg_send![self, resourceOptions] } } pub fn set_purgeable_state(&self, state: MTLPurgeableState) -> MTLPurgeableState { unsafe { msg_send![self, setPurgeableState: state] } } pub fn size(&self) -> NSUInteger { unsafe { msg_send![self, size] } } pub fn used_size(&self) -> NSUInteger { unsafe { msg_send![self, usedSize] } } /// Only available on macos(10.15), ios(13.0) pub fn heap_type(&self) -> MTLHeapType { unsafe { msg_send![self, type] } } /// Only available on macos(10.13), ios(11.0) pub fn current_allocated_size(&self) -> NSUInteger { unsafe { msg_send![self, currentAllocatedSize] } } pub fn max_available_size_with_alignment(&self, alignment: NSUInteger) -> NSUInteger { unsafe { msg_send![self, maxAvailableSizeWithAlignment: alignment] } } pub fn new_buffer(&self, length: u64, options: MTLResourceOptions) -> Option { unsafe { let ptr: *mut MTLBuffer = msg_send![self, newBufferWithLength:length options:options]; if !ptr.is_null() { Some(Buffer::from_ptr(ptr)) } else { None } } } pub fn new_texture(&self, descriptor: &TextureDescriptorRef) -> Option { unsafe { let ptr: *mut MTLTexture = msg_send![self, newTextureWithDescriptor: descriptor]; if !ptr.is_null() { Some(Texture::from_ptr(ptr)) } else { None } } } /// Only available on macOS 10.15+ & iOS 13.0+ pub fn new_buffer_with_offset( &self, length: u64, options: MTLResourceOptions, offset: u64, ) -> Option { unsafe { let ptr: *mut MTLBuffer = msg_send![self, newBufferWithLength:length options:options offset:offset]; if !ptr.is_null() { Some(Buffer::from_ptr(ptr)) } else { None } } } /// Only available on macOS 10.15+ & iOS 13.0+ pub fn new_texture_with_offset( &self, descriptor: &TextureDescriptorRef, offset: u64, ) -> Option { unsafe { let ptr: *mut MTLTexture = msg_send![self, newTextureWithDescriptor:descriptor offset:offset]; if !ptr.is_null() { Some(Texture::from_ptr(ptr)) } else { None } } } } pub enum MTLHeapDescriptor {} foreign_obj_type! { type CType = MTLHeapDescriptor; pub struct HeapDescriptor; pub struct HeapDescriptorRef; } impl HeapDescriptor { pub fn new() -> Self { unsafe { let class = class!(MTLHeapDescriptor); msg_send![class, new] } } } impl HeapDescriptorRef { pub fn cpu_cache_mode(&self) -> MTLCPUCacheMode { unsafe { msg_send![self, cpuCacheMode] } } pub fn set_cpu_cache_mode(&self, mode: MTLCPUCacheMode) { unsafe { msg_send![self, setCpuCacheMode: mode] } } pub fn storage_mode(&self) -> MTLStorageMode { unsafe { msg_send![self, storageMode] } } pub fn set_storage_mode(&self, mode: MTLStorageMode) { unsafe { msg_send![self, setStorageMode: mode] } } pub fn size(&self) -> NSUInteger { unsafe { msg_send![self, size] } } pub fn set_size(&self, size: NSUInteger) { unsafe { msg_send![self, setSize: size] } } /// Only available on macos(10.15), ios(13.0) pub fn hazard_tracking_mode(&self) -> MTLHazardTrackingMode { unsafe { msg_send![self, hazardTrackingMode] } } /// Only available on macos(10.15), ios(13.0) pub fn resource_options(&self) -> MTLResourceOptions { unsafe { msg_send![self, resourceOptions] } } /// Only available on macos(10.15), ios(13.0) pub fn heap_type(&self) -> MTLHeapType { unsafe { msg_send![self, type] } } }