From c7ff1e726c6243e495608d433c5ab9b31df3aee4 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 10 May 2026 20:17:21 +0300 Subject: [PATCH] gl: Implement emulated Z comparison support --- rpcs3/Emu/RSX/GL/GLDraw.cpp | 9 +++++++++ rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp | 6 ++++++ rpcs3/Emu/RSX/GL/GLProgramBuffer.h | 7 +++++++ rpcs3/Emu/RSX/GL/GLTextureCache.h | 8 ++------ rpcs3/Emu/RSX/GL/glutils/barriers.h | 16 ++++++++++++++++ rpcs3/GLGSRender.vcxproj | 1 + rpcs3/GLGSRender.vcxproj.filters | 3 +++ 7 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 rpcs3/Emu/RSX/GL/glutils/barriers.h diff --git a/rpcs3/Emu/RSX/GL/GLDraw.cpp b/rpcs3/Emu/RSX/GL/GLDraw.cpp index c57eba811e..57a9b08a17 100644 --- a/rpcs3/Emu/RSX/GL/GLDraw.cpp +++ b/rpcs3/Emu/RSX/GL/GLDraw.cpp @@ -543,6 +543,15 @@ void GLGSRender::bind_texture_env() cmd->bind_texture(GL_VERTEX_TEXTURES_START + i, GL_TEXTURE_2D, GL_NONE); } } + + if (current_fragment_program.ctrl & RSX_SHADER_CONTROL_EMULATE_DEPTH_COMPARE) + { + ensure(m_rtts.m_bound_depth_stencil.first, "Invalid FBO setup"); + gl::insert_texture_barrier(); + + auto view = m_rtts.m_bound_depth_stencil.second->get_view(rsx::default_remap_vector, gl::image_aspect::depth); + view->bind(cmd, GL_TEMP_IMAGE_SLOT(0)); + } } void GLGSRender::bind_interpreter_texture_env() diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp index 5271390af9..efac22b3ed 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp @@ -167,6 +167,11 @@ void GLFragmentDecompilerThread::insertConstants(std::stringstream & OS) } } + if (m_prog.ctrl & RSX_SHADER_CONTROL_EMULATE_DEPTH_COMPARE) + { + OS << "uniform sampler2D frag_depth;\n"; + } + OS << "\n"; if (!properties.constant_offsets.empty()) @@ -238,6 +243,7 @@ void GLFragmentDecompilerThread::insertGlobalFunctions(std::stringstream &OS) m_shader_props.require_shadowProj_ops = properties.shadow_sampler_mask != 0 && properties.has_texShadowProj; m_shader_props.require_alpha_kill = !!(m_prog.ctrl & RSX_SHADER_CONTROL_TEXTURE_ALPHA_KILL); m_shader_props.require_color_format_convert = !!(m_prog.ctrl & RSX_SHADER_CONTROL_TEXTURE_FORMAT_CONVERT); + m_shader_props.emulate_depth_compare = !!(m_prog.ctrl & RSX_SHADER_CONTROL_EMULATE_DEPTH_COMPARE); glsl::insert_glsl_legacy_function(OS, m_shader_props); } diff --git a/rpcs3/Emu/RSX/GL/GLProgramBuffer.h b/rpcs3/Emu/RSX/GL/GLProgramBuffer.h index 8dd34caacd..615e2e4b6d 100644 --- a/rpcs3/Emu/RSX/GL/GLProgramBuffer.h +++ b/rpcs3/Emu/RSX/GL/GLProgramBuffer.h @@ -101,6 +101,13 @@ struct GLTraits // Bind locations 0 and 1 to the stream buffers program->uniforms[0] = GL_STREAM_BUFFER_START + 0; program->uniforms[1] = GL_STREAM_BUFFER_START + 1; + + // Optional inputs + int location = 0; + if (program->uniforms.has_location("frag_depth", &location)) + { + program->uniforms[location] = GL_TEMP_IMAGE_SLOT(0); + } }; auto pipeline = compiler->compile(flags, post_create_func, post_link_func, callback); diff --git a/rpcs3/Emu/RSX/GL/GLTextureCache.h b/rpcs3/Emu/RSX/GL/GLTextureCache.h index 93c0ba2f5c..48a4ba98a0 100644 --- a/rpcs3/Emu/RSX/GL/GLTextureCache.h +++ b/rpcs3/Emu/RSX/GL/GLTextureCache.h @@ -2,6 +2,7 @@ #include "Emu/RSX/GL/GLTexture.h" #include "GLRenderTargets.h" +#include "glutils/barriers.h" #include "glutils/blitter.h" #include "glutils/sync.hpp" @@ -804,12 +805,7 @@ namespace gl void insert_texture_barrier(gl::command_context&, gl::texture*, bool) override { - auto &caps = gl::get_driver_caps(); - - if (caps.ARB_texture_barrier_supported) - glTextureBarrier(); - else if (caps.NV_texture_barrier_supported) - glTextureBarrierNV(); + gl::insert_texture_barrier(); } bool render_target_format_is_compatible(gl::texture* tex, u32 gcm_format) override diff --git a/rpcs3/Emu/RSX/GL/glutils/barriers.h b/rpcs3/Emu/RSX/GL/glutils/barriers.h new file mode 100644 index 0000000000..920e4c7088 --- /dev/null +++ b/rpcs3/Emu/RSX/GL/glutils/barriers.h @@ -0,0 +1,16 @@ +#pragma once + +#include "common.h" + +namespace gl +{ + static inline void insert_texture_barrier() + { + auto& caps = gl::get_driver_caps(); + + if (caps.ARB_texture_barrier_supported) + glTextureBarrier(); + else if (caps.NV_texture_barrier_supported) + glTextureBarrierNV(); + } +} diff --git a/rpcs3/GLGSRender.vcxproj b/rpcs3/GLGSRender.vcxproj index dbaffc5d00..8d6ba02dd9 100644 --- a/rpcs3/GLGSRender.vcxproj +++ b/rpcs3/GLGSRender.vcxproj @@ -61,6 +61,7 @@ + diff --git a/rpcs3/GLGSRender.vcxproj.filters b/rpcs3/GLGSRender.vcxproj.filters index 4866b14643..c4fe752d10 100644 --- a/rpcs3/GLGSRender.vcxproj.filters +++ b/rpcs3/GLGSRender.vcxproj.filters @@ -122,6 +122,9 @@ + + glutils +