i965/fs: Replace usage is_tex() with regs_written() checks.
authorEric Anholt <eric@anholt.net>
Fri, 6 Jul 2012 21:51:44 +0000 (14:51 -0700)
committerEric Anholt <eric@anholt.net>
Wed, 18 Jul 2012 19:30:06 +0000 (12:30 -0700)
In these places, we care about any sort of send that hits more than one reg,
not just textures.  We don't yet have anything else returning more than one
reg, so there's no change.

v2: Use mlen instead of is_tex() for the is-it-a-send check.

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

index c6056ad7916f8728042d8f905bc36d40bad1a791..de049d5b1bf28d0f5fdb4e6a97befcb15691abdf 100644 (file)
@@ -1063,8 +1063,10 @@ fs_visitor::split_virtual_grfs()
    foreach_list(node, &this->instructions) {
       fs_inst *inst = (fs_inst *)node;
 
-      /* Texturing produces 4 contiguous registers, so no splitting. */
-      if (inst->is_tex()) {
+      /* If there's a SEND message that requires contiguous destination
+       * registers, no splitting is allowed.
+       */
+      if (inst->regs_written() > 1) {
         split_grf[inst->dst.reg] = false;
       }
    }
@@ -1400,7 +1402,7 @@ fs_visitor::propagate_constants()
         if (scan_inst->dst.file == GRF &&
             scan_inst->dst.reg == inst->dst.reg &&
             (scan_inst->dst.reg_offset == inst->dst.reg_offset ||
-             scan_inst->is_tex())) {
+             scan_inst->regs_written() > 1)) {
            break;
         }
       }
@@ -1602,14 +1604,14 @@ fs_visitor::register_coalesce()
         if (scan_inst->dst.file == GRF) {
            if (scan_inst->dst.reg == inst->dst.reg &&
                (scan_inst->dst.reg_offset == inst->dst.reg_offset ||
-                scan_inst->is_tex())) {
+                scan_inst->regs_written() > 1)) {
               interfered = true;
               break;
            }
            if (inst->src[0].file == GRF &&
                scan_inst->dst.reg == inst->src[0].reg &&
                (scan_inst->dst.reg_offset == inst->src[0].reg_offset ||
-                scan_inst->is_tex())) {
+                scan_inst->regs_written() > 1)) {
               interfered = true;
               break;
            }
@@ -1729,10 +1731,8 @@ fs_visitor::compute_to_mrf()
             * into a compute-to-MRF.
             */
 
-           if (scan_inst->is_tex()) {
-              /* texturing writes several continuous regs, so we can't
-               * compute-to-mrf that.
-               */
+            /* SENDs can only write to GRFs, so no compute-to-MRF. */
+           if (scan_inst->mlen) {
               break;
            }