1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
use crate::ffi::root::gli;
use crate::ffi::root::glm;
use crate::ffi::root::bindings::Texture2D as bindings;
use crate::format::Format;
use crate::target::Target;
use crate::image::GliImage;
use crate::texture::GliTexture;
use crate::texture::inner::TextureAccessible;
use crate::Extent2d;
#[repr(transparent)]
pub struct Texture2D {
ffi: gli::texture2d,
}
impl Texture2D {
#[inline]
pub fn new_empty() -> Texture2D {
Texture2D { ffi: unsafe { bindings::tex2d_new_empty() } }
}
#[inline]
pub fn new(format: Format, extent: Extent2d, levels: usize) -> Texture2D {
Texture2D { ffi: unsafe { bindings::tex2d_new_(format.0, glm::ivec2(extent.into()), levels) } }
}
#[inline]
pub fn new_with_mipmap_chain(format: Format, extent: Extent2d) -> Texture2D {
Texture2D { ffi: unsafe { bindings::tex2d_new_with_mipmap_chain(format.0, glm::ivec2(extent.into())) } }
}
#[inline]
pub fn share_from(texture: &impl GliTexture) -> Texture2D {
Texture2D { ffi: unsafe { bindings::tex2d_share_from(texture.raw_texture()) } }
}
#[inline]
pub fn share_from_detail(texture: &impl GliTexture, format: Format, base_layer: usize, max_layer: usize, base_face: usize, max_face: usize, base_level: usize, max_level: usize) -> Texture2D {
Texture2D {
ffi: unsafe { bindings::tex2d_share_from_detail(texture.raw_texture(), format.0, base_layer, max_layer, base_face, max_face, base_level, max_level) }
}
}
#[inline]
pub fn share_from_subset(texture: &Texture2D, base_level: usize, max_level: usize) -> Texture2D {
Texture2D { ffi: unsafe { bindings::tex2d_share_from_subset(&texture.ffi, base_level, max_level) } }
}
#[inline]
pub fn get_level(&self, level: usize) -> GliImage {
debug_assert!(level < self.levels());
GliImage::shared_from_texture(self, self.format(), self.base_layer(), self.base_face(), self.base_level() + level)
}
#[doc(hidden)]
#[inline]
pub(crate) fn raw_ffi(&self) -> &gli::texture2d {
&self.ffi
}
}
impl GliTexture for Texture2D {
const TARGET_TYPE: Target = Target::TARGET_2D;
type ExtentType = Extent2d;
}
impl TextureAccessible for Texture2D {
fn raw_texture(&self) -> &gli::texture {
&self.ffi._base
}
fn raw_texture_mut(&mut self) -> &mut gli::texture {
&mut self.ffi._base
}
}
impl From<gli::texture> for Texture2D {
fn from(ffi: gli::texture) -> Texture2D {
Texture2D { ffi: gli::texture2d { _base: ffi } }
}
}
impl std::cmp::PartialEq for Texture2D {
fn eq(&self, other: &Texture2D) -> bool {
use crate::ffi::root::bindings::Comparison::is_texture_equal;
unsafe {
is_texture_equal(self.raw_texture(), other.raw_texture())
}
}
fn ne(&self, other: &Texture2D) -> bool {
use crate::ffi::root::bindings::Comparison::is_texture_unequal;
unsafe {
is_texture_unequal(self.raw_texture(), other.raw_texture())
}
}
}
impl std::cmp::Eq for Texture2D {}