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