Skip to main content

grafix_toolbox/kit/opengl/control/
policy.rs

1use 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}