surfman/
gl_utils.rs

1// surfman/surfman/src/gl_utils.rs
2//
3//! Various OpenGL utilities used by the different backends.
4
5use 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        // Unbind the framebuffer if it's bound.
33        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}