grafix_toolbox/kit/opengl/control/
policy.rs1use super::{state::*, tex_state::*, universion::*, *};
2
3macro_rules! m_STATE {
4 () => {
5 fn bound_obj() -> &'static mut u32 {
6 LocalStatic!(u32)
7 }
8 fn tracked_obj() -> &'static mut u32 {
9 LocalStatic!(u32)
10 }
11 };
12}
13
14pub trait Buffer: TrivialBound + State {
15 const TYPE: GLenum;
16}
17
18#[derive_as_trivial]
19pub struct Attribute;
20impl State for Attribute {
21 m_STATE!();
22}
23impl Buffer for Attribute {
24 const TYPE: GLenum = gl::ARRAY_BUFFER;
25}
26
27#[derive_as_trivial]
28pub struct Index;
29impl State for Index {
30 m_STATE!();
31}
32impl Buffer for Index {
33 const TYPE: GLenum = gl::ELEMENT_ARRAY_BUFFER;
34}
35
36pub trait ShdBuffType: Buffer {
37 fn max_bindings() -> i32;
38 fn max_size() -> usize;
39}
40
41#[derive_as_trivial]
42pub struct Uniform;
43impl State for Uniform {
44 m_STATE!();
45}
46impl Buffer for Uniform {
47 const TYPE: GLenum = gl::UNIFORM_BUFFER;
48}
49
50#[derive_as_trivial]
51pub struct ShdStorage;
52impl State for ShdStorage {
53 m_STATE!();
54}
55impl Buffer for ShdStorage {
56 const TYPE: GLenum = gl::SHADER_STORAGE_BUFFER;
57}
58
59macro_rules! impl_shd {
60 ($n: ident, $t: ident) => {
61 #[derive(Debug)]
62 pub struct $n;
63 impl State for $n {
64 m_STATE!();
65 fn new(obj: &mut u32) {
66 *obj = unsafe { gl::CreateShader(gl::$t) }
67 }
68 fn del(obj: u32) {
69 drop_in_gl(move || unsafe { gl::DeleteShader(obj) });
70 }
71 }
72 };
73}
74impl_shd!(ShdVertT, VERTEX_SHADER);
75impl_shd!(ShdPixT, FRAGMENT_SHADER);
76impl_shd!(ShdGeomT, GEOMETRY_SHADER);
77impl_shd!(ShdCompT, COMPUTE_SHADER);
78impl_shd!(ShdCtrlT, TESS_CONTROL_SHADER);
79impl_shd!(ShdEvalT, TESS_EVALUATION_SHADER);
80
81#[derive(Debug)]
82pub struct ShaderT;
83impl State for ShaderT {
84 m_STATE!();
85 fn bind(obj: u32) {
86 unsafe { gl::UseProgram(obj) }
87 }
88 fn new(obj: &mut u32) {
89 *obj = unsafe { gl::CreateProgram() }
90 }
91 fn del(obj: u32) {
92 drop_in_gl(move || unsafe { gl::DeleteProgram(obj) });
93 }
94}
95
96#[derive(Debug)]
97pub struct VertArrT(Dummy<*const ()>);
98impl State for VertArrT {
99 m_STATE!();
100 fn bind(obj: u32) {
101 unsafe { gl::BindVertexArray(obj) }
102 }
103 fn new(obj: &mut u32) {
104 glCreateVao(obj);
105 }
106 fn del(obj: u32) {
107 GL!(gl::DeleteVertexArrays(1, &obj));
108 }
109}
110
111#[derive(Debug)]
112pub struct QueryT(Dummy<*const ()>);
113impl State for QueryT {
114 m_STATE!();
115 fn new(obj: &mut u32) {
116 unsafe { gl::GenQueries(1, obj) }
117 }
118 fn del(obj: u32) {
119 GL!(gl::DeleteQueries(1, &obj));
120 }
121}
122
123#[derive(Debug)]
124pub struct FramebuffT(Dummy<*const ()>);
125impl State for FramebuffT {
126 m_STATE!();
127 fn bind(obj: u32) {
128 unsafe { gl::BindFramebuffer(gl::DRAW_FRAMEBUFFER, obj) }
129 }
130 fn new(obj: &mut u32) {
131 glCreateFramebuff(obj);
132 }
133 fn del(obj: u32) {
134 GL!(gl::DeleteFramebuffers(1, &obj));
135 }
136}
137
138#[derive(Debug)]
139pub struct RenderbuffT;
140impl State for RenderbuffT {
141 m_STATE!();
142 fn new(obj: &mut u32) {
143 glCreateRenderbuff(obj);
144 }
145 fn del(obj: u32) {
146 drop_in_gl(move || unsafe { gl::DeleteRenderbuffers(1, &obj) });
147 }
148}
149
150#[derive(Debug)]
151pub struct SamplerT;
152impl State for SamplerT {
153 m_STATE!();
154 fn new(obj: &mut u32) {
155 unsafe { gl::GenSamplers(1, obj) }
156 }
157 fn del(obj: u32) {
158 TexState::drop_samp(obj);
159 drop_in_gl(move || unsafe { gl::DeleteSamplers(1, &obj) });
160 }
161}
162
163#[derive(Debug)]
164pub struct TextureT<T>(Dummy<T>);
165impl<T: TexType> State for TextureT<T> {
166 m_STATE!();
167 fn new(obj: &mut u32) {
168 glCreateTexture(T::TYPE, obj);
169 }
170 fn del(obj: u32) {
171 TexState::drop_tex(obj);
172 drop_in_gl(move || glDeleteTexture(&obj));
173 }
174}
175pub trait TexType: TrivialBound {
176 const TYPE: GLenum;
177}