i965: fix alpha test for MRT
authorChris Forbes <chrisf@ijw.co.nz>
Mon, 1 Jul 2013 11:30:55 +0000 (23:30 +1200)
committerChris Forbes <chrisf@ijw.co.nz>
Sat, 6 Jul 2013 00:41:54 +0000 (12:41 +1200)
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].

No Piglit regressions on Ivybridge.

V2: reuse (and simplify) existing sample_alpha_to_coverage flag in
the FS key, rather than adding another redundant one.

Signed-off-by: Chris Forbes <chrisf@ijw.co.nz>
Reviewd-by: Paul Berry <stereotype441@gmail.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=62647
NOTE: This is a candidate for the stable branches.

src/mesa/drivers/dri/i965/brw_fs_emit.cpp
src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
src/mesa/drivers/dri/i965/brw_wm.c
src/mesa/drivers/dri/i965/brw_wm.h

index f3909891c457a5d79a95c6289d7da9577669c670..c158016ba5efd5ba30eadc0cae17820f878b3f62 100644 (file)
@@ -127,9 +127,7 @@ fs_generator::generate_fb_write(fs_inst *inst)
                 retype(brw_vec8_grf(0, 0), BRW_REGISTER_TYPE_UD));
         brw_set_compression_control(p, BRW_COMPRESSION_NONE);
 
-         if (inst->target > 0 &&
-            c->key.nr_color_regions > 1 &&
-            c->key.sample_alpha_to_coverage) {
+         if (inst->target > 0 && c->key.replicate_alpha) {
             /* Set "Source0 Alpha Present to RenderTarget" bit in message
              * header.
              */
index a67b6ed21fcf654e5a8fbc1ac5ece1bd96937627..3353f55479f0ac90fce4f9b5dfeda355e15d0036 100644 (file)
@@ -2254,8 +2254,7 @@ fs_visitor::emit_fb_writes()
    if (header_present) {
       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.replicate_alpha;
       /* m2, m3 header */
       nr += 2;
    }
index 6eb4a1dd10564ce7797672b6faba948234e9516a..5f681f6caf3578647663104b92457f0eb7d3f79c 100644 (file)
@@ -277,8 +277,8 @@ brw_wm_debug_recompile(struct brw_context *brw,
                       old_key->flat_shade, key->flat_shade);
    found |= key_debug(intel, "number of color buffers",
                       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 or alpha-to-coverage",
+                      old_key->replicate_alpha, key->replicate_alpha);
    found |= key_debug(intel, "rendering to FBO",
                       old_key->render_to_fbo, key->render_to_fbo);
    found |= key_debug(intel, "fragment color clamping",
@@ -461,8 +461,10 @@ static void brw_wm_populate_key( struct brw_context *brw,
 
    /* _NEW_BUFFERS */
    key->nr_color_regions = ctx->DrawBuffer->_NumColorDrawBuffers;
-  /* _NEW_MULTISAMPLE */
-   key->sample_alpha_to_coverage = ctx->Multisample.SampleAlphaToCoverage;
+
+   /* _NEW_MULTISAMPLE, _NEW_COLOR, _NEW_BUFFERS */
+   key->replicate_alpha = ctx->DrawBuffer->_NumColorDrawBuffers > 1 &&
+      (ctx->Multisample.SampleAlphaToCoverage || ctx->Color.AlphaEnabled);
 
    /* BRW_NEW_VUE_MAP_GEOM_OUT */
    if (intel->gen < 6)
index 2908b937d380a3d748e8a6941a65c77d86d30921..f7a2c5f234da5aaa78314cac1b8c4ae4eed3f4a1 100644 (file)
@@ -62,7 +62,7 @@ struct brw_wm_prog_key {
    GLuint stats_wm:1;
    GLuint flat_shade:1;
    GLuint nr_color_regions:5;
-   GLuint sample_alpha_to_coverage:1;
+   GLuint replicate_alpha:1;
    GLuint render_to_fbo:1;
    GLuint clamp_fragment_color:1;
    GLuint line_aa:2;