Include src0 alpha in the RT write message when using MRT, so it is used
for the alpha test instead of the normal per-RT alpha value.

Fixes broken rendering in Dota2 under Wine [FDO #62647] -- but not
tested against much else.

Signed-off-by: Chris Forbes <chr...@ijw.co.nz>
---
 src/mesa/drivers/dri/i965/brw_fs_emit.cpp    | 2 +-
 src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 2 +-
 src/mesa/drivers/dri/i965/brw_wm.c           | 4 ++++
 src/mesa/drivers/dri/i965/brw_wm.h           | 1 +
 4 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_fs_emit.cpp 
b/src/mesa/drivers/dri/i965/brw_fs_emit.cpp
index f390989..10f4c99 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_emit.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_emit.cpp
@@ -129,7 +129,7 @@ fs_generator::generate_fb_write(fs_inst *inst)
 
          if (inst->target > 0 &&
             c->key.nr_color_regions > 1 &&
-            c->key.sample_alpha_to_coverage) {
+            (c->key.sample_alpha_to_coverage || c->key.alpha_test)) {
             /* Set "Source0 Alpha Present to RenderTarget" bit in message
              * header.
              */
diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp 
b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
index a67b6ed..0c8dc1b 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
@@ -2255,7 +2255,7 @@ fs_visitor::emit_fb_writes()
       src0_alpha_to_render_target = intel->gen >= 6 &&
                                    !do_dual_src &&
                                    c->key.nr_color_regions > 1 &&
-                                   c->key.sample_alpha_to_coverage;
+                                   (c->key.sample_alpha_to_coverage || 
c->key.alpha_test);
       /* m2, m3 header */
       nr += 2;
    }
diff --git a/src/mesa/drivers/dri/i965/brw_wm.c 
b/src/mesa/drivers/dri/i965/brw_wm.c
index 6eb4a1d..3265596 100644
--- a/src/mesa/drivers/dri/i965/brw_wm.c
+++ b/src/mesa/drivers/dri/i965/brw_wm.c
@@ -279,6 +279,8 @@ brw_wm_debug_recompile(struct brw_context *brw,
                       old_key->nr_color_regions, key->nr_color_regions);
    found |= key_debug(intel, "sample alpha to coverage",
                       old_key->sample_alpha_to_coverage, 
key->sample_alpha_to_coverage);
+   found |= key_debug(intel, "MRT alpha test w/a",
+                      old_key->alpha_test, key->alpha_test);
    found |= key_debug(intel, "rendering to FBO",
                       old_key->render_to_fbo, key->render_to_fbo);
    found |= key_debug(intel, "fragment color clamping",
@@ -463,6 +465,8 @@ static void brw_wm_populate_key( struct brw_context *brw,
    key->nr_color_regions = ctx->DrawBuffer->_NumColorDrawBuffers;
   /* _NEW_MULTISAMPLE */
    key->sample_alpha_to_coverage = ctx->Multisample.SampleAlphaToCoverage;
+   /* _NEW_COLOR */
+   key->alpha_test = ctx->Color.AlphaEnabled;
 
    /* BRW_NEW_VUE_MAP_GEOM_OUT */
    if (intel->gen < 6)
diff --git a/src/mesa/drivers/dri/i965/brw_wm.h 
b/src/mesa/drivers/dri/i965/brw_wm.h
index 28e8734..13b17d0 100644
--- a/src/mesa/drivers/dri/i965/brw_wm.h
+++ b/src/mesa/drivers/dri/i965/brw_wm.h
@@ -63,6 +63,7 @@ struct brw_wm_prog_key {
    GLuint flat_shade:1;
    GLuint nr_color_regions:5;
    GLuint sample_alpha_to_coverage:1;
+   GLuint alpha_test:1;
    GLuint render_to_fbo:1;
    GLuint clamp_fragment_color:1;
    GLuint line_aa:2;
-- 
1.8.3.2

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to