From 96d0f71a91d73dc95503b68dfa36667d224b7430 Mon Sep 17 00:00:00 2001 From: Wunkolo Date: Tue, 26 May 2026 20:04:26 -0700 Subject: [PATCH] renderer_gl: Add layer/level specifier to MSAA resolves --- src/video_core/renderer_opengl/gl_blit_helper.cpp | 10 +++++----- src/video_core/renderer_opengl/gl_blit_helper.h | 2 +- src/video_core/renderer_opengl/gl_rasterizer.cpp | 4 ++-- src/video_core/renderer_opengl/gl_texture_runtime.cpp | 4 ++-- src/video_core/renderer_opengl/gl_texture_runtime.h | 4 ++-- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/video_core/renderer_opengl/gl_blit_helper.cpp b/src/video_core/renderer_opengl/gl_blit_helper.cpp index 378d29fdf..be399bddb 100644 --- a/src/video_core/renderer_opengl/gl_blit_helper.cpp +++ b/src/video_core/renderer_opengl/gl_blit_helper.cpp @@ -162,7 +162,7 @@ bool BlitHelper::ConvertDS24S8ToRGBA8(Surface& source, Surface& dest, if (multisample) { // Resolve the destination image if needed - ResolveTexture(dest); + ResolveTexture(dest, copy.dst_level, copy.dst_layer); } return true; @@ -188,13 +188,13 @@ bool BlitHelper::ConvertRGBA4ToRGB5A1(Surface& source, Surface& dest, if (multisample) { // Resolve the destination image if needed - ResolveTexture(dest); + ResolveTexture(dest, copy.dst_level, copy.dst_layer); } return true; } -void BlitHelper::ResolveTexture(Surface& surface) { +void BlitHelper::ResolveTexture(Surface& surface, u32 level, u32 layer) { OpenGLState prev_state = OpenGLState::GetCurState(); SCOPE_EXIT({ prev_state.Apply(); }); @@ -205,8 +205,8 @@ void BlitHelper::ResolveTexture(Surface& surface) { state.texture_units[2].texture_2d = 0; state.Apply(); - surface.Attach(GL_READ_FRAMEBUFFER, 0, 0, 3); - surface.Attach(GL_DRAW_FRAMEBUFFER, 0, 0, 1); + surface.Attach(GL_READ_FRAMEBUFFER, level, layer, 3); + surface.Attach(GL_DRAW_FRAMEBUFFER, level, layer, 1); const GLbitfield buffer_mask = surface.type == SurfaceType::Depth ? GL_DEPTH_BUFFER_BIT : surface.type == SurfaceType::DepthStencil ? (GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT) diff --git a/src/video_core/renderer_opengl/gl_blit_helper.h b/src/video_core/renderer_opengl/gl_blit_helper.h index 7eab60600..e1b9c77ed 100644 --- a/src/video_core/renderer_opengl/gl_blit_helper.h +++ b/src/video_core/renderer_opengl/gl_blit_helper.h @@ -31,7 +31,7 @@ public: bool ConvertRGBA4ToRGB5A1(Surface& source, Surface& dest, const VideoCore::TextureCopy& copy); - void ResolveTexture(Surface& surface); + void ResolveTexture(Surface& surface, u32 level = 0, u32 layer = 0); private: void FilterAnime4K(Surface& surface, const VideoCore::TextureBlit& blit); diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 5d0d65687..357a9935c 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -652,14 +652,14 @@ bool RasterizerOpenGL::Draw(bool accelerate, bool is_indexed) { if (framebuffer->color_id != VideoCore::SurfaceId{}) { Surface& color_surface = res_cache.GetSurface(framebuffer->color_id); if (color_surface.GetSampleCount() > 1) { - runtime.ResolveTexture(color_surface); + runtime.ResolveTexture(color_surface, framebuffer->color_level); } } if (framebuffer->depth_id != VideoCore::SurfaceId{}) { Surface& depth_surface = res_cache.GetSurface(framebuffer->depth_id); if (depth_surface.GetSampleCount() > 1) { - runtime.ResolveTexture(depth_surface); + runtime.ResolveTexture(depth_surface, framebuffer->depth_level); } } diff --git a/src/video_core/renderer_opengl/gl_texture_runtime.cpp b/src/video_core/renderer_opengl/gl_texture_runtime.cpp index 09450f2b1..65be0e788 100644 --- a/src/video_core/renderer_opengl/gl_texture_runtime.cpp +++ b/src/video_core/renderer_opengl/gl_texture_runtime.cpp @@ -306,10 +306,10 @@ bool TextureRuntime::BlitTextures(Surface& source, Surface& dest, // Must resolve images first // Todo(wunk): Add a "dirty" flag for msaa resolves to avoid redundant image resolves if (source.sample_count > 1) { - blit_helper.ResolveTexture(source); + blit_helper.ResolveTexture(source, blit.src_level, blit.src_layer); } if (dest.sample_count > 1) { - blit_helper.ResolveTexture(dest); + blit_helper.ResolveTexture(dest, blit.dst_level, blit.dst_layer); } OpenGLState state = OpenGLState::GetCurState(); diff --git a/src/video_core/renderer_opengl/gl_texture_runtime.h b/src/video_core/renderer_opengl/gl_texture_runtime.h index acd922578..9461aeb8d 100644 --- a/src/video_core/renderer_opengl/gl_texture_runtime.h +++ b/src/video_core/renderer_opengl/gl_texture_runtime.h @@ -79,8 +79,8 @@ public: void GenerateMipmaps(Surface& surface); /// Resolve a surface's MSAA texture into the surface's appropriate non-MSAA texture - void ResolveTexture(Surface& surface) { - blit_helper.ResolveTexture(surface); + void ResolveTexture(Surface& surface, u32 level = 0, u32 layer = 0) { + blit_helper.ResolveTexture(surface, level, layer); } private: