grafix_toolbox/kit/opengl/utility/
pingpong.rs1use 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}