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
use crate::backend::framebuffer::Framebuffer;
use crate::backend::texture::Texture as TextureBackend;
use crate::context::GraphicsContext;
use crate::framebuffer::FramebufferError;
use crate::pixel::{DepthPixel, PixelFormat};
use crate::texture::{Dimensionable, Sampler};
use crate::texture::Texture;
pub trait DepthSlot<B, D>
where
B: ?Sized + Framebuffer<D>,
D: Dimensionable,
D::Size: Copy,
{
type DepthTexture;
fn depth_format() -> Option<PixelFormat>;
fn reify_depth_texture<C>(
ctx: &mut C,
size: D::Size,
mipmaps: usize,
sampler: &Sampler,
framebuffer: &mut B::FramebufferRepr,
) -> Result<Self::DepthTexture, FramebufferError>
where
C: GraphicsContext<Backend = B>;
}
impl<B, D> DepthSlot<B, D> for ()
where
B: ?Sized + Framebuffer<D>,
D::Size: Copy,
D: Dimensionable,
{
type DepthTexture = ();
fn depth_format() -> Option<PixelFormat> {
None
}
fn reify_depth_texture<C>(
_: &mut C,
_: D::Size,
_: usize,
_: &Sampler,
_: &mut B::FramebufferRepr,
) -> Result<Self::DepthTexture, FramebufferError>
where
C: GraphicsContext<Backend = B>,
{
Ok(())
}
}
impl<B, D, P> DepthSlot<B, D> for P
where
B: ?Sized + Framebuffer<D> + TextureBackend<D, P>,
D: Dimensionable,
D::Size: Copy,
P: DepthPixel,
{
type DepthTexture = Texture<B, D, P>;
fn depth_format() -> Option<PixelFormat> {
Some(P::pixel_format())
}
fn reify_depth_texture<C>(
ctx: &mut C,
size: D::Size,
mipmaps: usize,
sampler: &Sampler,
framebuffer: &mut B::FramebufferRepr,
) -> Result<Self::DepthTexture, FramebufferError>
where
C: GraphicsContext<Backend = B>,
{
let texture = Texture::new(ctx, size, mipmaps, sampler.clone())?;
unsafe { B::attach_depth_texture(framebuffer, &texture.repr)? };
Ok(texture)
}
}