cleanup OpenGL FBO creation/deletion

This commit is contained in:
Lily Tsuru 2024-08-05 22:23:41 -04:00
parent 897f45e49f
commit 91dee22da5

View file

@ -182,34 +182,42 @@ impl App {
/// Destroys EGL resources. /// Destroys EGL resources.
unsafe fn hw_gl_egl_exit(&mut self) { unsafe fn hw_gl_egl_exit(&mut self) {
// Release the EGL context we created before destroying it // Release the EGL context we created before destroying it
egl::MakeCurrent(self.egl_display, egl::NO_SURFACE, egl::NO_SURFACE, egl::NO_CONTEXT); egl::MakeCurrent(
self.egl_display,
egl::NO_SURFACE,
egl::NO_SURFACE,
egl::NO_CONTEXT,
);
egl::DestroyContext(self.egl_display, self.egl_context); egl::DestroyContext(self.egl_display, self.egl_context);
egl::Terminate(self.egl_display); egl::Terminate(self.egl_display);
self.egl_display = std::ptr::null(); self.egl_display = std::ptr::null();
self.egl_context = std::ptr::null(); self.egl_context = std::ptr::null();
} }
fn hw_gl_resize_fbo(&mut self, width: u32, height: u32) { fn hw_gl_delete_fbo(&mut self) {
// TODO: cleanup "delete" codepaths so we aren't duplicating as much.
// (we should probably just have a "create" and "delete" FBO pair.)
unsafe { unsafe {
if self.fbo_id == 0 { gl::DeleteFramebuffers(1, std::ptr::addr_of_mut!(self.fbo_id));
gl::GenFramebuffers(1, std::ptr::addr_of_mut!(self.fbo_id)); self.fbo_id = 0;
gl::BindFramebuffer(gl::FRAMEBUFFER, self.fbo_id);
} else { gl::DeleteTextures(1, std::ptr::addr_of_mut!(self.texture_id));
gl::DeleteFramebuffers(1, std::ptr::addr_of_mut!(self.fbo_id)); self.texture_id = 0;
gl::GenFramebuffers(1, std::ptr::addr_of_mut!(self.fbo_id));
gl::BindFramebuffer(gl::FRAMEBUFFER, self.fbo_id); gl::DeleteRenderbuffers(1, std::ptr::addr_of_mut!(self.renderbuffer_id));
self.renderbuffer_id = 0;
}
}
fn hw_gl_create_fbo(&mut self, width: u32, height: u32) {
unsafe {
if self.fbo_id != 0 {
self.hw_gl_delete_fbo();
} }
if self.texture_id == 0 { gl::GenFramebuffers(1, std::ptr::addr_of_mut!(self.fbo_id));
gl::GenTextures(1, std::ptr::addr_of_mut!(self.texture_id)); gl::BindFramebuffer(gl::FRAMEBUFFER, self.fbo_id);
gl::BindTexture(gl::TEXTURE_2D, self.texture_id);
} else { gl::GenTextures(1, std::ptr::addr_of_mut!(self.texture_id));
gl::DeleteTextures(1, std::ptr::addr_of_mut!(self.texture_id)); gl::BindTexture(gl::TEXTURE_2D, self.texture_id);
gl::GenTextures(1, std::ptr::addr_of_mut!(self.texture_id));
gl::BindTexture(gl::TEXTURE_2D, self.texture_id);
}
gl::TexImage2D( gl::TexImage2D(
gl::TEXTURE_2D, gl::TEXTURE_2D,
@ -223,14 +231,8 @@ impl App {
std::ptr::null(), std::ptr::null(),
); );
if self.renderbuffer_id == 0 { gl::GenRenderbuffers(1, std::ptr::addr_of_mut!(self.renderbuffer_id));
gl::GenRenderbuffers(1, std::ptr::addr_of_mut!(self.renderbuffer_id)); gl::BindRenderbuffer(gl::RENDERBUFFER, self.renderbuffer_id);
gl::BindRenderbuffer(gl::RENDERBUFFER, self.renderbuffer_id);
} else {
gl::DeleteRenderbuffers(1, std::ptr::addr_of_mut!(self.renderbuffer_id));
gl::GenRenderbuffers(1, std::ptr::addr_of_mut!(self.renderbuffer_id));
gl::BindRenderbuffer(gl::RENDERBUFFER, self.renderbuffer_id);
}
gl::RenderbufferStorage( gl::RenderbufferStorage(
gl::RENDERBUFFER, gl::RENDERBUFFER,
@ -262,6 +264,7 @@ impl App {
gl::BindFramebuffer(gl::FRAMEBUFFER, 0); gl::BindFramebuffer(gl::FRAMEBUFFER, 0);
// Notify the frontend layer about the new FBO
let id = self.fbo_id; let id = self.fbo_id;
self.get_frontend().set_gl_fbo(id); self.get_frontend().set_gl_fbo(id);
@ -292,7 +295,7 @@ impl FrontendInterface for App {
// Resize OpenGL resources if we need to. // Resize OpenGL resources if we need to.
if self.hw_render { if self.hw_render {
self.hw_gl_resize_fbo(width, height); self.hw_gl_create_fbo(width, height);
} }
self.rfb_server.resize(width as u16, height as u16); self.rfb_server.resize(width as u16, height as u16);
@ -360,9 +363,9 @@ impl FrontendInterface for App {
gl::Enable(gl::DEBUG_OUTPUT); gl::Enable(gl::DEBUG_OUTPUT);
gl::DebugMessageCallback(Some(opengl_message_callback), std::ptr::null()); gl::DebugMessageCallback(Some(opengl_message_callback), std::ptr::null());
// Resize to initial dimensions (this will create an FBO as well) // Create the initial FBO for the core to render to
let dimensions = self.get_frontend().get_size(); let dimensions = self.get_frontend().get_size();
self.hw_gl_resize_fbo(dimensions.0, dimensions.1); self.hw_gl_create_fbo(dimensions.0, dimensions.1);
} }
self.hw_render = true; self.hw_render = true;