From a8653f7595fd459c8a5602534d90c9b9473b8398 Mon Sep 17 00:00:00 2001 From: ManDude <7569514+ManDude@users.noreply.github.com> Date: Tue, 19 Jul 2022 23:41:48 +0100 Subject: [PATCH] fix borderless on Windows, resolution when letterboxes and envmap setting (#1683) * fix Windows borderless and letterboxing resolutions * oops fix envmap setting * unused * fix msaa not using a resolve buffer * remove unnecessary resolve buffers(?) * fix sprite distort --- .../graphics/opengl_renderer/BucketRenderer.h | 2 + .../opengl_renderer/OpenGLRenderer.cpp | 85 ++++++++++--------- game/graphics/opengl_renderer/Sprite3.cpp | 28 +++--- game/graphics/pipelines/opengl.cpp | 3 +- goal_src/jak1/pc/pckernel-h.gc | 4 +- 5 files changed, 64 insertions(+), 58 deletions(-) diff --git a/game/graphics/opengl_renderer/BucketRenderer.h b/game/graphics/opengl_renderer/BucketRenderer.h index cd5f8680d9..384918be9c 100644 --- a/game/graphics/opengl_renderer/BucketRenderer.h +++ b/game/graphics/opengl_renderer/BucketRenderer.h @@ -63,6 +63,8 @@ struct SharedRenderState { // framebuffer setup. // the framebuffer that bucket renderers should render to. + int render_fb_x = 0; + int render_fb_y = 0; int render_fb_w = 0; int render_fb_h = 0; GLuint render_fb = -1; diff --git a/game/graphics/opengl_renderer/OpenGLRenderer.cpp b/game/graphics/opengl_renderer/OpenGLRenderer.cpp index 2cfb22721b..4aab74a700 100644 --- a/game/graphics/opengl_renderer/OpenGLRenderer.cpp +++ b/game/graphics/opengl_renderer/OpenGLRenderer.cpp @@ -553,11 +553,9 @@ void OpenGLRenderer::setup_frame(const RenderOptions& settings) { make_fbo(settings.game_res_w, settings.game_res_h, settings.msaa_samples, true); m_fbo_state.render_fbo = &m_fbo_state.resources.render_buffer; - bool resolution_matches = - window_fb.width == settings.game_res_w && window_fb.height == settings.game_res_h; bool msaa_matches = window_fb.multisample_count == settings.msaa_samples; - if (!resolution_matches && !msaa_matches) { + if (!msaa_matches) { lg::info("FBO Setup: using second temporary buffer: res: {}x{} {}x{}", window_fb.width, window_fb.height, settings.game_res_w, settings.game_res_h); @@ -571,11 +569,21 @@ void OpenGLRenderer::setup_frame(const RenderOptions& settings) { } } - glBindFramebuffer(GL_FRAMEBUFFER, m_fbo_state.render_fbo->fbo_id); ASSERT_MSG(settings.game_res_w > 0 && settings.game_res_h > 0, fmt::format("Bad viewport size from game_res: {}x{}\n", settings.game_res_w, settings.game_res_h)); - glViewport(0, 0, settings.game_res_w, settings.game_res_h); + + if (!m_fbo_state.render_fbo->is_window) { + glBindFramebuffer(GL_FRAMEBUFFER, 0); + glViewport(0, 0, m_fbo_state.resources.window.width, m_fbo_state.resources.window.height); + glClearColor(0.0, 0.0, 0.0, 0.0); + glClearDepth(0.0); + glDepthMask(GL_TRUE); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + glDisable(GL_BLEND); + } + + glBindFramebuffer(GL_FRAMEBUFFER, m_fbo_state.render_fbo->fbo_id); glClearColor(0.0, 0.0, 0.0, 0.0); glClearDepth(0.0); glClearStencil(0); @@ -585,34 +593,19 @@ void OpenGLRenderer::setup_frame(const RenderOptions& settings) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); glDisable(GL_BLEND); - m_render_state.render_fb_w = settings.game_res_w; - m_render_state.render_fb_h = settings.game_res_h; - - // compare the aspect ratio of the frame buffer to the requested draw area. - float fb_aspect = - (float)settings.window_framebuffer_width / (float)settings.window_framebuffer_height; - float draw_aspect = (float)settings.draw_region_width / (float)settings.draw_region_height; - float squash = fb_aspect / draw_aspect; - - // start with the full area - m_render_state.draw_region_w = m_render_state.render_fb_w; - m_render_state.draw_region_h = m_render_state.render_fb_h; - - // and letterbox as needed - if (squash > 1) { - m_render_state.draw_region_w = ((float)m_render_state.draw_region_w / squash) + 0.1; - } else { - m_render_state.draw_region_h = ((float)m_render_state.draw_region_h * squash) + 0.1; - } + // setup the draw region to letterbox later + m_render_state.draw_region_w = settings.draw_region_width; + m_render_state.draw_region_h = settings.draw_region_height; // center the letterbox - m_render_state.draw_offset_x = (settings.game_res_w - m_render_state.draw_region_w) / 2; - m_render_state.draw_offset_y = (settings.game_res_h - m_render_state.draw_region_h) / 2; + m_render_state.draw_offset_x = + (settings.window_framebuffer_width - m_render_state.draw_region_w) / 2; + m_render_state.draw_offset_y = + (settings.window_framebuffer_height - m_render_state.draw_region_h) / 2; if (settings.borderless_windows_hacks) { // pretend the framebuffer is 1 pixel shorter on borderless. fullscreen issues! // add one pixel of vertical letterbox on borderless to make up for extra line - m_render_state.draw_region_h--; m_render_state.draw_offset_y++; } @@ -623,8 +616,21 @@ void OpenGLRenderer::setup_frame(const RenderOptions& settings) { m_render_state.draw_region_w = 640; m_render_state.draw_region_h = 480; } - glViewport(m_render_state.draw_offset_x, m_render_state.draw_offset_y, - m_render_state.draw_region_w, m_render_state.draw_region_h); + + if (m_fbo_state.render_fbo->is_window) { + m_render_state.render_fb_x = m_render_state.draw_offset_x; + m_render_state.render_fb_y = m_render_state.draw_offset_y; + m_render_state.render_fb_w = m_render_state.draw_region_w; + m_render_state.render_fb_h = m_render_state.draw_region_h; + glViewport(m_render_state.draw_offset_x, m_render_state.draw_offset_y, + m_render_state.draw_region_w, m_render_state.draw_region_h); + } else { + m_render_state.render_fb_x = 0; + m_render_state.render_fb_y = 0; + m_render_state.render_fb_w = settings.game_res_w; + m_render_state.render_fb_h = settings.game_res_h; + glViewport(0, 0, settings.game_res_w, settings.game_res_h); + } } /*! @@ -732,7 +738,6 @@ void OpenGLRenderer::do_pcrtc_effects(float alp, // nothing to do! } else { Fbo* window_blit_src = nullptr; - const Fbo& window_fbo = m_fbo_state.resources.window; if (m_fbo_state.resources.resolve_buffer.valid) { glBindFramebuffer(GL_READ_FRAMEBUFFER, m_fbo_state.render_fbo->fbo_id); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbo_state.resources.resolve_buffer.fbo_id); @@ -754,16 +759,16 @@ void OpenGLRenderer::do_pcrtc_effects(float alp, glBindFramebuffer(GL_READ_FRAMEBUFFER, window_blit_src->fbo_id); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); - glBlitFramebuffer(0, // srcX0 - 0, // srcY0 - window_blit_src->width, // srcX1 - window_blit_src->height, // srcY1 - 0, // dstX0 - 0, // dstY0 - window_fbo.width, // dstX1 - window_fbo.height, // dstY1 - GL_COLOR_BUFFER_BIT, // mask - GL_LINEAR // filter + glBlitFramebuffer(0, // srcX0 + 0, // srcY0 + window_blit_src->width, // srcX1 + window_blit_src->height, // srcY1 + render_state->draw_offset_x, // dstX0 + render_state->draw_offset_y, // dstY0 + render_state->draw_offset_x + render_state->draw_region_w, // dstX1 + render_state->draw_offset_y + render_state->draw_region_h, // dstY1 + GL_COLOR_BUFFER_BIT, // mask + GL_LINEAR // filter ); glBindFramebuffer(GL_FRAMEBUFFER, 0); } diff --git a/game/graphics/opengl_renderer/Sprite3.cpp b/game/graphics/opengl_renderer/Sprite3.cpp index 67976b2b2d..7b65e4fbf0 100644 --- a/game/graphics/opengl_renderer/Sprite3.cpp +++ b/game/graphics/opengl_renderer/Sprite3.cpp @@ -714,16 +714,16 @@ void Sprite3::distort_draw_common(SharedRenderState* render_state, ScopedProfile glBindFramebuffer(GL_READ_FRAMEBUFFER, render_state->render_fb); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_distort_ogl.fbo); - glBlitFramebuffer(render_state->draw_offset_x, // srcX0 - render_state->draw_offset_y, // srcY0 - render_state->draw_offset_x + render_state->draw_region_w, // srcX1 - render_state->draw_offset_y + render_state->draw_region_h, // srcY1 - 0, // dstX0 - 0, // dstY0 - m_distort_ogl.fbo_width, // dstX1 - m_distort_ogl.fbo_height, // dstY1 - GL_COLOR_BUFFER_BIT, // mask - GL_NEAREST // filter + glBlitFramebuffer(render_state->render_fb_x, // srcX0 + render_state->render_fb_y, // srcY0 + render_state->render_fb_x + render_state->render_fb_w, // srcX1 + render_state->render_fb_y + render_state->render_fb_h, // srcY1 + 0, // dstX0 + 0, // dstY0 + m_distort_ogl.fbo_width, // dstX1 + m_distort_ogl.fbo_height, // dstY1 + GL_COLOR_BUFFER_BIT, // mask + GL_NEAREST // filter ); glBindFramebuffer(GL_FRAMEBUFFER, render_state->render_fb); @@ -741,10 +741,10 @@ void Sprite3::distort_draw_common(SharedRenderState* render_state, ScopedProfile void Sprite3::distort_setup_framebuffer_dims(SharedRenderState* render_state) { // Distort framebuffer must be the same dimensions as the default window framebuffer - if (m_distort_ogl.fbo_width != render_state->draw_region_w || - m_distort_ogl.fbo_height != render_state->draw_region_h) { - m_distort_ogl.fbo_width = render_state->draw_region_w; - m_distort_ogl.fbo_height = render_state->draw_region_h; + if (m_distort_ogl.fbo_width != render_state->render_fb_w || + m_distort_ogl.fbo_height != render_state->render_fb_h) { + m_distort_ogl.fbo_width = render_state->render_fb_w; + m_distort_ogl.fbo_height = render_state->render_fb_h; glBindTexture(GL_TEXTURE_2D, m_distort_ogl.fbo_texture); diff --git a/game/graphics/pipelines/opengl.cpp b/game/graphics/pipelines/opengl.cpp index b74001b8f0..5889f3d122 100644 --- a/game/graphics/pipelines/opengl.cpp +++ b/game/graphics/pipelines/opengl.cpp @@ -283,8 +283,8 @@ void render_game_frame(int game_width, options.game_res_h = game_height; options.window_framebuffer_width = window_fb_width; options.window_framebuffer_height = window_fb_height; - options.draw_region_height = draw_region_height; options.draw_region_width = draw_region_width; + options.draw_region_height = draw_region_height; options.msaa_samples = msaa_samples; options.draw_render_debug_window = g_gfx_data->debug_gui.should_draw_render_debug(); options.draw_profiler_window = g_gfx_data->debug_gui.should_draw_profiler(); @@ -548,7 +548,6 @@ void GLDisplay::render() { // switch vsync modes, if requested if (Gfx::g_global_settings.vsync != Gfx::g_global_settings.old_vsync) { - lg::error("changed vsync"); Gfx::g_global_settings.old_vsync = Gfx::g_global_settings.vsync; glfwSwapInterval(Gfx::g_global_settings.vsync); } diff --git a/goal_src/jak1/pc/pckernel-h.gc b/goal_src/jak1/pc/pckernel-h.gc index 13dff4c169..1ca271ef7a 100644 --- a/goal_src/jak1/pc/pckernel-h.gc +++ b/goal_src/jak1/pc/pckernel-h.gc @@ -31,7 +31,7 @@ (defglobalconstant PC_KERNEL_VERSION_BUILD #x0001) (defglobalconstant PC_KERNEL_VERSION_REVISION #x0001) -(defglobalconstant PC_KERNEL_VERSION_MINOR #x0009) +(defglobalconstant PC_KERNEL_VERSION_MINOR #x000a) (defglobalconstant PC_KERNEL_VERSION_MAJOR #x0001) (defglobalconstant PC_KERNEL_VERSION (logior (ash PC_KERNEL_VERSION_MAJOR 48) @@ -462,7 +462,7 @@ (set! (-> obj ps2-hints?) #t) (set! (-> obj ps2-lod-dist?) #f) - (set! (-> obj force-envmap?) #t) + (set! (-> obj force-envmap?) #f) (set! (-> obj shrub-dist-mod) 1.0) (set! (-> obj lod-dist-mod) 1.0) (set! (-> obj lod-force-tfrag) 0)