use crate::{
backend::{
color_slot::ColorSlot,
depth_stencil_slot::DepthStencilSlot,
framebuffer::Framebuffer as FramebufferBackend,
query::Query as QueryBackend,
shader::{Shader, ShaderData as ShaderDataBackend},
tess::Tess as TessBackend,
texture::Texture as TextureBackend,
},
texture::TexelUpload,
};
use crate::{
framebuffer::{Framebuffer, FramebufferError},
pipeline::PipelineGate,
pixel::Pixel,
query::Query,
shader::{ProgramBuilder, ShaderData, ShaderDataError, Stage, StageError, StageType},
tess::{Deinterleaved, Interleaved, TessBuilder, TessVertexData},
texture::{Dimensionable, Sampler, Texture, TextureError},
vertex::Semantics,
};
pub unsafe trait GraphicsContext: Sized {
type Backend;
fn backend(&mut self) -> &mut Self::Backend;
fn query(&mut self) -> Query<Self::Backend>
where
Self::Backend: QueryBackend,
{
Query::new(self)
}
fn new_pipeline_gate(&mut self) -> PipelineGate<Self::Backend> {
PipelineGate::new(self)
}
fn new_framebuffer<D, CS, DS>(
&mut self,
size: D::Size,
mipmaps: usize,
sampler: Sampler,
) -> Result<Framebuffer<Self::Backend, D, CS, DS>, FramebufferError>
where
Self::Backend: FramebufferBackend<D>,
D: Dimensionable,
CS: ColorSlot<Self::Backend, D>,
DS: DepthStencilSlot<Self::Backend, D>,
{
Framebuffer::new(self, size, mipmaps, sampler)
}
fn new_shader_stage<R>(
&mut self,
ty: StageType,
src: R,
) -> Result<Stage<Self::Backend>, StageError>
where
Self::Backend: Shader,
R: AsRef<str>,
{
Stage::new(self, ty, src)
}
fn new_shader_program<Sem, Out, Uni>(&mut self) -> ProgramBuilder<Self, Sem, Out, Uni>
where
Self::Backend: Shader,
Sem: Semantics,
{
ProgramBuilder::new(self)
}
fn new_shader_data<T>(
&mut self,
values: impl IntoIterator<Item = T>,
) -> Result<ShaderData<Self::Backend, T>, ShaderDataError>
where
Self::Backend: ShaderDataBackend<T>,
{
ShaderData::new(self, values)
}
fn new_tess(&mut self) -> TessBuilder<Self::Backend, (), (), (), Interleaved>
where
Self::Backend: TessBackend<(), (), (), Interleaved>,
{
TessBuilder::new(self)
}
fn new_deinterleaved_tess<V, W>(&mut self) -> TessBuilder<Self::Backend, V, (), W, Deinterleaved>
where
Self::Backend: TessBackend<V, (), W, Deinterleaved>,
V: TessVertexData<Deinterleaved>,
W: TessVertexData<Deinterleaved>,
{
TessBuilder::new(self)
}
fn new_texture<D, P>(
&mut self,
size: D::Size,
sampler: Sampler,
texels: TexelUpload<[P::Encoding]>,
) -> Result<Texture<Self::Backend, D, P>, TextureError>
where
Self::Backend: TextureBackend<D, P>,
D: Dimensionable,
P: Pixel,
{
Texture::new(self, size, sampler, texels)
}
fn new_texture_raw<D, P>(
&mut self,
size: D::Size,
sampler: Sampler,
texels: TexelUpload<[P::RawEncoding]>,
) -> Result<Texture<Self::Backend, D, P>, TextureError>
where
Self::Backend: TextureBackend<D, P>,
D: Dimensionable,
P: Pixel,
{
Texture::new_raw(self, size, sampler, texels)
}
}