From 65c6de85ba4c334e5ead848d3496ce05045ce31a Mon Sep 17 00:00:00 2001 From: Shylie Date: Mon, 27 May 2024 13:07:50 -0400 Subject: [PATCH] Rework testing code --- source/glerminal-private.h | 2 ++ source/glerminal.cpp | 31 ++++++++++++++++++++++++++----- tests/test-common/test-common.cpp | 8 ++++++-- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/source/glerminal-private.h b/source/glerminal-private.h index 51258e9..535ee5f 100644 --- a/source/glerminal-private.h +++ b/source/glerminal-private.h @@ -63,6 +63,8 @@ namespace glerminal unsigned int m_sprites_texture; unsigned int m_framebuffer; unsigned int m_framebuffer_backing_texture; + unsigned int m_screen_framebuffer; + unsigned int m_screen_framebuffer_backing_texture; unsigned int m_layer_colors_buffer; unsigned int m_layer_scales_buffer; unsigned int m_screen_size_uniform_location; diff --git a/source/glerminal.cpp b/source/glerminal.cpp index d1b4ab5..aa79960 100644 --- a/source/glerminal.cpp +++ b/source/glerminal.cpp @@ -267,11 +267,13 @@ namespace glerminal glDrawArraysInstanced(GL_TRIANGLES, 0, 6, GRID_AREA * LAYER_COUNT); glUseProgram(m_screen_program); - glBindFramebuffer(GL_FRAMEBUFFER, 0); + glBindFramebuffer(GL_FRAMEBUFFER, m_screen_framebuffer); glBindVertexArray(m_screen_vao); glClear(GL_COLOR_BUFFER_BIT); glDrawArrays(GL_TRIANGLES, 0, 6); + glBlitNamedFramebuffer(m_screen_framebuffer, 0, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, GL_COLOR_BUFFER_BIT, GL_NEAREST); + glfwSwapBuffers(m_window); } @@ -646,7 +648,10 @@ namespace glerminal throw std::runtime_error(""); } - // setup uniforms later + // setup uniforms for screen shader + glUseProgram(m_screen_program); + + glUniform1i(glGetUniformLocation(m_screen_program, LAYER_COUNT_UNIFORM_NAME), LAYER_COUNT); // -- setup textures -- glGenTextures(1, &m_sprites_texture); @@ -686,10 +691,24 @@ namespace glerminal glBindTextureUnit(1, m_framebuffer_backing_texture); - // setup uniforms for screen shader - glUseProgram(m_screen_program); + // -- setup screen framebuffer -- + glGenFramebuffers(1, &m_screen_framebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, m_screen_framebuffer); - glUniform1i(glGetUniformLocation(m_screen_program, LAYER_COUNT_UNIFORM_NAME), LAYER_COUNT); + glGenTextures(1, &m_screen_framebuffer_backing_texture); + glBindTexture(GL_TEXTURE_2D, m_screen_framebuffer_backing_texture); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); + + glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGB8, SCREEN_WIDTH, SCREEN_HEIGHT); + glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_screen_framebuffer_backing_texture, 0); } void glerminal::deinit_glfw() @@ -701,6 +720,8 @@ namespace glerminal void glerminal::deinit_gl() { + glDeleteFramebuffers(1, &m_screen_framebuffer); + glDeleteTextures(1, &m_screen_framebuffer_backing_texture); glDeleteFramebuffers(1, &m_framebuffer); glDeleteTextures(1, &m_framebuffer_backing_texture); glDeleteTextures(1, &m_sprites_texture); diff --git a/tests/test-common/test-common.cpp b/tests/test-common/test-common.cpp index 66fea86..1a61737 100644 --- a/tests/test-common/test-common.cpp +++ b/tests/test-common/test-common.cpp @@ -13,8 +13,12 @@ namespace void glerminal_test_save_image() { - glReadBuffer(GL_LEFT); - glReadPixels(0, 0, GRID_WIDTH * CELL_SCALE * 8, GRID_HEIGHT * CELL_SCALE * 8, GL_RGB, GL_UNSIGNED_BYTE, pixels); + // -- DIRTY HACK -- + // + // GL_TEXTURE_2D is not rebound after setting up screen framebuffer + // This code will break if this behavior changes + + glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_UNSIGNED_BYTE, pixels); stbi_flip_vertically_on_write(true); stbi_write_png("image.png", GRID_WIDTH * CELL_SCALE * 8, GRID_HEIGHT * CELL_SCALE * 8, 3, pixels, 1280 * 3);