summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2014-10-24 11:41:25 -0700
committerJason Ekstrand <[email protected]>2014-10-27 13:35:57 -0700
commit9d1f72ebdec90e2c747d5af38d72895a60a1753a (patch)
tree2917152565c5803930d1691100b423e5af47bc8b
parent4242eb14c1dab83b29e63a4833400ff600cc9f96 (diff)
i965/fs: Use correct spill offsets
Different platforms require the offset to be in different units. However, the generator fixes all of this up for us and only requires an offset in bytes. Previously, we were getting this wrong all over the place. Some computed/used it correctly as bytes while others treated the offset as whole registers or computed it as bytes or bytes*2 in SIMD16 mode. This commit cleans all this up and makes us properly treat it as bytes everywhere. Reviewed-by: Kristian Høgsberg <[email protected]>
-rw-r--r--src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp11
1 files changed, 5 insertions, 6 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp b/src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp
index ee5e1230943..c0171372887 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp
@@ -714,7 +714,7 @@ fs_visitor::emit_unspill(bblock_t *block, fs_inst *inst, fs_reg dst,
inst->insert_before(block, unspill_inst);
dst.reg_offset += reg_size;
- spill_offset += reg_size * 8 * sizeof(float);
+ spill_offset += reg_size * REG_SIZE;
}
}
@@ -734,7 +734,7 @@ fs_visitor::emit_spill(bblock_t *block, fs_inst *inst, fs_reg src,
new(mem_ctx) fs_inst(SHADER_OPCODE_GEN4_SCRATCH_WRITE,
reg_null_f, src);
src.reg_offset += reg_size;
- spill_inst->offset = spill_offset + i * reg_size;
+ spill_inst->offset = spill_offset + i * reg_size * REG_SIZE;
spill_inst->ir = inst->ir;
spill_inst->annotation = inst->annotation;
spill_inst->mlen = 1 + reg_size; /* header, value */
@@ -822,7 +822,6 @@ fs_visitor::choose_spill_reg(struct ra_graph *g)
void
fs_visitor::spill_reg(int spill_reg)
{
- int reg_size = dispatch_width * sizeof(float);
int size = virtual_grf_sizes[spill_reg];
unsigned int spill_offset = last_scratch;
assert(ALIGN(spill_offset, 16) == spill_offset); /* oword read/write req. */
@@ -849,7 +848,7 @@ fs_visitor::spill_reg(int spill_reg)
spilled_any_registers = true;
}
- last_scratch += size * reg_size;
+ last_scratch += size * REG_SIZE;
/* Generate spill/unspill instructions for the objects being
* spilled. Right now, we spill or unspill the whole thing to a
@@ -862,7 +861,7 @@ fs_visitor::spill_reg(int spill_reg)
inst->src[i].reg == spill_reg) {
int regs_read = inst->regs_read(this, i);
int subset_spill_offset = (spill_offset +
- reg_size * inst->src[i].reg_offset);
+ REG_SIZE * inst->src[i].reg_offset);
fs_reg unspill_dst(GRF, virtual_grf_alloc(regs_read));
inst->src[i].reg = unspill_dst.reg;
@@ -876,7 +875,7 @@ fs_visitor::spill_reg(int spill_reg)
if (inst->dst.file == GRF &&
inst->dst.reg == spill_reg) {
int subset_spill_offset = (spill_offset +
- reg_size * inst->dst.reg_offset);
+ REG_SIZE * inst->dst.reg_offset);
fs_reg spill_src(GRF, virtual_grf_alloc(inst->regs_written));
inst->dst.reg = spill_src.reg;