<div dir="ltr">On 1 December 2013 00:44, Kenneth Graunke <span dir="ltr"><<a href="mailto:kenneth@whitecape.org" target="_blank">kenneth@whitecape.org</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">On 11/30/2013 10:40 AM, Paul Berry wrote:<br>
> On 12 November 2013 17:51, Kenneth Graunke <<a href="mailto:kenneth@whitecape.org">kenneth@whitecape.org</a><br>
</div><div class="im">> <mailto:<a href="mailto:kenneth@whitecape.org">kenneth@whitecape.org</a>>> wrote:<br>
><br>
>     We need to SEND from a GRF, and we can only obtain those prior to<br>
>     register allocation.<br>
><br>
>     This allows us to do pull constant loads without the MRF hack.<br>
><br>
>     Signed-off-by: Kenneth Graunke <<a href="mailto:kenneth@whitecape.org">kenneth@whitecape.org</a><br>
</div>>     <mailto:<a href="mailto:kenneth@whitecape.org">kenneth@whitecape.org</a>>><br>
<div><div class="h5">>     ---<br>
>      src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 13 ++++++++++++-<br>
>      1 file changed, 12 insertions(+), 1 deletion(-)<br>
><br>
>     diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp<br>
>     b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp<br>
>     index a036e2d..5f0d0b4 100644<br>
>     --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp<br>
>     +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp<br>
>     @@ -1582,7 +1582,13 @@ vec4_visitor::visit(ir_expression *ir)<br>
>            src_reg surf_index =<br>
>               src_reg(prog_data->base.binding_table.ubo_start +<br>
>     uniform_block->value.u[0]);<br>
>            if (const_offset_ir) {<br>
>     -         offset = src_reg(const_offset / 16);<br>
>     +         if (brw->gen >= 8) {<br>
>     +            /* Put the offset in a GRF; we can't SEND from<br>
>     immediates. */<br>
>     +            offset = src_reg(this, glsl_type::int_type);<br>
>     +            emit(MOV(dst_reg(offset), src_reg(const_offset / 16)));<br>
>     +         } else {<br>
>     +            offset = src_reg(const_offset / 16);<br>
>     +         }<br>
>            } else {<br>
>               offset = src_reg(this, glsl_type::uint_type);<br>
>               emit(SHR(dst_reg(offset), op[1], src_reg(4)));<br>
>     @@ -2983,6 +2989,11 @@<br>
>     vec4_visitor::get_pull_constant_offset(vec4_instruction *inst,<br>
>            }<br>
><br>
>            return index;<br>
>     +   } else if (brw->gen >= 8) {<br>
>     +      /* Put the offset in a GRF; we can't SEND from immediates. */<br>
>     +      src_reg offset = src_reg(this, glsl_type::int_type);<br>
>     +      emit_before(inst, MOV(dst_reg(offset), src_reg(reg_offset)));<br>
>     +      return offset;<br>
>         } else {<br>
>            int message_header_scale = brw->gen < 6 ? 16 : 1;<br>
>            return src_reg(reg_offset * message_header_scale);<br>
>     --<br>
>     1.8.3.2<br>
><br>
><br>
> Looking at the docs, it appears to me that SENDs from immediates have<br>
> never been allowed.  Is it possible that they have been working just by<br>
> luck?  Maybe we should make this change apply regardless of brw->gen.<br>
<br>
</div></div>Not by luck...by MRFs.<br>
<br>
(Gen4-7) vec4_generator handles the VS_OPCODE_PULL_CONSTANT_LOAD opcode<br>
by emitting MOVs to a MRF (or fake MRF on Gen7).  It's treated as a<br>
OWORD_DUAL_BLOCK_READ, and is never headerless.<br>
<br>
On Gen8, I chose to make both VS_OPCODE_PULL_CONSTANT_LOAD and<br>
VS_OPCODE_PULL_CONSTANT_LOAD_GEN7 use the same method (the ld sampler<br>
message), which doesn't require a header, and thus is easy to send from<br>
a GRF.  We just can't use immediates.<br>
<br>
Looking at the situation now...it seems pretty stupid that we use<br>
VS_OPCODE_PULL_CONSTANT_LOAD on Gen7+ at all.  Data port reads are<br>
ridiculously slow on Ivybridge, and still pretty bad on Haswell.  And we<br>
use them for UBOs.  We should probably convert those, which would<br>
require doing this code on Gen7 as well.<br>
</blockquote></div><br></div><div class="gmail_extra">Ok, I see.  Can you update the commit message and the code comments to clarify this?  As is, when you say "we can't SEND from immediates", it sounds like you're saying that this is a new hardware restriction for Gen8, and that's why I was confused.<br>
<br></div><div class="gmail_extra">With that changed, this patch is:<br><br>Reviewed-by: Paul Berry <<a href="mailto:stereotype441@gmail.com">stereotype441@gmail.com</a>><br></div></div>