<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, May 17, 2016 at 12:24 PM, Francisco Jerez <span dir="ltr"><<a href="mailto:currojerez@riseup.net" target="_blank">currojerez@riseup.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>> writes:<br>
<br>
> On Mon, May 16, 2016 at 9:22 PM, Francisco Jerez <<a href="mailto:currojerez@riseup.net">currojerez@riseup.net</a>><br>
> wrote:<br>
><br>
>> This seems cleaner than exposing an implementation detail of<br>
>> brw_fs_reg_allocate.cpp to the world, and will give the caller control<br>
>> over the instruction execution flags (e.g. force_writemask_all) that<br>
>> are applied to the scratch read and write instructions.<br>
>> ---<br>
>> src/mesa/drivers/dri/i965/brw_fs.h | 4 ---<br>
>> src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp | 41<br>
>> ++++++++++++-----------<br>
>> 2 files changed, 21 insertions(+), 24 deletions(-)<br>
>><br>
>> diff --git a/src/mesa/drivers/dri/i965/brw_fs.h<br>
>> b/src/mesa/drivers/dri/i965/brw_fs.h<br>
>> index bf30d65..53a3557 100644<br>
>> --- a/src/mesa/drivers/dri/i965/brw_fs.h<br>
>> +++ b/src/mesa/drivers/dri/i965/brw_fs.h<br>
>> @@ -211,10 +211,6 @@ public:<br>
>> bool opt_saturate_propagation();<br>
>> bool opt_cmod_propagation();<br>
>> bool opt_zero_samples();<br>
>> - void emit_unspill(bblock_t *block, fs_inst *inst, fs_reg reg,<br>
>> - uint32_t spill_offset, unsigned count);<br>
>> - void emit_spill(bblock_t *block, fs_inst *inst, fs_reg reg,<br>
>> - uint32_t spill_offset, unsigned count);<br>
>><br>
>> void emit_nir_code();<br>
>> void nir_setup_inputs();<br>
>> diff --git a/src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp<br>
>> b/src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp<br>
>> index 2260147..5fc586f 100644<br>
>> --- a/src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp<br>
>> +++ b/src/mesa/drivers/dri/i965/brw_fs_reg_allocate.cpp<br>
>> @@ -764,16 +764,17 @@ namespace {<br>
>> }<br>
>> }<br>
>><br>
>> -void<br>
>> -fs_visitor::emit_unspill(bblock_t *block, fs_inst *inst, fs_reg dst,<br>
>> - uint32_t spill_offset, unsigned count)<br>
>> +static void<br>
>> +emit_unspill(const fs_builder &bld, fs_reg dst,<br>
>> + uint32_t spill_offset, unsigned count)<br>
>> {<br>
>> + const brw_device_info *devinfo = bld.shader->devinfo;<br>
>> + const fs_visitor *v = static_cast<const fs_visitor *>(bld.shader);<br>
>> unsigned reg_size = 1;<br>
>> - if (dispatch_width == 16 && count % 2 == 0)<br>
>> + if (v->dispatch_width == 16 && count % 2 == 0)<br>
>> reg_size = 2;<br>
>><br>
>> - const fs_builder ibld = fs_builder(this, block, inst)<br>
>> - .group(reg_size * 8, 0);<br>
>> + const fs_builder ibld = bld.group(reg_size * 8, 0);<br>
>><br>
>> for (unsigned i = 0; i < count / reg_size; i++) {<br>
>> /* The Gen7 descriptor-based offset is 12 bits of HWORD units.<br>
>> Because<br>
>> @@ -793,7 +794,7 @@ fs_visitor::emit_unspill(bblock_t *block, fs_inst<br>
>> *inst, fs_reg dst,<br>
>> unspill_inst->regs_written = reg_size;<br>
>><br>
>> if (!gen7_read) {<br>
>> - unspill_inst->base_mrf = spill_base_mrf(this);<br>
>> + unspill_inst->base_mrf = spill_base_mrf(bld.shader);<br>
>><br>
><br>
> This makes the static_cast in spill_base_mrf make a bit more sense<br>
><br>
</div></div>Right, we either do it here and emit_spill() or in spill_max_size()<br>
alone. Because the number of reserved registers for spilling is a<br>
property of the shader rather than the visitor it kind of made more<br>
sense to me to give spill_max_size() a backend_shader object, but I'm<br>
okay either way, it's up to you.<br></blockquote><div><br></div><div>I don't care that much. Putting the cast in spill_max_size() means we can pass bld.shader directly. Feel free to leave it as-is if you'd like.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">
><br>
>> unspill_inst->mlen = 1; /* header contains offset */<br>
>> }<br>
>><br>
>> @@ -802,17 +803,16 @@ fs_visitor::emit_unspill(bblock_t *block, fs_inst<br>
>> *inst, fs_reg dst,<br>
>> }<br>
>> }<br>
>><br>
>> -void<br>
>> -fs_visitor::emit_spill(bblock_t *block, fs_inst *inst, fs_reg src,<br>
>> - uint32_t spill_offset, unsigned count)<br>
>> +static void<br>
>> +emit_spill(const fs_builder &bld, fs_reg src,<br>
>> + uint32_t spill_offset, unsigned count)<br>
>> {<br>
>> + const fs_visitor *v = static_cast<const fs_visitor *>(bld.shader);<br>
>> unsigned reg_size = 1;<br>
>> - if (dispatch_width == 16 && count % 2 == 0)<br>
>> + if (v->dispatch_width == 16 && count % 2 == 0)<br>
>> reg_size = 2;<br>
>><br>
>> - const fs_builder ibld = fs_builder(this, block, inst)<br>
>> - .at(block, inst->next)<br>
>> - .group(reg_size * 8, 0);<br>
>> + const fs_builder ibld = bld.group(reg_size * 8, 0);<br>
>><br>
>> for (unsigned i = 0; i < count / reg_size; i++) {<br>
>> fs_inst *spill_inst =<br>
>> @@ -820,7 +820,7 @@ fs_visitor::emit_spill(bblock_t *block, fs_inst *inst,<br>
>> fs_reg src,<br>
>> src.reg_offset += reg_size;<br>
>> spill_inst->offset = spill_offset + i * reg_size * REG_SIZE;<br>
>> spill_inst->mlen = 1 + reg_size; /* header, value */<br>
>> - spill_inst->base_mrf = spill_base_mrf(this);<br>
>> + spill_inst->base_mrf = spill_base_mrf(bld.shader);<br>
>> }<br>
>> }<br>
>><br>
>> @@ -936,6 +936,8 @@ fs_visitor::spill_reg(int spill_reg)<br>
>> * could just spill/unspill the GRF being accessed.<br>
>> */<br>
>> foreach_block_and_inst (block, fs_inst, inst, cfg) {<br>
>> + const fs_builder ibld = fs_builder(this, block, inst);<br>
>> +<br>
>> for (unsigned int i = 0; i < inst->sources; i++) {<br>
>> if (inst->src[i].file == VGRF &&<br>
>> inst->src[i].nr == spill_reg) {<br>
>> @@ -947,8 +949,7 @@ fs_visitor::spill_reg(int spill_reg)<br>
>> inst->src[i].nr = <a href="http://unspill_dst.nr" rel="noreferrer" target="_blank">unspill_dst.nr</a>;<br>
>> inst->src[i].reg_offset = 0;<br>
>><br>
>> - emit_unspill(block, inst, unspill_dst, subset_spill_offset,<br>
>> - regs_read);<br>
>> + emit_unspill(ibld, unspill_dst, subset_spill_offset,<br>
>> regs_read);<br>
>> }<br>
>> }<br>
>><br>
>> @@ -974,11 +975,11 @@ fs_visitor::spill_reg(int spill_reg)<br>
>> * since we write back out all of the regs_written().<br>
>> */<br>
>> if (inst->is_partial_write())<br>
>> - emit_unspill(block, inst, spill_src, subset_spill_offset,<br>
>> + emit_unspill(ibld, spill_src, subset_spill_offset,<br>
>> inst->regs_written);<br>
>><br>
>> - emit_spill(block, inst, spill_src, subset_spill_offset,<br>
>> - inst->regs_written);<br>
>> + emit_spill(<a href="http://ibld.at" rel="noreferrer" target="_blank">ibld.at</a>(block, inst->next), spill_src,<br>
>> + subset_spill_offset, inst->regs_written);<br>
>> }<br>
>> }<br>
>><br>
>> --<br>
>> 2.7.3<br>
>><br>
>> _______________________________________________<br>
>> mesa-dev mailing list<br>
>> <a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
>> <a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
>><br>
</div></div></blockquote></div><br></div></div>