i965: Always emit alpha when nr_color_buffers == 0.
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 12 Jul 2012 18:25:58 +0000 (11:25 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 12 Jul 2012 20:35:46 +0000 (13:35 -0700)
If alpha-testing is enabled, we need to send alpha down the pipeline
even if nr_color_buffers == 0.  However, tracking whether alpha-testing
is enabled in the WM program key is expensive: it causes us to compile
multiple specializations of the same shader, using program cache space.

This patch removes the check for alpha-testing, and simply emits alpha
whenever nr_color_buffers == 0.  We believe this will also be necessary
for alpha-to-coverage, and it should add minimal overhead to an uncommon
case.  Saving the recompiles should more than make up the difference.

Reviewed-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
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 7224cbe04f569f9d667d1e6f7688a345d4cba885..08c0130aa3e995ded32cdd9409848e646a8e7e9f 100644 (file)
@@ -2141,13 +2141,11 @@ fs_visitor::emit_fb_writes()
    }
 
    if (c->key.nr_color_regions == 0) {
-      if (c->key.alpha_test) {
-        /* If the alpha test is enabled but there's no color buffer,
-         * we still need to send alpha out the pipeline to our null
-         * renderbuffer.
-         */
-        emit_color_write(0, 3, color_mrf);
-      }
+      /* Even if there's no color buffers enabled, we still need to send
+       * alpha out the pipeline to our null renderbuffer to support
+       * alpha-testing, alpha-to-coverage, and so on.
+       */
+      emit_color_write(0, 3, color_mrf);
 
       fs_inst *inst = emit(FS_OPCODE_FB_WRITE);
       inst->base_mrf = base_mrf;
index 880564619c85909ace55eb7e8ac2b5f624115ae0..7194a739d08d68f0347958ab5e0c170d6542a18c 100644 (file)
@@ -449,10 +449,8 @@ static void brw_wm_populate_key( struct brw_context *brw,
 
    /* Build the index for table lookup
     */
-   /* _NEW_COLOR */
-   key->alpha_test = ctx->Color.AlphaEnabled;
-
    if (intel->gen < 6) {
+      /* _NEW_COLOR */
       if (fp->program.UsesKill || ctx->Color.AlphaEnabled)
         lookup |= IZ_PS_KILL_ALPHATEST_BIT;
 
index 2cde2a0f53721ade5d4acef4908d1e432cc59182..b976a605cb6f4ac1300acf08235fb02957b2badb 100644 (file)
@@ -65,7 +65,6 @@ struct brw_wm_prog_key {
    GLuint flat_shade:1;
    GLuint nr_color_regions:5;
    GLuint render_to_fbo:1;
-   GLuint alpha_test:1;
    GLuint clamp_fragment_color:1;
    GLuint line_aa:2;