فهرست منبع

Assert that multiple render targets are not set while alpha testing

FernandoS27 7 سال پیش
والد
کامیت
8e1239fbc5

+ 12 - 0
src/video_core/renderer_opengl/gl_rasterizer.cpp

@@ -574,6 +574,7 @@ void RasterizerOpenGL::DrawArrays() {
     // Alpha Testing is synced on shaders.
     // Alpha Testing is synced on shaders.
     SyncTransformFeedback();
     SyncTransformFeedback();
     SyncPointState();
     SyncPointState();
+    CheckAlphaTests();
 
 
     // TODO(bunnei): Sync framebuffer_scale uniform here
     // TODO(bunnei): Sync framebuffer_scale uniform here
     // TODO(bunnei): Sync scissorbox uniform(s) here
     // TODO(bunnei): Sync scissorbox uniform(s) here
@@ -1041,4 +1042,15 @@ void RasterizerOpenGL::SyncPointState() {
     state.point.size = regs.point_size == 0 ? 1 : regs.point_size;
     state.point.size = regs.point_size == 0 ? 1 : regs.point_size;
 }
 }
 
 
+void RasterizerOpenGL::CheckAlphaTests() {
+    const auto& regs = Core::System::GetInstance().GPU().Maxwell3D().regs;
+
+    if (regs.alpha_test_enabled != 0 && regs.rt_control.count > 1) {
+        LOG_CRITICAL(
+            Render_OpenGL,
+            "Alpha Testing is enabled with Multiple Render Targets, this behavior is undefined.");
+        UNREACHABLE();
+    }
+}
+
 } // namespace OpenGL
 } // namespace OpenGL

+ 3 - 0
src/video_core/renderer_opengl/gl_rasterizer.h

@@ -171,6 +171,9 @@ private:
     /// Syncs the point state to match the guest state
     /// Syncs the point state to match the guest state
     void SyncPointState();
     void SyncPointState();
 
 
+    /// Check asserts for alpha testing.
+    void CheckAlphaTests();
+
     bool has_ARB_direct_state_access = false;
     bool has_ARB_direct_state_access = false;
     bool has_ARB_multi_bind = false;
     bool has_ARB_multi_bind = false;
     bool has_ARB_separate_shader_objects = false;
     bool has_ARB_separate_shader_objects = false;

+ 2 - 3
src/video_core/renderer_opengl/gl_shader_decompiler.cpp

@@ -1276,9 +1276,8 @@ private:
                 header.ps.IsColorComponentOutputEnabled(render_target, 1) ||
                 header.ps.IsColorComponentOutputEnabled(render_target, 1) ||
                 header.ps.IsColorComponentOutputEnabled(render_target, 2) ||
                 header.ps.IsColorComponentOutputEnabled(render_target, 2) ||
                 header.ps.IsColorComponentOutputEnabled(render_target, 3)) {
                 header.ps.IsColorComponentOutputEnabled(render_target, 3)) {
-                shader.AddLine(fmt::format(
-                    "if (AlphaFunc({})) discard;",
-                    regs.GetRegisterAsFloat(current_reg)));
+                shader.AddLine(fmt::format("if (!AlphaFunc({})) discard;",
+                                           regs.GetRegisterAsFloat(current_reg)));
                 current_reg += 4;
                 current_reg += 4;
             }
             }
         }
         }