diff options
| author | 2018-10-11 20:29:11 -0400 | |
|---|---|---|
| committer | 2018-10-22 15:35:45 -0400 | |
| commit | 8e1239fbc59325f5a9898329af869ae575ec983f (patch) | |
| tree | cf0f76b28c1c67a800c723136c7e6000d9e380f6 /src | |
| parent | Use standard UBO and fix/stylize the code (diff) | |
| download | yuzu-8e1239fbc59325f5a9898329af869ae575ec983f.tar.gz yuzu-8e1239fbc59325f5a9898329af869ae575ec983f.tar.xz yuzu-8e1239fbc59325f5a9898329af869ae575ec983f.zip | |
Assert that multiple render targets are not set while alpha testing
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 12 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.h | 3 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_decompiler.cpp | 5 |
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 | ||
| 1045 | void 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 | } |