summaryrefslogtreecommitdiffstats
path: root/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2018-11-11 17:28:20 +0100
committerGitHub <noreply@github.com>2018-11-11 17:28:20 +0100
commiteaee73f95d4785c36a7e81f1f087e0be52de7e17 (patch)
tree7350b90238e7fc2325bb8ca1eeab34858c2b595b /src/video_core/renderer_opengl/gl_shader_decompiler.cpp
parentMerge pull request #1663 from lioncash/raster (diff)
parentgl_shader_decompiler: Guard out of bound geometry shader input reads (diff)
downloadyuzu-eaee73f95d4785c36a7e81f1f087e0be52de7e17.tar
yuzu-eaee73f95d4785c36a7e81f1f087e0be52de7e17.tar.gz
yuzu-eaee73f95d4785c36a7e81f1f087e0be52de7e17.tar.bz2
yuzu-eaee73f95d4785c36a7e81f1f087e0be52de7e17.tar.lz
yuzu-eaee73f95d4785c36a7e81f1f087e0be52de7e17.tar.xz
yuzu-eaee73f95d4785c36a7e81f1f087e0be52de7e17.tar.zst
yuzu-eaee73f95d4785c36a7e81f1f087e0be52de7e17.zip
Diffstat (limited to 'src/video_core/renderer_opengl/gl_shader_decompiler.cpp')
-rw-r--r--src/video_core/renderer_opengl/gl_shader_decompiler.cpp14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
index f6a879a7b..5fde22ad4 100644
--- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
@@ -494,10 +494,10 @@ public:
// instruction for now.
if (stage == Maxwell3D::Regs::ShaderStage::Geometry) {
// TODO(Rodrigo): nouveau sets some attributes after setting emitting a geometry
- // shader. These instructions use a dirty register as buffer index. To avoid some
- // drivers from complaining for the out of boundary writes, guard them.
- const std::string buf_index{"min(" + GetRegisterAsInteger(buf_reg) + ", " +
- std::to_string(MAX_GEOMETRY_BUFFERS - 1) + ')'};
+ // shader. These instructions use a dirty register as buffer index, to avoid some
+ // drivers from complaining about out of boundary writes, guard them.
+ const std::string buf_index{"((" + GetRegisterAsInteger(buf_reg) + ") % " +
+ std::to_string(MAX_GEOMETRY_BUFFERS) + ')'};
shader.AddLine("amem[" + buf_index + "][" +
std::to_string(static_cast<u32>(attribute)) + ']' +
GetSwizzle(elem) + " = " + src + ';');
@@ -811,7 +811,11 @@ private:
std::optional<Register> vertex = {}) {
auto GeometryPass = [&](const std::string& name) {
if (stage == Maxwell3D::Regs::ShaderStage::Geometry && vertex) {
- return "gs_" + name + '[' + GetRegisterAsInteger(*vertex, 0, false) + ']';
+ // TODO(Rodrigo): Guard geometry inputs against out of bound reads. Some games set
+ // an 0x80000000 index for those and the shader fails to build. Find out why this
+ // happens and what's its intent.
+ return "gs_" + name + '[' + GetRegisterAsInteger(*vertex, 0, false) +
+ " % MAX_VERTEX_INPUT]";
}
return name;
};