grafix_toolbox/kit/opengl/control/
policy.rs

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