use core::ops::Drop;
use gl;
use gl::types::*;
use super::{DataFormat, Attachment};
pub struct GLRenderbuffer {
id: GLuint,
}
impl GLRenderbuffer {
#[inline(always)]
pub fn new(format: DataFormat, attachment: Attachment, width: usize, height: usize) -> Self {
let renderbuffer = GLRenderbuffer {
id: {
let mut id = 0;
unsafe { gl::GenRenderbuffers(1, &mut id); }
id
},
};
renderbuffer.set(format, attachment, width, height);
renderbuffer
}
#[inline(always)]
pub fn id(&self) -> GLuint { self.id }
#[inline]
pub fn bind(&self) -> &Self {
unsafe { gl::BindRenderbuffer(gl::RENDERBUFFER, self.id); }
self
}
#[inline]
pub fn unbind(&self) -> &Self {
unsafe { gl::BindRenderbuffer(gl::RENDERBUFFER, 0); }
self
}
#[inline]
pub fn set(&self, format: DataFormat, attachment: Attachment, width: usize, height: usize) {
let format = format.to_gl();
let attachment = attachment.to_gl();
unsafe {
gl::BindRenderbuffer(gl::RENDERBUFFER, self.id);
gl::RenderbufferStorage(gl::RENDERBUFFER, format, width as GLint, height as GLint);
gl::FramebufferRenderbuffer(gl::FRAMEBUFFER, attachment, gl::RENDERBUFFER, self.id);
}
}
}
impl Drop for GLRenderbuffer {
#[inline]
fn drop(&mut self) {
if self.id != 0 {
unsafe { gl::DeleteRenderbuffers(1, &self.id); }
}
}
}