i965/fs: Fix ir_txs in emit_texture_gen4_simd16().
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 18 Jun 2015 20:55:52 +0000 (13:55 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Fri, 26 Jun 2015 22:57:03 +0000 (15:57 -0700)
We were not emitting the LOD, which led to message lengths of 1 instead
of 3.  Setting has_lod makes us emit the LOD, but I had to make changes
to avoid emitting the non-existent coordinate as well.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=91022
Cc: mesa-stable@lists.freedesktop.org
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
src/mesa/drivers/dri/i965/brw_fs_visitor.cpp

index 9a4bad6bcf580f220565eacb6c2b70508d7ec9f3..4e13199eec086ca6833aea2da83fb004fbaf6003 100644 (file)
@@ -247,7 +247,7 @@ fs_visitor::emit_texture_gen4_simd16(ir_texture_opcode op, fs_reg dst,
                                      uint32_t sampler)
 {
    fs_reg message(MRF, 2, BRW_REGISTER_TYPE_F, dispatch_width);
-   bool has_lod = op == ir_txl || op == ir_txb || op == ir_txf;
+   bool has_lod = op == ir_txl || op == ir_txb || op == ir_txf || op == ir_txs;
 
    if (has_lod && shadow_c.file != BAD_FILE)
       no16("TXB and TXL with shadow comparison unsupported in SIMD16.");
@@ -264,14 +264,15 @@ fs_visitor::emit_texture_gen4_simd16(ir_texture_opcode op, fs_reg dst,
    fs_reg msg_end = offset(message, vector_elements);
 
    /* Messages other than sample and ld require all three components */
-   if (has_lod || shadow_c.file != BAD_FILE) {
+   if (vector_elements > 0 && (has_lod || shadow_c.file != BAD_FILE)) {
       for (int i = vector_elements; i < 3; i++) {
          bld.MOV(offset(message, i), fs_reg(0.0f));
       }
+      msg_end = offset(message, 3);
    }
 
    if (has_lod) {
-      fs_reg msg_lod = retype(offset(message, 3), op == ir_txf ?
+      fs_reg msg_lod = retype(msg_end, op == ir_txf ?
                               BRW_REGISTER_TYPE_UD : BRW_REGISTER_TYPE_F);
       bld.MOV(msg_lod, lod);
       msg_end = offset(msg_lod, 1);