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
This commit is contained in:
ManDude
2022-07-19 23:41:48 +01:00
committed by GitHub
parent bb323c2ebe
commit a8653f7595
5 changed files with 64 additions and 58 deletions
@@ -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;
@@ -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);
}
+14 -14
View File
@@ -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);
+1 -2
View File
@@ -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);
}
+2 -2
View File
@@ -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)