[Mesa-dev] [PATCH 5/5] i965: Maximum allowed size of SEND messages is 15 (4 bits)

Iago Toral itoral at igalia.com
Sun Sep 20 22:51:58 PDT 2015


On Fri, 2015-09-18 at 09:09 -0700, Kenneth Graunke wrote:
> On Friday, September 18, 2015 10:08:52 AM Iago Toral Quiroga wrote:
> > Until now we only used MRFs 1..15 for regular SEND messages, so the
> > message length could not possibly exceed the maximum size. Now that
> > we allow to use MRF registers 1..23 in gen6, we need to be careful
> > not to build messages that can go beyond the limit. That could occur,
> > specifically, when building URB write messages, which we may need to
> > split in chunks due to their size. Previously we would simply go and
> > create a new message when we reached MRF 13 (since 13..15 were
> > reserved for spilling), now we also want to check the size of the
> > message explicitly.
> > 
> > Besides adding that condition to split URB write messages properly,
> > this patch also adds asserts in the generator. Notice that
> > brw_inst_set_mlen already asserts for this, but asserting in the
> > generators is easy and can make debugging easier in some cases.
> > ---
> >  src/mesa/drivers/dri/i965/brw_fs_generator.cpp   | 1 +
> >  src/mesa/drivers/dri/i965/brw_inst.h             | 3 +++
> >  src/mesa/drivers/dri/i965/brw_vec4_generator.cpp | 1 +
> >  src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp   | 5 +++--
> >  4 files changed, 8 insertions(+), 2 deletions(-)
> > 
> > diff --git a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
> > index 6cbd42f..c65084d 100644
> > --- a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
> > +++ b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
> > @@ -1561,6 +1561,7 @@ fs_generator::generate_code(const cfg_t *cfg, int dispatch_width)
> >        brw_set_default_exec_size(p, cvt(inst->exec_size) - 1);
> >  
> >        assert(inst->base_mrf + inst->mlen <= BRW_MAX_MRF(devinfo->gen));
> > +      assert(inst->mlen <= BRW_MAX_MSG_LENGTH);
> >  
> >        switch (inst->exec_size) {
> >        case 1:
> > diff --git a/src/mesa/drivers/dri/i965/brw_inst.h b/src/mesa/drivers/dri/i965/brw_inst.h
> > index 46eff1d..c5132ba 100644
> > --- a/src/mesa/drivers/dri/i965/brw_inst.h
> > +++ b/src/mesa/drivers/dri/i965/brw_inst.h
> > @@ -39,6 +39,9 @@
> >  extern "C" {
> >  #endif
> >  
> > +/** Maximum SEND message length */
> > +#define BRW_MAX_MSG_LENGTH 15
> > +
> >  /* brw_context.h has a forward declaration of brw_inst, so name the struct. */
> >  typedef struct brw_inst {
> >     uint64_t data[2];
> > diff --git a/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp b/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp
> > index d5943d2..05f2044 100644
> > --- a/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp
> > +++ b/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp
> > @@ -1136,6 +1136,7 @@ vec4_generator::generate_code(const cfg_t *cfg)
> >        brw_set_default_acc_write_control(p, inst->writes_accumulator);
> >  
> >        assert(inst->base_mrf + inst->mlen <= BRW_MAX_MRF(devinfo->gen));
> > +      assert(inst->mlen <= BRW_MAX_MSG_LENGTH);
> >  
> >        unsigned pre_emit_nr_insn = p->nr_insn;
> >  
> > diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
> > index 7f06050..514ccd6 100644
> > --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
> > +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
> > @@ -3320,9 +3320,10 @@ vec4_visitor::emit_vertex()
> >                         prog_data->vue_map.slot_to_varying[slot]);
> >  
> >           /* If this was max_usable_mrf, we can't fit anything more into this
> > -          * URB WRITE.
> > +          * URB WRITE. Same thing if we reached the maximum length available.
> >            */
> > -         if (mrf > max_usable_mrf) {
> > +         if (mrf > max_usable_mrf ||
> > +             align_interleaved_urb_mlen(devinfo, mrf - base_mrf + 1) > BRW_MAX_MSG_LENGTH) {
> >              slot++;
> >              break;
> >           }
> > 
> 
> Doesn't this hunk need to go before patch 2?  It seems like otherwise
> we'll be emitting URB write messages that are too long until patch 5.

Yeah, you're right. I'll fix that before pushing.

> With that fixed, the series is:
> Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
> 
> Thanks for doing this, Iago!

Thanks for reviewing it! ;)



More information about the mesa-dev mailing list