grafix_toolbox/kit/opengl/control/
policy.rs1use 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}