grafix_toolbox/kit/opengl/utility/
pingpong.rs

1use super::super::shader::uniform::*;
2use crate::GL::{tex::*, Fbo};
3
4#[macro_export]
5macro_rules! ComputeShader {
6	($shd: ident, ($n0: literal, $samp: ident, $slab: ident)$(, $($args: tt),+)?) => {{
7		let mut fbo = &mut $slab.tgt;
8		let src = &$slab.src.tex;
9		ComputeShader!($shd, fbo, ($n0, $samp, src)$(, $($args),+)?);
10		$slab.swap();
11	}};
12	($shd: ident, $fbo: expr) => {{
13		$fbo.clear((0, 1));
14		$fbo.bind();
15		let _ = $shd.Bind();
16		$crate::GL::mesh::Screen::Draw();
17	}};
18	($shd: ident, $fbo: expr, ($n0: literal, $v0: expr)) => {{
19		$fbo.clear((0, 1));
20		$fbo.bind();
21		let s = $shd.Bind();
22		let _ = Uniform!(s, ($n0, $v0));
23		let _ = ComputeShader!($shd, $fbo);
24	}};
25	($shd: ident, $fbo: expr, ($n0: literal, $s0: ident, $t0: expr)) => {{
26		$fbo.clear((0, 1));
27		$fbo.bind();
28		let s = $shd.Bind();
29		let b = $t0.Bind(&$s0);
30		let _ = Uniform!(s, ($n0, b));
31		let _ = ComputeShader!($shd, $fbo);
32	}};
33	($shd: ident, $fbo: expr, ($n0: literal, $v0: expr), $($args: tt),+) => {{
34		$fbo.clear((0, 1));
35		$fbo.bind();
36		let s = $shd.Bind();
37		let _ = Uniform!(s, ($n0, $v0));
38		let _ = ComputeShader!($shd, $fbo, $($args),+);
39	}};
40	($shd: ident, $fbo: expr, ($n0: literal, $s0: ident, $t0: expr), $($args: tt),+) => {{
41		$fbo.clear((0, 1));
42		$fbo.bind();
43		let s = $shd.Bind();
44		let b = $t0.Bind(&$s0);
45		let _ = Uniform!(s, ($n0, b));
46		let _ = ComputeShader!($shd, $fbo, $($args),+);
47	}};
48}
49
50impl<T: UniformArgs> UniformArgs for (T, &Sampler) {
51	fn apply(&self, addr: i32, c: UniCache) {
52		self.0.apply(addr, c);
53	}
54}
55impl<S, F> UniformArgs for (&Tex<S, F, GL_TEXTURE_2D>, &Sampler) {
56	fn apply(&self, addr: i32, c: UniCache) {
57		self.0.Bind(self.1).apply(addr, c);
58	}
59}
60impl<S, F> UniformArgs for (&Fbo<S, F>, &Sampler) {
61	fn apply(&self, addr: i32, c: UniCache) {
62		(&self.0.tex, self.1).apply(addr, c);
63	}
64}