Skip to main content

surfman/
gl_utils.rs

1//! Various OpenGL utilities used by the different backends.
2
3use 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        // Unbind the framebuffer if it's bound.
31        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}