mirror of
https://github.com/open-goal/jak-project
synced 2026-08-03 17:02:47 -04:00
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:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user