pub use self::t1d::Texture1D;
pub use self::t2d::Texture2D;
pub use self::t3d::Texture3D;
pub use self::t1d_array::Texture1DArray;
pub use self::t2d_array::Texture2DArray;
pub use self::tcube::TextureCube;
pub use self::tcube_array::TextureCubeArray;
mod t1d;
mod t2d;
mod t3d;
mod t1d_array;
mod t2d_array;
mod tcube;
mod tcube_array;
use std::os::raw::c_void;
use crate::ffi::root::bindings::Texture as bindings;
use crate::format::{Format, Swizzles};
use crate::target::Target;
use crate::Extent3d;
#[cfg(not(feature = "rc_debug"))]
pub(crate) mod inner {
use crate::ffi::root::gli::texture as RawTexture;
pub trait TextureAccessible: From<RawTexture> {
fn raw_texture(&self) -> &RawTexture;
fn raw_texture_mut(&mut self) -> &mut RawTexture;
}
}
#[cfg(feature = "rc_debug")]
pub mod inner {
use crate::ffi::root::gli::texture as RawTexture;
pub trait TextureAccessible: From<RawTexture> {
fn raw_texture(&self) -> &RawTexture;
fn raw_texture_mut(&mut self) -> &mut RawTexture;
}
}
pub trait GliTexture: inner::TextureAccessible + Sized + PartialEq + Eq {
const TARGET_TYPE: Target;
type ExtentType: From<[u32; 3]>;
fn extent(&self, level: usize) -> Self::ExtentType {
unsafe { bindings::texture_extent(self.raw_texture(), level).into() }
}
fn set_swizzles(&mut self, swizzles: Swizzles) {
self.raw_texture_mut().Swizzles = swizzles;
}
fn base_face(&self) -> usize {
unsafe { bindings::texture_base_face(self.raw_texture()) }
}
fn base_layer(&self) -> usize {
unsafe { bindings::texture_base_layer(self.raw_texture()) }
}
fn base_level(&self) -> usize {
unsafe { bindings::texture_base_level(self.raw_texture()) }
}
fn clear(&mut self) {
unsafe { bindings::texture_clear(self.raw_texture_mut()) }
}
fn copy(&mut self, src_texture: &Self, src_layer: usize, src_face: usize, src_level: usize, dst_layer: usize, dst_face: usize, dst_level: usize) {
unsafe {
bindings::texture_copy(
self.raw_texture_mut(), src_texture.raw_texture(), src_layer, src_face, src_level, dst_layer, dst_face, dst_level)
}
}
fn copy_subset(&mut self, src_texture: &Self, src_layer: usize, src_face: usize, src_level: usize, src_offset: Extent3d, dst_layer: usize, dst_face: usize, dst_level: usize, dst_offset: Extent3d, extent: Extent3d) {
unsafe {
bindings::texture_copy_subset(
self.raw_texture_mut(), src_texture.raw_texture(), src_layer, src_face, src_level, &src_offset.into(), dst_layer, dst_face, dst_level, &dst_offset.into(), &extent.into())
}
}
fn data(&self) -> *const c_void {
unsafe { bindings::texture_data(self.raw_texture()) }
}
fn data_mut(&mut self) -> *mut c_void {
unsafe { bindings::texture_data_mut(self.raw_texture_mut()) }
}
fn empty(&self) -> bool {
unsafe { bindings::texture_empty(self.raw_texture()) }
}
fn faces(&self) -> usize {
unsafe { bindings::texture_faces(self.raw_texture()) }
}
fn format(&self) -> Format {
let format = unsafe { bindings::texture_format(self.raw_texture()) };
Format(format)
}
fn layers(&self) -> usize {
unsafe { bindings::texture_layers(self.raw_texture()) }
}
fn levels(&self) -> usize {
unsafe { bindings::texture_levels(self.raw_texture()) }
}
fn max_face(&self) -> usize {
unsafe { bindings::texture_max_face(self.raw_texture()) }
}
fn max_layer(&self) -> usize {
unsafe { bindings::texture_max_layer(self.raw_texture()) }
}
fn max_level(&self) -> usize {
unsafe { bindings::texture_max_level(self.raw_texture()) }
}
fn size(&self) -> usize {
unsafe { bindings::texture_size(self.raw_texture()) }
}
fn size_at_level(&self, level: usize) -> usize {
unsafe { bindings::texture_size_level(self.raw_texture(), level) }
}
fn target(&self) -> Target {
Self::TARGET_TYPE
}
}
impl Drop for crate::ffi::root::gli::texture {
fn drop(&mut self) {
unsafe {
bindings::destroy_texture(self)
}
}
}