1use glow::{HasContext, NativeFramebuffer};
6
7use crate::gl;
8use crate::Gl;
9
10#[allow(dead_code)]
11pub(crate) fn create_and_bind_framebuffer(
12 gl: &Gl,
13 texture_target: u32,
14 texture_object: Option<glow::NativeTexture>,
15) -> NativeFramebuffer {
16 unsafe {
17 let framebuffer_object = gl.create_framebuffer().unwrap();
18 gl.bind_framebuffer(gl::FRAMEBUFFER, Some(framebuffer_object));
19 gl.framebuffer_texture_2d(
20 gl::FRAMEBUFFER,
21 gl::COLOR_ATTACHMENT0,
22 texture_target,
23 texture_object,
24 0,
25 );
26 framebuffer_object
27 }
28}
29
30pub(crate) fn unbind_framebuffer_if_necessary(gl: &Gl, framebuffer_object: NativeFramebuffer) {
31 unsafe {
32 let current_draw_framebuffer = gl.get_parameter_framebuffer(gl::DRAW_FRAMEBUFFER_BINDING);
34 let current_read_framebuffer = gl.get_parameter_framebuffer(gl::READ_FRAMEBUFFER_BINDING);
35 if current_draw_framebuffer == Some(framebuffer_object) {
36 gl.bind_framebuffer(gl::DRAW_FRAMEBUFFER, None);
37 }
38 if current_read_framebuffer == Some(framebuffer_object) {
39 gl.bind_framebuffer(gl::READ_FRAMEBUFFER, None);
40 }
41 }
42}
43
44#[allow(dead_code)]
45pub(crate) fn destroy_framebuffer(gl: &Gl, framebuffer_object: NativeFramebuffer) {
46 unbind_framebuffer_if_necessary(gl, framebuffer_object);
47 unsafe {
48 gl.delete_framebuffer(framebuffer_object);
49 }
50}