i965/fs: Get rid of fs_visitor::do_dual_src.
authorFrancisco Jerez <currojerez@riseup.net>
Thu, 21 Jul 2016 19:46:04 +0000 (12:46 -0700)
committerFrancisco Jerez <currojerez@riseup.net>
Fri, 26 Aug 2016 01:36:00 +0000 (18:36 -0700)
This boolean flag was being used for two different things:

 - To set the brw_wm_prog_data::dual_src_blend flag.  Instead we can
   just set it based on whether the dual_src_output register is valid,
   which will be the case if the shader writes the secondary blending
   color.

 - To decide whether to call emit_single_fb_write() once, or in a loop
   that would iterate only once, which seems pretty useless.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_fs.h
src/mesa/drivers/dri/i965/brw_fs_nir.cpp
src/mesa/drivers/dri/i965/brw_fs_visitor.cpp

index 8b1ea798d908d0f592ecee84b660ef97a50cb28e..86e85db24ab8ce9a454049b70def98c97c2dba39 100644 (file)
@@ -316,7 +316,6 @@ public:
    fs_reg sample_mask;
    fs_reg outputs[VARYING_SLOT_MAX];
    fs_reg dual_src_output;
-   bool do_dual_src;
    int first_non_payload_grf;
    /** Either BRW_MAX_GRF or GEN7_MRF_HACK_START */
    unsigned max_grf;
index c278bd4c00bc0e8587bb9e3fc0ed60d55dbc25e0..d01c4b08052fef5d7d9d707e7ed37fa75d59aaca 100644 (file)
@@ -103,12 +103,10 @@ fs_visitor::nir_setup_outputs()
          if (key->force_dual_color_blend &&
              var->data.location == FRAG_RESULT_DATA1) {
             this->dual_src_output = reg;
-            this->do_dual_src = true;
          } else if (var->data.index > 0) {
             assert(var->data.location == FRAG_RESULT_DATA0);
             assert(var->data.index == 1);
             this->dual_src_output = reg;
-            this->do_dual_src = true;
          } else if (var->data.location == FRAG_RESULT_COLOR) {
             /* Writing gl_FragColor outputs to all color regions. */
             for (unsigned int i = 0; i < MAX2(key->nr_color_regions, 1); i++) {
index 4e0db06ca628992b526d0fa441970d63a460d503..cfb5bb65e26a27ea6cb452454f518b76df5180d0 100644 (file)
@@ -469,33 +469,25 @@ fs_visitor::emit_fb_writes()
                            "in SIMD16+ mode.\n");
    }
 
-   if (do_dual_src) {
-      const fs_builder abld = bld.annotate("FB dual-source write");
+   for (int target = 0; target < key->nr_color_regions; target++) {
+      /* Skip over outputs that weren't written. */
+      if (this->outputs[target].file == BAD_FILE)
+         continue;
 
-      inst = emit_single_fb_write(abld, this->outputs[0],
-                                  this->dual_src_output, reg_undef, 4);
-      inst->target = 0;
-
-      prog_data->dual_src_blend = true;
-   } else {
-      for (int target = 0; target < key->nr_color_regions; target++) {
-         /* Skip over outputs that weren't written. */
-         if (this->outputs[target].file == BAD_FILE)
-            continue;
+      const fs_builder abld = bld.annotate(
+         ralloc_asprintf(this->mem_ctx, "FB write target %d", target));
 
-         const fs_builder abld = bld.annotate(
-            ralloc_asprintf(this->mem_ctx, "FB write target %d", target));
+      fs_reg src0_alpha;
+      if (devinfo->gen >= 6 && key->replicate_alpha && target != 0)
+         src0_alpha = offset(outputs[0], bld, 3);
 
-         fs_reg src0_alpha;
-         if (devinfo->gen >= 6 && key->replicate_alpha && target != 0)
-            src0_alpha = offset(outputs[0], bld, 3);
-
-         inst = emit_single_fb_write(abld, this->outputs[target], reg_undef,
-                                     src0_alpha, 4);
-         inst->target = target;
-      }
+      inst = emit_single_fb_write(abld, this->outputs[target],
+                                  this->dual_src_output, src0_alpha, 4);
+      inst->target = target;
    }
 
+   prog_data->dual_src_blend = (this->dual_src_output.file != BAD_FILE);
+
    if (inst == NULL) {
       /* Even if there's no color buffers enabled, we still need to send
        * alpha out the pipeline to our null renderbuffer to support
@@ -946,7 +938,6 @@ fs_visitor::init()
    this->promoted_constants = 0,
 
    this->spilled_any_registers = false;
-   this->do_dual_src = false;
 }
 
 fs_visitor::~fs_visitor()