1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
use super::{state::*, tex_state::*, universion::*}; use crate::uses::*; macro_rules! m_state { () => { fn bound_obj() -> &'static mut u32 { static mut STATE: u32 = 0; unsafe { &mut STATE } } fn tracked_obj() -> &'static mut u32 { static mut STATE: u32 = 0; unsafe { &mut STATE } } }; } pub trait Buffer { const TYPE: GLenum; } #[derive(Default)] pub struct Attribute; impl State for Attribute { m_state!(); } impl Buffer for Attribute { const TYPE: GLenum = gl::ARRAY_BUFFER; } #[derive(Default)] pub struct Index; impl State for Index { m_state!(); } impl Buffer for Index { const TYPE: GLenum = gl::ELEMENT_ARRAY_BUFFER; } #[derive(Default)] pub struct ShdProg; impl State for ShdProg { m_state!(); unsafe fn bind(obj: u32) { gl::UseProgram(obj); } unsafe fn gen(obj: &mut u32) { *obj = gl::CreateProgram(); } unsafe fn del(obj: &mut u32) { gl::DeleteProgram(*obj); } } #[derive(Default)] pub struct VertArrObj; impl State for VertArrObj { m_state!(); unsafe fn bind(obj: u32) { gl::BindVertexArray(obj); } unsafe fn gen(obj: &mut u32) { glCreateVao(obj); } unsafe fn del(obj: &mut u32) { gl::DeleteVertexArrays(1, obj); } } #[derive(Default)] pub struct Query; impl State for Query { m_state!(); unsafe fn gen(obj: &mut u32) { gl::GenQueries(1, obj); } unsafe fn del(obj: &mut u32) { gl::DeleteQueries(1, obj); } } #[derive(Default)] pub struct Framebuff; impl State for Framebuff { m_state!(); unsafe fn bind(obj: u32) { gl::BindFramebuffer(gl::DRAW_FRAMEBUFFER, obj); } unsafe fn gen(obj: &mut u32) { glCreateFramebuff(obj); } unsafe fn del(obj: &mut u32) { gl::DeleteFramebuffers(1, obj); } } #[derive(Default)] pub struct Renderbuff; impl State for Renderbuff { m_state!(); unsafe fn gen(obj: &mut u32) { glCreateRenderbuff(obj); } unsafe fn del(obj: &mut u32) { gl::DeleteRenderbuffers(1, obj); } } #[derive(Default)] pub struct SamplObj; impl State for SamplObj { m_state!(); unsafe fn gen(obj: &mut u32) { gl::GenSamplers(1, obj); } unsafe fn del(obj: &mut u32) { TexState::drop_samp(*obj); gl::DeleteSamplers(1, obj); } } #[derive(Debug, Default)] pub struct Texture<T> { t: Dummy<T>, } impl<T: TexType> State for Texture<T> { m_state!(); unsafe fn gen(obj: &mut u32) { glCreateTexture(T::TYPE, obj); } unsafe fn del(obj: &mut u32) { TexState::drop_tex(*obj); glDeleteTexture(obj); } } pub trait TexType: Default { const TYPE: GLenum; }