gl: fix redundant fbo rebind

This commit is contained in:
chyyran 2022-11-26 16:58:23 -05:00
parent 46bc8a9e70
commit bfed01435b
4 changed files with 8 additions and 5 deletions

View file

@ -593,6 +593,9 @@ impl FilterChain {
Ok(()) Ok(())
} }
/// Process a frame with the input image.
///
/// When this frame returns, GL_FRAMEBUFFER is bound to 0.
pub fn frame(&mut self, count: usize, viewport: &Viewport, input: &GlImage, clear: bool) -> Result<()> { pub fn frame(&mut self, count: usize, viewport: &Viewport, input: &GlImage, clear: bool) -> Result<()> {
if clear { if clear {
for framebuffer in &self.history_framebuffers { for framebuffer in &self.history_framebuffers {
@ -605,7 +608,8 @@ impl FilterChain {
} }
unsafe { unsafe {
gl::BindFramebuffer(gl::FRAMEBUFFER, 0); // do not need to rebind FBO 0 here since first `draw` will
// bind automatically.
gl::BindVertexArray(self.filter_vao); gl::BindVertexArray(self.filter_vao);
} }
@ -719,8 +723,9 @@ impl FilterChain {
} }
self.push_history(input)?; self.push_history(input)?;
// pass.draw should return framebuffer bound to 0.
unsafe { unsafe {
gl::BindFramebuffer(gl::FRAMEBUFFER, 0);
gl::BindVertexArray(0); gl::BindVertexArray(0);
} }

View file

@ -190,7 +190,6 @@ impl FilterPass {
// todo: final pass? // todo: final pass?
unsafe { unsafe {
gl::BindFramebuffer(gl::FRAMEBUFFER, framebuffer.handle);
gl::ColorMask(gl::TRUE, gl::TRUE, gl::TRUE, gl::TRUE); gl::ColorMask(gl::TRUE, gl::TRUE, gl::TRUE, gl::TRUE);
gl::ClearColor(0.0f32, 0.0f32, 0.0f32, 0.0f32); gl::ClearColor(0.0f32, 0.0f32, 0.0f32, 0.0f32);
gl::Clear(gl::COLOR_BUFFER_BIT); gl::Clear(gl::COLOR_BUFFER_BIT);

View file

@ -523,7 +523,6 @@ void main()
unsafe { unsafe {
// texture is done now. // texture is done now.
// draw quad to screen // draw quad to screen
gl::BindFramebuffer(gl::FRAMEBUFFER, 0);
gl::UseProgram(quad_programid); gl::UseProgram(quad_programid);
gl::ActiveTexture(gl::TEXTURE0); gl::ActiveTexture(gl::TEXTURE0);

View file

@ -27,7 +27,7 @@ mod tests {
fn triangle_gl() { fn triangle_gl() {
let (glfw, window, events, shader, vao) = hello_triangle::setup(); let (glfw, window, events, shader, vao) = hello_triangle::setup();
let mut filter = let mut filter =
FilterChain::load_from_path("../test/slang-shaders/crt/crt-royale.slangp") FilterChain::load_from_path("../test/slang-shaders/vhs/VHSPro.slangp")
.unwrap(); .unwrap();
hello_triangle::do_loop(glfw, window, events, shader, vao, &mut filter); hello_triangle::do_loop(glfw, window, events, shader, vao, &mut filter);
} }