Mesa (9.2): i965/vs: Detect GRF sources in split_virtual_grfs send-from-GRF code.

Ian Romanick idr at kemper.freedesktop.org
Wed Sep 11 19:09:07 UTC 2013


Module: Mesa
Branch: 9.2
Commit: 9dd4e1ef85edfc7a992a19b8678e9d6f8d7a6734
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=9dd4e1ef85edfc7a992a19b8678e9d6f8d7a6734

Author: Kenneth Graunke <kenneth at whitecape.org>
Date:   Wed Aug 28 11:16:27 2013 -0700

i965/vs: Detect GRF sources in split_virtual_grfs send-from-GRF code.

It is incorrect to assume that src[0] of a SEND-from-GRF opcode is the GRF.
VS_OPCODE_PULL_CONSTANT_LOAD_GEN7 uses an IMM as src[0], and stores the
GRF as src[1].

To be safe, loop over all the source registers and mark any GRFs.  We
probably won't ever have more than one, but it's simpler to just check
all three rather than attempting to bail early.

Fixes assertion failures in Unigine Sanctuary since we started making
register allocation rely on split_virtual_grfs working.  (The register
classes were actually sufficient, we were just interpreting an IMM as
a virtual GRF number.)

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=68637
Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
Reviewed-by: Eric Anholt <eric at anholt.net>
Cc: mesa-stable at lists.freedesktop.org
(cherry picked from commit 4e3d1712a223f9f0b4ff4a34b9b5447a92877347)

---

 src/mesa/drivers/dri/i965/brw_vec4.cpp |    8 ++++++--
 1 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp b/src/mesa/drivers/dri/i965/brw_vec4.cpp
index 535eca4..471499f 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp
@@ -1030,10 +1030,14 @@ vec4_visitor::split_virtual_grfs()
       vec4_instruction *inst = (vec4_instruction *)node;
 
       /* If there's a SEND message loading from a GRF on gen7+, it needs to be
-       * contiguous.  Assume that the GRF for the SEND is always in src[0].
+       * contiguous.
        */
       if (inst->is_send_from_grf()) {
-         split_grf[inst->src[0].reg] = false;
+         for (int i = 0; i < 3; i++) {
+            if (inst->src[i].file == GRF) {
+               split_grf[inst->src[i].reg] = false;
+            }
+         }
       }
    }
 




More information about the mesa-commit mailing list