luminance/
shading_gate.rs1use crate::{
8 backend::shading_gate::ShadingGate as ShadingGateBackend,
9 render_gate::RenderGate,
10 shader::{Program, ProgramInterface, UniformInterface},
11 vertex::Semantics,
12};
13
14pub struct ShadingGate<'a, B> {
24 pub(crate) backend: &'a mut B,
25}
26
27impl<'a, B> ShadingGate<'a, B>
28where
29 B: ShadingGateBackend,
30{
31 pub fn shade<E, Sem, Out, Uni, F>(
39 &mut self,
40 program: &mut Program<B, Sem, Out, Uni>,
41 f: F,
42 ) -> Result<(), E>
43 where
44 Sem: Semantics,
45 Uni: UniformInterface<B>,
46 F: for<'b> FnOnce(ProgramInterface<'b, B>, &'b Uni, RenderGate<'b, B>) -> Result<(), E>,
47 {
48 unsafe {
49 self.backend.apply_shader_program(&mut program.repr);
50 }
51
52 let render_gate = RenderGate {
53 backend: self.backend,
54 };
55 let program_interface = ProgramInterface {
56 program: &mut program.repr,
57 };
58
59 f(program_interface, &program.uni, render_gate)
60 }
61}