summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp12
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.h3
-rw-r--r--src/video_core/renderer_opengl/gl_shader_decompiler.cpp5
3 files changed, 17 insertions, 3 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index d93681813..be51c5215 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -574,6 +574,7 @@ void RasterizerOpenGL::DrawArrays() {
574 // Alpha Testing is synced on shaders. 574 // Alpha Testing is synced on shaders.
575 SyncTransformFeedback(); 575 SyncTransformFeedback();
576 SyncPointState(); 576 SyncPointState();
577 CheckAlphaTests();
577 578
578 // TODO(bunnei): Sync framebuffer_scale uniform here 579 // TODO(bunnei): Sync framebuffer_scale uniform here
579 // TODO(bunnei): Sync scissorbox uniform(s) here 580 // TODO(bunnei): Sync scissorbox uniform(s) here
@@ -1041,4 +1042,15 @@ void RasterizerOpenGL::SyncPointState() {
1041 state.point.size = regs.point_size == 0 ? 1 : regs.point_size; 1042 state.point.size = regs.point_size == 0 ? 1 : regs.point_size;
1042} 1043}
1043 1044
1045void RasterizerOpenGL::CheckAlphaTests() {
1046 const auto& regs = Core::System::GetInstance().GPU().Maxwell3D().regs;
1047
1048 if (regs.alpha_test_enabled != 0 && regs.rt_control.count > 1) {
1049 LOG_CRITICAL(
1050 Render_OpenGL,
1051 "Alpha Testing is enabled with Multiple Render Targets, this behavior is undefined.");
1052 UNREACHABLE();
1053 }
1054}
1055
1044} // namespace OpenGL 1056} // namespace OpenGL
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h
index ece5cb2c4..0e90a31f5 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer.h
@@ -171,6 +171,9 @@ private:
171 /// Syncs the point state to match the guest state 171 /// Syncs the point state to match the guest state
172 void SyncPointState(); 172 void SyncPointState();
173 173
174 /// Check asserts for alpha testing.
175 void CheckAlphaTests();
176
174 bool has_ARB_direct_state_access = false; 177 bool has_ARB_direct_state_access = false;
175 bool has_ARB_multi_bind = false; 178 bool has_ARB_multi_bind = false;
176 bool has_ARB_separate_shader_objects = false; 179 bool has_ARB_separate_shader_objects = false;
diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
index 6fdfc742b..f224cb5b2 100644
--- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
@@ -1276,9 +1276,8 @@ private:
1276 header.ps.IsColorComponentOutputEnabled(render_target, 1) || 1276 header.ps.IsColorComponentOutputEnabled(render_target, 1) ||
1277 header.ps.IsColorComponentOutputEnabled(render_target, 2) || 1277 header.ps.IsColorComponentOutputEnabled(render_target, 2) ||
1278 header.ps.IsColorComponentOutputEnabled(render_target, 3)) { 1278 header.ps.IsColorComponentOutputEnabled(render_target, 3)) {
1279 shader.AddLine(fmt::format( 1279 shader.AddLine(fmt::format("if (!AlphaFunc({})) discard;",
1280 "if (AlphaFunc({})) discard;", 1280 regs.GetRegisterAsFloat(current_reg)));
1281 regs.GetRegisterAsFloat(current_reg)));
1282 current_reg += 4; 1281 current_reg += 4;
1283 } 1282 }
1284 } 1283 }