From d7af0f0d3014640301a29bdbaf5c6500e5f00d98 Mon Sep 17 00:00:00 2001 From: water111 <48171810+water111@users.noreply.github.com> Date: Tue, 23 Aug 2022 20:37:59 -0400 Subject: [PATCH] fix opengl error when screenshotting with msaa off (#1795) --- decompiler/types2/ForwardProp.cpp | 3 ++- game/graphics/opengl_renderer/OpenGLRenderer.cpp | 10 +++++++--- game/graphics/opengl_renderer/OpenGLRenderer.h | 8 +++++++- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/decompiler/types2/ForwardProp.cpp b/decompiler/types2/ForwardProp.cpp index 7b1936d25..d4ea91ab3 100644 --- a/decompiler/types2/ForwardProp.cpp +++ b/decompiler/types2/ForwardProp.cpp @@ -1231,7 +1231,8 @@ void types2_for_add(types2::Type& type_out, TP_Type::make_from_ts(coerce_to_reg_type(filtered_results.front().result_type)); return; } else { - ASSERT(false); + types2_from_ambiguous_deref(output_instr, type_out, filtered_results, extras.tags_locked); + return; } } diff --git a/game/graphics/opengl_renderer/OpenGLRenderer.cpp b/game/graphics/opengl_renderer/OpenGLRenderer.cpp index 5fe616472..e9f0f5257 100644 --- a/game/graphics/opengl_renderer/OpenGLRenderer.cpp +++ b/game/graphics/opengl_renderer/OpenGLRenderer.cpp @@ -378,15 +378,18 @@ void OpenGLRenderer::render(DmaFollower dma, const RenderOptions& settings) { if (settings.save_screenshot) { Fbo* screenshot_src; + int read_buffer; // can't screenshot from a multisampled buffer directly - if (m_fbo_state.resources.resolve_buffer.valid) { screenshot_src = &m_fbo_state.resources.resolve_buffer; + read_buffer = GL_COLOR_ATTACHMENT0; } else { screenshot_src = m_fbo_state.render_fbo; + read_buffer = GL_FRONT; } finish_screenshot(settings.screenshot_path, screenshot_src->width, screenshot_src->height, 0, 0, - screenshot_src->fbo_id); + screenshot_src->fbo_id, read_buffer); } if (settings.gpu_sync) { glFinish(); @@ -709,13 +712,14 @@ void OpenGLRenderer::finish_screenshot(const std::string& output_name, int height, int x, int y, - GLuint fbo) { + GLuint fbo, + int read_buffer) { std::vector buffer(width * height); glPixelStorei(GL_PACK_ALIGNMENT, 1); GLint oldbuf; glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &oldbuf); glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo); - glReadBuffer(GL_COLOR_ATTACHMENT0); + glReadBuffer(read_buffer); glReadPixels(x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer.data()); // flip upside down in place for (int h = 0; h < height / 2; h++) { diff --git a/game/graphics/opengl_renderer/OpenGLRenderer.h b/game/graphics/opengl_renderer/OpenGLRenderer.h index dc974a773..1401aec1e 100644 --- a/game/graphics/opengl_renderer/OpenGLRenderer.h +++ b/game/graphics/opengl_renderer/OpenGLRenderer.h @@ -110,7 +110,13 @@ class OpenGLRenderer { void do_pcrtc_effects(float alp, SharedRenderState* render_state, ScopedProfilerNode& prof); void init_bucket_renderers(); void draw_renderer_selection_window(); - void finish_screenshot(const std::string& output_name, int px, int py, int x, int y, GLuint fbo); + void finish_screenshot(const std::string& output_name, + int px, + int py, + int x, + int y, + GLuint fbo, + int read_buffer); template T* init_bucket_renderer(const std::string& name, BucketCategory cat,