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
+