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