i965/fs: Communicate the pull constant block read parameters through fs_regs.
authorEric Anholt <eric@anholt.net>
Wed, 20 Jun 2012 22:41:14 +0000 (15:41 -0700)
committerEric Anholt <eric@anholt.net>
Tue, 7 Aug 2012 20:54:51 +0000 (13:54 -0700)
I wanted to add the surface index as a variable value for UBO support,
and a reg seemed like the obvious way to go.  This exposes more of the
information to CSE, which we'll probably want to apply to pull
constant loads for UBOs eventually (you might access 4 floats in a
row, each of which would produce an oword block read of the same
block).

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

index d06858e3c919787f79e3905f5a9d897e8dc63735..cb89d746f34ab1b89bdff963a1556fa49ded5f73 100644 (file)
@@ -1214,9 +1214,11 @@ fs_visitor::setup_pull_constants()
            continue;
 
         fs_reg dst = fs_reg(this, glsl_type::float_type);
+        fs_reg index = fs_reg((unsigned)SURF_INDEX_FRAG_CONST_BUFFER);
+        fs_reg offset = fs_reg((unsigned)(((uniform_nr -
+                                            pull_uniform_base) * 4) & ~15));
         fs_inst *pull = new(mem_ctx) fs_inst(FS_OPCODE_PULL_CONSTANT_LOAD,
-                                             dst);
-        pull->offset = ((uniform_nr - pull_uniform_base) * 4) & ~15;
+                                             dst, index, offset);
         pull->ir = inst->ir;
         pull->annotation = inst->annotation;
         pull->base_mrf = 14;
index 8c547ac797ffcc19846cea17bf1b21a3e92e3fbf..6fd9908f71342718c58538b8ef7d898edfe75a72 100644 (file)
@@ -292,7 +292,9 @@ public:
                      bool negate_value);
    void generate_spill(fs_inst *inst, struct brw_reg src);
    void generate_unspill(fs_inst *inst, struct brw_reg dst);
-   void generate_pull_constant_load(fs_inst *inst, struct brw_reg dst);
+   void generate_pull_constant_load(fs_inst *inst, struct brw_reg dst,
+                                   struct brw_reg index,
+                                   struct brw_reg offset);
    void generate_mov_dispatch_to_flags();
 
    void emit_dummy_fs();
index 0bd056d5c1a14e7427d89a1270ac7692718c8bfa..a5cebcb32e695f24f40474ec375cf644cfe4ae2e 100644 (file)
@@ -583,7 +583,9 @@ fs_visitor::generate_unspill(fs_inst *inst, struct brw_reg dst)
 }
 
 void
-fs_visitor::generate_pull_constant_load(fs_inst *inst, struct brw_reg dst)
+fs_visitor::generate_pull_constant_load(fs_inst *inst, struct brw_reg dst,
+                                       struct brw_reg index,
+                                       struct brw_reg offset)
 {
    assert(inst->mlen != 0);
 
@@ -600,8 +602,16 @@ fs_visitor::generate_pull_constant_load(fs_inst *inst, struct brw_reg dst)
    if (intel->gen == 4 && !intel->is_g4x)
       brw_MOV(p, brw_null_reg(), dst);
 
+   assert(index.file == BRW_IMMEDIATE_VALUE &&
+         index.type == BRW_REGISTER_TYPE_UD);
+   uint32_t surf_index = index.dw1.ud;
+
+   assert(offset.file == BRW_IMMEDIATE_VALUE &&
+         offset.type == BRW_REGISTER_TYPE_UD);
+   uint32_t read_offset = offset.dw1.ud;
+
    brw_oword_block_read(p, dst, brw_message_reg(inst->base_mrf),
-                       inst->offset, SURF_INDEX_FRAG_CONST_BUFFER);
+                       read_offset, surf_index);
 
    if (intel->gen == 4 && !intel->is_g4x) {
       /* gen4 errata: destination from a send can't be used as a
@@ -968,7 +978,7 @@ fs_visitor::generate_code()
         break;
 
       case FS_OPCODE_PULL_CONSTANT_LOAD:
-        generate_pull_constant_load(inst, dst);
+        generate_pull_constant_load(inst, dst, src[0], src[1]);
         break;
 
       case FS_OPCODE_FB_WRITE: