iron_oxide/resource/
texture.rs

1use crate::import_objc_macros::*;
2use crate::{
3    handle, DeviceCreated, MTLPixelFormat, MTLRegion, MTLResource, MTLResourceOptions, NSUInteger,
4    NSUIntegerRange, Object, ObjectPointer,
5};
6use enumflags2::BitFlags;
7use std::os::raw::c_void;
8
9#[repr(u64)]
10pub enum MTLTextureType {
11    D1 = 0,
12    D1Array = 1,
13    D2 = 2,
14    D2Array = 3,
15    D2Multisample = 4,
16    Cube = 5,
17    CubeArray = 6,
18    D3 = 7,
19    D2MultisampleArray = 8,
20    TextureBuffer = 9,
21}
22
23#[derive(BitFlags, Copy, Clone, Debug, PartialEq)]
24#[repr(u64)]
25pub enum MTLTextureUsage {
26    ShaderRead = 0x0001,
27    ShaderWrite = 0x0002,
28    RenderTarget = 0x004,
29    PixelFormatView = 0x0010,
30}
31
32pub struct MTLTextureDescriptor(ObjectPointer);
33handle!(MTLTextureDescriptor);
34
35impl MTLTextureDescriptor {
36    pub unsafe fn new() -> MTLTextureDescriptor {
37        MTLTextureDescriptor::from_ptr(msg_send![class!(MTLTextureDescriptor), new])
38    }
39    pub unsafe fn set_texture_type(&self, texture_type: MTLTextureType) {
40        msg_send![self.get_ptr(), setTextureType: texture_type]
41    }
42    pub unsafe fn set_pixel_format(&self, format: MTLPixelFormat) {
43        msg_send![self.get_ptr(), setPixelFormat: format]
44    }
45    pub unsafe fn set_width(&self, width: NSUInteger) {
46        msg_send![self.get_ptr(), setWidth: width]
47    }
48    pub unsafe fn set_height(&self, height: NSUInteger) {
49        msg_send![self.get_ptr(), setHeight: height]
50    }
51    pub unsafe fn set_depth(&self, depth: NSUInteger) {
52        msg_send![self.get_ptr(), setDepth: depth]
53    }
54    pub unsafe fn set_mipmap_level_count(&self, count: NSUInteger) {
55        msg_send![self.get_ptr(), setMipmapLevelCount: count]
56    }
57    pub unsafe fn set_sample_count(&self, count: NSUInteger) {
58        msg_send![self.get_ptr(), setSampleCount: count]
59    }
60    pub unsafe fn set_array_length(&self, length: NSUInteger) {
61        msg_send![self.get_ptr(), setArrayLength: length]
62    }
63    pub unsafe fn set_resource_options(&self, options: MTLResourceOptions) {
64        msg_send![self.get_ptr(), setResourceOptions:options.bits]
65    }
66    pub unsafe fn set_allow_gpu_optimized_contents(&self, allow: bool) {
67        msg_send![self.get_ptr(), setAllowGPUOptimizedContents: allow]
68    }
69    pub unsafe fn set_usage(&self, usage: BitFlags<MTLTextureUsage>) {
70        msg_send![self.get_ptr(), setUsage: usage.bits()]
71    }
72}
73
74impl Object for MTLTextureDescriptor {
75    unsafe fn from_ptr(ptr: ObjectPointer) -> Self
76    where
77        Self: Sized,
78    {
79        MTLTextureDescriptor(ptr)
80    }
81
82    fn get_ptr(&self) -> ObjectPointer {
83        self.0
84    }
85}
86
87pub struct MTLTexture(ObjectPointer);
88handle!(MTLTexture);
89
90impl MTLTexture {
91    pub unsafe fn replace_region(
92        &self,
93        region: MTLRegion,
94        mipmap_level: NSUInteger,
95        slice: NSUInteger,
96        bytes: *const c_void,
97        bytes_per_row: NSUInteger,
98        bytes_per_image: NSUInteger,
99    ) {
100        msg_send![
101            self.get_ptr(),
102            replaceRegion:region
103            mipmapLevel:mipmap_level
104            slice:slice
105            withBytes:bytes
106            bytesPerRow:bytes_per_row
107            bytesPerImage:bytes_per_image
108        ]
109    }
110    pub unsafe fn get_bytes(
111        &self,
112        to_write: *mut c_void,
113        bytes_per_row: NSUInteger,
114        bytes_per_image: NSUInteger,
115        region: MTLRegion,
116        mipmap_level: NSUInteger,
117        slice: NSUInteger,
118    ) {
119        msg_send![
120            self.get_ptr(),
121            getBytes:to_write
122            bytesPerRow:bytes_per_row
123            bytesPerImage:bytes_per_image
124            fromRegion:region
125            mipmapLevel:mipmap_level
126            slice:slice
127        ]
128    }
129    pub unsafe fn new_texture_view_with_pixel_format(&self, format: MTLPixelFormat) -> MTLTexture {
130        MTLTexture::from_ptr(msg_send![
131            self.get_ptr(),
132            newTextureViewWithPixelFormat: format
133        ])
134    }
135    pub unsafe fn new_texture_view_with_pixel_format_and_texture_type(
136        &self,
137        format: MTLPixelFormat,
138        texture_type: MTLTextureType,
139        levels: NSUIntegerRange,
140        slices: NSUIntegerRange,
141    ) -> MTLTexture {
142        MTLTexture::from_ptr(msg_send![
143            self.get_ptr(),
144            newTextureViewWithPixelFormat:format
145            textureType:texture_type
146            levels:levels
147            slices:slices
148        ])
149    }
150}
151
152impl MTLResource for MTLTexture {}
153
154impl DeviceCreated for MTLTexture {}
155
156impl Object for MTLTexture {
157    unsafe fn from_ptr(ptr: ObjectPointer) -> Self
158    where
159        Self: Sized,
160    {
161        MTLTexture(ptr)
162    }
163
164    fn get_ptr(&self) -> ObjectPointer {
165        self.0
166    }
167}