use std::ops::Deref;
use anyhow::Context as _;
use anyhow::Result;
use crate::sys;
use crate::sys::Gl as _;
#[derive(Debug)]
pub struct Renderbuffer {
context: sys::Context,
rbo: sys::Renderbuffer,
}
impl Renderbuffer {
pub fn new(
format: sys::TextureInternalFormat,
w: u32,
h: u32,
context: &sys::Context,
) -> Result<Self> {
let slf = Self {
context: context.clone(),
rbo: context
.create_renderbuffer()
.context("failed to create render buffer object")?,
};
let () = slf.bind();
let () = context
.set_renderbuffer_storage(format, w, h)
.context("failed to configure render buffer storage")?;
let () = slf.unbind();
Ok(slf)
}
pub fn bind(&self) {
let () = self.context.bind_renderbuffer(Some(&self.rbo));
}
pub fn unbind(&self) {
let () = self.context.bind_renderbuffer(None);
}
}
impl Deref for Renderbuffer {
type Target = sys::Renderbuffer;
#[inline]
fn deref(&self) -> &Self::Target {
&self.rbo
}
}
impl Drop for Renderbuffer {
fn drop(&mut self) {
let () = self.context.delete_renderbuffer(&self.rbo);
}
}
#[cfg(test)]
mod tests {
use super::*;
use test_fork::fork;
use crate::winit::with_opengl_context;
#[fork]
#[test]
fn renderbuffer_creation() {
with_opengl_context(|| {
let gl_context = sys::Context::default();
let _renderbuffer =
Renderbuffer::new(sys::TextureInternalFormat::RGB8, 256, 256, &gl_context).unwrap();
})
}
}