1 // Copyright 2016 GFX developers
2 //
3 // Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or
4 // http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
5 // http://opensource.org/licenses/MIT>, at your option. This file may not be
6 // copied, modified, or distributed except according to those terms.
7 
8 use super::{depthstencil::MTLCompareFunction, DeviceRef, NSUInteger};
9 
10 #[repr(u64)]
11 #[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)]
12 pub enum MTLSamplerMinMagFilter {
13     Nearest = 0,
14     Linear = 1,
15 }
16 
17 #[repr(u64)]
18 #[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)]
19 pub enum MTLSamplerMipFilter {
20     NotMipmapped = 0,
21     Nearest = 1,
22     Linear = 2,
23 }
24 
25 #[repr(u64)]
26 #[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)]
27 pub enum MTLSamplerAddressMode {
28     ClampToEdge = 0,
29     MirrorClampToEdge = 1,
30     Repeat = 2,
31     MirrorRepeat = 3,
32     ClampToZero = 4,
33     ClampToBorderColor = 5,
34 }
35 
36 #[repr(u64)]
37 #[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)]
38 pub enum MTLSamplerBorderColor {
39     TransparentBlack = 0,
40     OpaqueBlack = 1,
41     OpaqueWhite = 2,
42 }
43 
44 pub enum MTLSamplerDescriptor {}
45 
46 foreign_obj_type! {
47     type CType = MTLSamplerDescriptor;
48     pub struct SamplerDescriptor;
49     pub struct SamplerDescriptorRef;
50 }
51 
52 impl SamplerDescriptor {
new() -> Self53     pub fn new() -> Self {
54         unsafe {
55             let class = class!(MTLSamplerDescriptor);
56             msg_send![class, new]
57         }
58     }
59 }
60 
61 impl SamplerDescriptorRef {
set_min_filter(&self, filter: MTLSamplerMinMagFilter)62     pub fn set_min_filter(&self, filter: MTLSamplerMinMagFilter) {
63         unsafe { msg_send![self, setMinFilter: filter] }
64     }
65 
set_mag_filter(&self, filter: MTLSamplerMinMagFilter)66     pub fn set_mag_filter(&self, filter: MTLSamplerMinMagFilter) {
67         unsafe { msg_send![self, setMagFilter: filter] }
68     }
69 
set_mip_filter(&self, filter: MTLSamplerMipFilter)70     pub fn set_mip_filter(&self, filter: MTLSamplerMipFilter) {
71         unsafe { msg_send![self, setMipFilter: filter] }
72     }
73 
set_address_mode_s(&self, mode: MTLSamplerAddressMode)74     pub fn set_address_mode_s(&self, mode: MTLSamplerAddressMode) {
75         unsafe { msg_send![self, setSAddressMode: mode] }
76     }
77 
set_address_mode_t(&self, mode: MTLSamplerAddressMode)78     pub fn set_address_mode_t(&self, mode: MTLSamplerAddressMode) {
79         unsafe { msg_send![self, setTAddressMode: mode] }
80     }
81 
set_address_mode_r(&self, mode: MTLSamplerAddressMode)82     pub fn set_address_mode_r(&self, mode: MTLSamplerAddressMode) {
83         unsafe { msg_send![self, setRAddressMode: mode] }
84     }
85 
set_max_anisotropy(&self, anisotropy: NSUInteger)86     pub fn set_max_anisotropy(&self, anisotropy: NSUInteger) {
87         unsafe { msg_send![self, setMaxAnisotropy: anisotropy] }
88     }
89 
set_compare_function(&self, func: MTLCompareFunction)90     pub fn set_compare_function(&self, func: MTLCompareFunction) {
91         unsafe { msg_send![self, setCompareFunction: func] }
92     }
93 
94     #[cfg(feature = "private")]
set_lod_bias(&self, bias: f32)95     pub unsafe fn set_lod_bias(&self, bias: f32) {
96         msg_send![self, setLodBias: bias]
97     }
98 
set_lod_min_clamp(&self, clamp: f32)99     pub fn set_lod_min_clamp(&self, clamp: f32) {
100         unsafe { msg_send![self, setLodMinClamp: clamp] }
101     }
102 
set_lod_max_clamp(&self, clamp: f32)103     pub fn set_lod_max_clamp(&self, clamp: f32) {
104         unsafe { msg_send![self, setLodMaxClamp: clamp] }
105     }
106 
set_lod_average(&self, enable: bool)107     pub fn set_lod_average(&self, enable: bool) {
108         unsafe { msg_send![self, setLodAverage: enable] }
109     }
110 
set_normalized_coordinates(&self, enable: bool)111     pub fn set_normalized_coordinates(&self, enable: bool) {
112         unsafe { msg_send![self, setNormalizedCoordinates: enable] }
113     }
114 
set_support_argument_buffers(&self, enable: bool)115     pub fn set_support_argument_buffers(&self, enable: bool) {
116         unsafe { msg_send![self, setSupportArgumentBuffers: enable] }
117     }
118 
set_border_color(&self, color: MTLSamplerBorderColor)119     pub fn set_border_color(&self, color: MTLSamplerBorderColor) {
120         unsafe { msg_send![self, setBorderColor: color] }
121     }
122 
label(&self) -> &str123     pub fn label(&self) -> &str {
124         unsafe {
125             let label = msg_send![self, label];
126             crate::nsstring_as_str(label)
127         }
128     }
129 
set_label(&self, label: &str)130     pub fn set_label(&self, label: &str) {
131         unsafe {
132             let nslabel = crate::nsstring_from_str(label);
133             let () = msg_send![self, setLabel: nslabel];
134         }
135     }
136 }
137 
138 pub enum MTLSamplerState {}
139 
140 foreign_obj_type! {
141     type CType = MTLSamplerState;
142     pub struct SamplerState;
143     pub struct SamplerStateRef;
144 }
145 
146 impl SamplerStateRef {
device(&self) -> &DeviceRef147     pub fn device(&self) -> &DeviceRef {
148         unsafe { msg_send![self, device] }
149     }
150 
label(&self) -> &str151     pub fn label(&self) -> &str {
152         unsafe {
153             let label = msg_send![self, label];
154             crate::nsstring_as_str(label)
155         }
156     }
157 }
158