diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index d06858e3c91..cb89d746f34 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -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; diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h index 8c547ac797f..6fd9908f713 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.h +++ b/src/mesa/drivers/dri/i965/brw_fs.h @@ -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(); diff --git a/src/mesa/drivers/dri/i965/brw_fs_emit.cpp b/src/mesa/drivers/dri/i965/brw_fs_emit.cpp index 0bd056d5c1a..a5cebcb32e6 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_emit.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_emit.cpp @@ -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: