<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Sat, May 28, 2016 at 1:21 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 Fri, May 27, 2016 at 7:05 PM, Francisco Jerez <<a href="mailto:currojerez@riseup.net">currojerez@riseup.net</a>><br>
> wrote:<br>
><br>
>> This makes the whole LOAD_PAYLOAD munging unnecessary which simplifies<br>
>> the code and will allow the optimization to succeed in more cases<br>
>> independent of whether the LOAD_PAYLOAD instruction can be found or<br>
>> not.<br>
>> ---<br>
>>  src/mesa/drivers/dri/i965/brw_fs.cpp | 79<br>
>> +++++++++++-------------------------<br>
>>  1 file changed, 23 insertions(+), 56 deletions(-)<br>
>><br>
>> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp<br>
>> b/src/mesa/drivers/dri/i965/brw_fs.cpp<br>
>> index 45c4753..6abf776 100644<br>
>> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp<br>
>> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp<br>
>> @@ -2612,11 +2612,15 @@ fs_visitor::opt_sampler_eot()<br>
>>     if (key->nr_color_regions != 1)<br>
>>        return false;<br>
>><br>
>> +   /* Requires clamping the color payload in the shader. */<br>
>> +   if (key->clamp_fragment_color)<br>
>> +      return false;<br>
>><br>
><br>
> This looks new...  Is it actually needed?  Could we simply do "if<br>
> (tex_inst->saturate) return false;"?  In any case, it should probably be<br>
> it's own commit.<br>
><br>
<br>
</div></div>It is necessary to preserve the current behavior and skip the<br>
optimization when fragment color clamping is required, because right now<br>
the MOVs used to saturate the color values are inserted during logical<br>
send lowering so this pass would have no other way to find out.  I can<br>
make the change in a separate commit just before this one if you like.<br></blockquote><div><br></div><div>Right.  No need to make it a separate commit.  Just update the comment so it says something about the MOVs inserted during lowering.<br><br></div><div>Incidentally, I think Rob Clark recently added some stuff to do that lowering in NIR...  In the future, we might want to use that and delete more back-end code.  For now, an udpated comment will do. :-)<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5">
><br>
>> +<br>
>>     /* Look for a texturing instruction immediately before the final<br>
>> FB_WRITE. */<br>
>>     bblock_t *block = cfg->blocks[cfg->num_blocks - 1];<br>
>>     fs_inst *fb_write = (fs_inst *)block->end();<br>
>>     assert(fb_write->eot);<br>
>> -   assert(fb_write->opcode == FS_OPCODE_FB_WRITE);<br>
>> +   assert(fb_write->opcode == FS_OPCODE_FB_WRITE_LOGICAL);<br>
>><br>
>>     /* There wasn't one; nothing to do. */<br>
>>     if (unlikely(fb_write->prev->is_head_sentinel()))<br>
>> @@ -2629,24 +2633,20 @@ fs_visitor::opt_sampler_eot()<br>
>>      * “Response Length of zero is allowed on all SIMD8* and SIMD16*<br>
>> sampler<br>
>>      *  messages except sample+killpix, resinfo, sampleinfo, LOD, and<br>
>> gather4*”<br>
>>      */<br>
>> -   if (!tex_inst->is_tex() ||<br>
>> -       tex_inst->opcode == SHADER_OPCODE_TXS ||<br>
>> -       tex_inst->opcode == SHADER_OPCODE_SAMPLEINFO ||<br>
>> -       tex_inst->opcode == SHADER_OPCODE_LOD ||<br>
>> -       tex_inst->opcode == SHADER_OPCODE_TG4 ||<br>
>> -       tex_inst->opcode == SHADER_OPCODE_TG4_OFFSET)<br>
>> +   if (tex_inst->opcode != SHADER_OPCODE_TEX_LOGICAL &&<br>
>> +       tex_inst->opcode != SHADER_OPCODE_TXD_LOGICAL &&<br>
>> +       tex_inst->opcode != SHADER_OPCODE_TXF_LOGICAL &&<br>
>> +       tex_inst->opcode != SHADER_OPCODE_TXL_LOGICAL &&<br>
>> +       tex_inst->opcode != FS_OPCODE_TXB_LOGICAL &&<br>
>> +       tex_inst->opcode != SHADER_OPCODE_TXF_CMS_LOGICAL &&<br>
>> +       tex_inst->opcode != SHADER_OPCODE_TXF_CMS_W_LOGICAL &&<br>
>> +       tex_inst->opcode != SHADER_OPCODE_TXF_UMS_LOGICAL)<br>
>>        return false;<br>
>><br>
><br>
> Same here.  This isn't just a rename, it's a switch from listing invalid<br>
> cases to explicitly listing valid ones.<br>
><br>
<br>
</div></div>The reason is that is_tex() is unaware of the logical messages, I<br>
considered changing that but a few places expect instructions marked<br>
is_tex to be send-like (e.g. fs_inst::is_send_from_grf,<br>
fs_inst::regs_read), so we would have to stop using is_tex() in those<br>
places if we change it.<br></blockquote><div><br></div><div>Right.  Makes sense.  Seems fine to me.  Feel free to leave this patch as-is apart from a better comment above.<br><br></div><div>Reviewed-by: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br><div class="HOEnZb"><div class="h5">
> Other than those two comments, I really like this.  It's a nice cleanup.<br>
><br>
><br>
>><br>
>> -   /* If there's no header present, we need to munge the LOAD_PAYLOAD as<br>
>> well.<br>
>> -    * It's very likely to be the previous instruction.<br>
>> -    */<br>
>> +   /* XXX - This shouldn't be necessary. */<br>
>>     if (tex_inst->prev->is_head_sentinel())<br>
>>        return false;<br>
>><br>
>> -   fs_inst *load_payload = (fs_inst *) tex_inst->prev;<br>
>> -   if (load_payload->opcode != SHADER_OPCODE_LOAD_PAYLOAD)<br>
>> -      return false;<br>
>> -<br>
>>     assert(!tex_inst->eot); /* We can't get here twice */<br>
>>     assert((tex_inst->offset & (0xff << 24)) == 0);<br>
>><br>
>> @@ -2658,46 +2658,10 @@ fs_visitor::opt_sampler_eot()<br>
>>     tex_inst->regs_written = 0;<br>
>>     fb_write->remove(cfg->blocks[cfg->num_blocks - 1]);<br>
>><br>
>> -   /* If a header is present, marking the eot is sufficient. Otherwise,<br>
>> we need<br>
>> -    * to create a new LOAD_PAYLOAD command with the same sources and a<br>
>> space<br>
>> -    * saved for the header. Using a new destination register not only<br>
>> makes sure<br>
>> -    * we have enough space, but it will make sure the dead code<br>
>> eliminator kills<br>
>> -    * the instruction that this will replace.<br>
>> +   /* Marking EOT is sufficient, lower_logical_sends() will notice the EOT<br>
>> +    * flag and submit a header together with the sampler message as<br>
>> required<br>
>> +    * by the hardware.<br>
>>      */<br>
>> -   if (tex_inst->header_size != 0) {<br>
>> -      invalidate_live_intervals();<br>
>> -      return true;<br>
>> -   }<br>
>> -<br>
>> -   fs_reg send_header = ibld.vgrf(BRW_REGISTER_TYPE_F,<br>
>> -                                  load_payload->sources + 1);<br>
>> -   fs_reg *new_sources =<br>
>> -      ralloc_array(mem_ctx, fs_reg, load_payload->sources + 1);<br>
>> -<br>
>> -   new_sources[0] = fs_reg();<br>
>> -   for (int i = 0; i < load_payload->sources; i++)<br>
>> -      new_sources[i+1] = load_payload->src[i];<br>
>> -<br>
>> -   /* The LOAD_PAYLOAD helper seems like the obvious choice here.<br>
>> However, it<br>
>> -    * requires a lot of information about the sources to appropriately<br>
>> figure<br>
>> -    * out the number of registers needed to be used. Given this stage in<br>
>> our<br>
>> -    * optimization, we may not have the appropriate GRFs required by<br>
>> -    * LOAD_PAYLOAD at this point (copy propagation). Therefore, we need to<br>
>> -    * manually emit the instruction.<br>
>> -    */<br>
>> -   fs_inst *new_load_payload = new(mem_ctx)<br>
>> fs_inst(SHADER_OPCODE_LOAD_PAYLOAD,<br>
>> -<br>
>> load_payload->exec_size,<br>
>> -                                                    send_header,<br>
>> -                                                    new_sources,<br>
>> -                                                    load_payload->sources<br>
>> + 1);<br>
>> -<br>
>> -   new_load_payload->regs_written = load_payload->regs_written + 1;<br>
>> -   new_load_payload->header_size = 1;<br>
>> -   tex_inst->mlen++;<br>
>> -   tex_inst->header_size = 1;<br>
>> -   tex_inst->insert_before(cfg->blocks[cfg->num_blocks - 1],<br>
>> new_load_payload);<br>
>> -   tex_inst->src[0] = send_header;<br>
>> -<br>
>>     invalidate_live_intervals();<br>
>>     return true;<br>
>>  }<br>
>> @@ -4153,7 +4117,7 @@ lower_sampler_logical_send_gen7(const fs_builder<br>
>> &bld, fs_inst *inst, opcode op,<br>
>>        sources[i] = bld.vgrf(BRW_REGISTER_TYPE_F);<br>
>><br>
>>     if (op == SHADER_OPCODE_TG4 || op == SHADER_OPCODE_TG4_OFFSET ||<br>
>> -       offset_value.file != BAD_FILE ||<br>
>> +       offset_value.file != BAD_FILE || inst->eot ||<br>
>>         op == SHADER_OPCODE_SAMPLEINFO ||<br>
>>         is_high_sampler(devinfo, sampler)) {<br>
>>        /* For general texture offsets (no txf workaround), we need a<br>
>> header to<br>
>> @@ -4174,7 +4138,7 @@ lower_sampler_logical_send_gen7(const fs_builder<br>
>> &bld, fs_inst *inst, opcode op,<br>
>>         * and we have an explicit header, we need to set up the sampler<br>
>>         * writemask.  It's reversed from normal: 1 means "don't write".<br>
>>         */<br>
>> -      if (inst->regs_written != 4 * reg_width) {<br>
>> +      if (!inst->eot && inst->regs_written != 4 * reg_width) {<br>
>>           assert((inst->regs_written % reg_width) == 0);<br>
>>           unsigned mask = ~((1 << (inst->regs_written / reg_width)) - 1) &<br>
>> 0xf;<br>
>>           inst->offset |= mask << 12;<br>
>> @@ -5738,6 +5702,10 @@ fs_visitor::optimize()<br>
>>     pass_num = 0;<br>
>><br>
>>     OPT(lower_simd_width);<br>
>> +<br>
>> +   /* After SIMD lowering just in case we had to unroll the EOT send. */<br>
>> +   OPT(opt_sampler_eot);<br>
>> +<br>
>>     OPT(lower_logical_sends);<br>
>><br>
>>     if (progress) {<br>
>> @@ -5761,7 +5729,6 @@ fs_visitor::optimize()<br>
>>     }<br>
>><br>
>>     OPT(opt_redundant_discard_jumps);<br>
>> -   OPT(opt_sampler_eot);<br>
>><br>
>>     if (OPT(lower_load_payload)) {<br>
>>        split_virtual_grfs();<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>