grafix_toolbox/kit/opengl/texture/
texbuff.rs

1use super::{format::*, spec::*, *};
2
3pub struct TexBuffer<'a, S, F, B: State> {
4	tex: Object<Texture<GL_TEXTURE_BUFFER>>,
5	unit: Cell<u32>,
6	b: Dummy<&'a ArrObject<B, F>>,
7	f: Dummy<F>,
8	s: Dummy<S>,
9}
10impl<S: TexSize, F: TexFmt, B: Buffer> TexBuffer<'_, S, F, B> {
11	pub fn new(buf: &ArrObject<B, F>) -> Self {
12		let tex = Object::new();
13		let fmt = get_internal_fmt::<S, F>();
14		ASSERT!(
15			GL::MAX_TEXTURE_BUFFER_SIZE() >= i32(buf.len),
16			"Buffer {} for buffer texture {} exceeds maximum size",
17			buf.obj,
18			tex.obj
19		);
20		GL!(glTextureBuffer(GL_TEXTURE_BUFFER::TYPE, tex.obj, fmt, buf.obj));
21		let (b, f, s) = (Dummy, Dummy, Dummy);
22		let unit = Cell(0);
23		Self { tex, unit, b, f, s }
24	}
25	pub fn Bind(&self) -> TexBuffBinding {
26		let unit = self.unit.take();
27		let (b, u) = TexBuffBinding::new(&self.tex, unit);
28		self.unit.set(u);
29		b
30	}
31}
32
33pub struct TexBuffBinding<'l> {
34	t: Dummy<&'l GL_TEXTURE_BUFFER>,
35	pub u: u32,
36}
37impl TexBuffBinding<'_> {
38	pub fn new(o: &Object<Texture<GL_TEXTURE_BUFFER>>, hint: u32) -> (Self, u32) {
39		let u = TexState::BindAny::<GL_TEXTURE_BUFFER>(o.obj, hint);
40		(Self { t: Dummy, u }, u)
41	}
42}
43impl Drop for TexBuffBinding<'_> {
44	fn drop(&mut self) {
45		TexState::Unbind(self.u);
46	}
47}