iron_oxide/resource/
texture.rs1use 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}