i965: Add EU code for dword scattered reads (constant buffer array indexing).
authorEric Anholt <eric@anholt.net>
Mon, 25 Oct 2010 18:23:13 +0000 (11:23 -0700)
committerEric Anholt <eric@anholt.net>
Tue, 26 Oct 2010 17:34:10 +0000 (10:34 -0700)
src/mesa/drivers/dri/i965/brw_eu.h
src/mesa/drivers/dri/i965/brw_eu_emit.c

index 15c2f23d6a5c340f5c21bea714f1eff40d86399a..b4538e6e8a7a23f17e6880c1244334c71afc39f8 100644 (file)
@@ -914,6 +914,11 @@ void brw_oword_block_write_scratch(struct brw_compile *p,
                                   int num_regs,
                                   GLuint offset);
 
+void brw_dword_scattered_read(struct brw_compile *p,
+                             struct brw_reg dest,
+                             struct brw_reg mrf,
+                             uint32_t bind_table_index);
+
 void brw_dp_READ_4_vs( struct brw_compile *p,
                        struct brw_reg dest,
                        GLuint location,
index fe3a0299925f77c49edd50ec71c9e3b59119faa7..feb13e7ae47c90b3dba7baaf4262ed3df913c9b0 100644 (file)
@@ -1566,6 +1566,46 @@ void brw_oword_block_read(struct brw_compile *p,
    brw_pop_insn_state(p);
 }
 
+/**
+ * Read a set of dwords from the data port Data Cache (const buffer).
+ *
+ * Location (in buffer) appears as UD offsets in the register after
+ * the provided mrf header reg.
+ */
+void brw_dword_scattered_read(struct brw_compile *p,
+                             struct brw_reg dest,
+                             struct brw_reg mrf,
+                             uint32_t bind_table_index)
+{
+   mrf = retype(mrf, BRW_REGISTER_TYPE_UD);
+
+   brw_push_insn_state(p);
+   brw_set_predicate_control(p, BRW_PREDICATE_NONE);
+   brw_set_compression_control(p, BRW_COMPRESSION_NONE);
+   brw_set_mask_control(p, BRW_MASK_DISABLE);
+   brw_MOV(p, mrf, retype(brw_vec8_grf(0, 0), BRW_REGISTER_TYPE_UD));
+   brw_pop_insn_state(p);
+
+   struct brw_instruction *insn = next_insn(p, BRW_OPCODE_SEND);
+   insn->header.destreg__conditionalmod = mrf.nr;
+
+   /* cast dest to a uword[8] vector */
+   dest = retype(vec8(dest), BRW_REGISTER_TYPE_UW);
+
+   brw_set_dest(insn, dest);
+   brw_set_src0(insn, brw_null_reg());
+
+   brw_set_dp_read_message(p->brw,
+                          insn,
+                          bind_table_index,
+                          BRW_DATAPORT_DWORD_SCATTERED_BLOCK_8DWORDS,
+                          BRW_DATAPORT_READ_MESSAGE_DWORD_SCATTERED_READ,
+                          0, /* source cache = data cache */
+                          2, /* msg_length */
+                          1, /* response_length */
+                          0); /* eot */
+}
+
 
 
 /**