From fab39a6495e2183d5c11965507fef232534d97fc Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 8 Feb 2025 21:45:54 +0300 Subject: [PATCH] gl: Add support for "hw MSAA resolve" option --- rpcs3/Emu/RSX/GL/GLResolveHelper.cpp | 39 ++++++++++++++-------------- rpcs3/Emu/RSX/GL/GLResolveHelper.h | 4 +-- rpcs3/Emu/RSX/GL/glutils/fbo.h | 4 ++- rpcs3/Emu/RSX/GL/glutils/image.h | 3 ++- 4 files changed, 26 insertions(+), 24 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLResolveHelper.cpp b/rpcs3/Emu/RSX/GL/GLResolveHelper.cpp index 54899a2230..64779ec48a 100644 --- a/rpcs3/Emu/RSX/GL/GLResolveHelper.cpp +++ b/rpcs3/Emu/RSX/GL/GLResolveHelper.cpp @@ -259,16 +259,23 @@ namespace gl if (m_config.resolve_depth && m_config.resolve_stencil) { fs_src = m_config.is_unresolve ? depth_stencil_unresolver : depth_stencil_resolver; + m_write_aspect_mask = gl::image_aspect::depth | gl::image_aspect::stencil; } else if (m_config.resolve_depth) { fs_src = m_config.is_unresolve ? depth_unresolver : depth_resolver; + m_write_aspect_mask = gl::image_aspect::depth; } else if (m_config.resolve_stencil) { fs_src = m_config.is_unresolve ? stencil_unresolver : stencil_resolver; + m_write_aspect_mask = gl::image_aspect::stencil; } + enable_depth_writes = m_config.resolve_depth; + enable_stencil_writes = m_config.resolve_stencil; + + create(); rsx_log.notice("Resolve shader:\n%s", fs_src); @@ -300,17 +307,25 @@ namespace gl update_config(); const auto read_resource = m_config.is_unresolve ? resolve_image : msaa_image; + const auto write_resource = m_config.is_unresolve ? msaa_image : resolve_image; saved_sampler_state saved(GL_TEMP_IMAGE_SLOT(0), m_sampler); - cmd->bind_texture(GL_TEMP_IMAGE_SLOT(0), GL_TEXTURE_2D, read_resource->id()); + saved_sampler_state saved2(GL_TEMP_IMAGE_SLOT(1), m_sampler); - GLuint image_aspect_bits = 0; - if (m_config.resolve_depth) image_aspect_bits |= gl::image_aspect::depth; - if (m_config.resolve_stencil) image_aspect_bits |= gl::image_aspect::stencil; + if (m_config.resolve_depth) + { + cmd->bind_texture(GL_TEMP_IMAGE_SLOT(0), static_cast(read_resource->get_target()), read_resource->id(), GL_TRUE); + } + + if (m_config.resolve_stencil) + { + auto stencil_view = read_resource->get_view(rsx::default_remap_vector.with_encoding(gl::GL_REMAP_IDENTITY), gl::image_aspect::stencil); + cmd->bind_texture(GL_TEMP_IMAGE_SLOT(1), static_cast(read_resource->get_target()), stencil_view->id(), GL_TRUE); + } areau viewport{}; viewport.x2 = msaa_image->width(); viewport.y2 = msaa_image->height(); - overlay_pass::run(cmd, viewport, GL_NONE, image_aspect_bits, false); + overlay_pass::run(cmd, viewport, write_resource->id(), m_write_aspect_mask, false); } void stencil_only_resolver_base::emit_geometry(gl::command_context& cmd) @@ -331,18 +346,4 @@ namespace gl glBindVertexArray(old_vao); } - - void stencil_only_resolver_base::run(gl::command_context& cmd, gl::viewable_image* msaa_image, gl::viewable_image* resolve_image) - { - const auto read_resource = m_config.is_unresolve ? resolve_image : msaa_image; - auto stencil_view = read_resource->get_view(rsx::default_remap_vector.with_encoding(gl::GL_REMAP_IDENTITY), gl::image_aspect::stencil); - - saved_sampler_state saved(GL_TEMP_IMAGE_SLOT(0), m_sampler); - cmd->bind_texture(GL_TEMP_IMAGE_SLOT(0), GL_TEXTURE_2D, stencil_view->id()); - - areau viewport{}; - viewport.x2 = msaa_image->width(); - viewport.y2 = msaa_image->height(); - overlay_pass::run(cmd, viewport, GL_NONE, gl::image_aspect::stencil, false); - } } diff --git a/rpcs3/Emu/RSX/GL/GLResolveHelper.h b/rpcs3/Emu/RSX/GL/GLResolveHelper.h index 539903516d..d3fbcf79fb 100644 --- a/rpcs3/Emu/RSX/GL/GLResolveHelper.h +++ b/rpcs3/Emu/RSX/GL/GLResolveHelper.h @@ -63,7 +63,7 @@ namespace gl void update_config(); - virtual void run(gl::command_context& cmd, gl::viewable_image* msaa_image, gl::viewable_image* resolve_image); + void run(gl::command_context& cmd, gl::viewable_image* msaa_image, gl::viewable_image* resolve_image); }; struct depth_only_resolver : ds_resolve_pass_base @@ -92,8 +92,6 @@ namespace gl } void emit_geometry(gl::command_context& cmd) override; - - void run(gl::command_context& cmd, gl::viewable_image* msaa_image, gl::viewable_image* resolve_image) override; }; struct stencil_only_resolver : stencil_only_resolver_base diff --git a/rpcs3/Emu/RSX/GL/glutils/fbo.h b/rpcs3/Emu/RSX/GL/glutils/fbo.h index 9837c425cd..ef71bfa469 100644 --- a/rpcs3/Emu/RSX/GL/glutils/fbo.h +++ b/rpcs3/Emu/RSX/GL/glutils/fbo.h @@ -125,7 +125,9 @@ namespace gl void operator = (const texture& rhs) { - ensure(rhs.get_target() == texture::target::texture2D); + ensure(rhs.get_target() == texture::target::texture2D || + rhs.get_target() == texture::target::texture2DMS); + m_parent.m_resource_bindings[m_id] = rhs.id(); DSA_CALL2(NamedFramebufferTexture, m_parent.id(), m_id, rhs.id(), 0); } diff --git a/rpcs3/Emu/RSX/GL/glutils/image.h b/rpcs3/Emu/RSX/GL/glutils/image.h index be4277faa4..896c3ee088 100644 --- a/rpcs3/Emu/RSX/GL/glutils/image.h +++ b/rpcs3/Emu/RSX/GL/glutils/image.h @@ -175,7 +175,8 @@ namespace gl texture3D = GL_TEXTURE_3D, textureCUBE = GL_TEXTURE_CUBE_MAP, textureBuffer = GL_TEXTURE_BUFFER, - texture2DArray = GL_TEXTURE_2D_ARRAY + texture2DArray = GL_TEXTURE_2D_ARRAY, + texture2DMS = GL_TEXTURE_2D_MULTISAMPLE }; protected: