<p dir="ltr"><br>
On Dec 10, 2015 9:06 AM, "Francisco Jerez" <<a href="mailto:currojerez@riseup.net">currojerez@riseup.net</a>> wrote:<br>
><br>
> Michael Schellenberger Costa <<a href="mailto:mschellenbergercosta@googlemail.com">mschellenbergercosta@googlemail.com</a>><br>
> writes:<br>
><br>
> > Hi,<br>
> ><br>
> > Am 10.12.2015 um 05:23 schrieb Jason Ekstrand:<br>
> >> Now that we have MOV_INDIRECT opcodes, we have all of the size information<br>
> >> we need directly in the opcode.  With a little restructuring of the<br>
> >> algorithm used in assign_constant_locations we don't need param_size<br>
> >> anymore.  The big thing to watch out for now, however, is that you can have<br>
> >> two ranges overlap where neither contains the other.  In order to deal with<br>
> >> this, we make the first pass just flag what needs pulling and handle<br>
> >> assigning pull constant locations until later.<br>
> >> ---<br>
> >>  src/mesa/drivers/dri/i965/brw_fs.cpp | 44 ++++++++++++++----------------------<br>
> >>  1 file changed, 17 insertions(+), 27 deletions(-)<br>
> >><br>
> >> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp<br>
> >> index 786c5fb..1add656 100644<br>
> >> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp<br>
> >> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp<br>
> >> @@ -1920,14 +1920,12 @@ fs_visitor::assign_constant_locations()<br>
> >>     if (dispatch_width != 8)<br>
> >>        return;<br>
> >><br>
> >> -   unsigned int num_pull_constants = 0;<br>
> >> -<br>
> >> -   pull_constant_loc = ralloc_array(mem_ctx, int, uniforms);<br>
> >> -   memset(pull_constant_loc, -1, sizeof(pull_constant_loc[0]) * uniforms);<br>
> >> -<br>
> >>     bool is_live[uniforms];<br>
> >>     memset(is_live, 0, sizeof(is_live));<br>
> >><br>
> >> +   bool needs_pull[uniforms];<br>
> >> +   memset(needs_pull, 0, sizeof(is_live));<br>
> > While it is valid, could you make this sizeof(needs_pull) to be safe?<br>
> > Michael<br>
><br>
> This is why the language provides a type-safe way to initialize a<br>
> variable.  Empty aggregate initializer please?</p>
<p dir="ltr">What's the syntax for that in C++?  Does this work?</p>
<p dir="ltr">book needs_pull[uniforms] = { false };</p>
<p dir="ltr">> ><br>
> >> +<br>
> >>     /* First, we walk through the instructions and do two things:<br>
> >>      *<br>
> >>      *  1) Figure out which uniforms are live.<br>
> >> @@ -1943,20 +1941,15 @@ fs_visitor::assign_constant_locations()<br>
> >>           if (inst->src[i].file != UNIFORM)<br>
> >>              continue;<br>
> >><br>
> >> -         if (inst->opcode == SHADER_OPCODE_MOV_INDIRECT && i == 0) {<br>
> >> -            int uniform = inst->src[0].nr;<br>
> >> +         int constant_nr = inst->src[i].nr + inst->src[i].reg_offset;<br>
> >><br>
> >> -            /* If this array isn't already present in the pull constant buffer,<br>
> >> -             * add it.<br>
> >> -             */<br>
> >> -            if (pull_constant_loc[uniform] == -1) {<br>
> >> -               assert(param_size[uniform]);<br>
> >> -               for (int j = 0; j < param_size[uniform]; j++)<br>
> >> -                  pull_constant_loc[uniform + j] = num_pull_constants++;<br>
> >> +         if (inst->opcode == SHADER_OPCODE_MOV_INDIRECT && i == 0) {<br>
> >> +            for (unsigned j = 0; j < inst->src[2].ud / 4; j++) {<br>
> >> +               is_live[constant_nr + j] = true;<br>
> >> +               needs_pull[constant_nr + j] = true;<br>
> >>              }<br>
> >>           } else {<br>
> >>              /* Mark the the one accessed uniform as live */<br>
> >> -            int constant_nr = inst->src[i].nr + inst->src[i].reg_offset;<br>
> >>              if (constant_nr >= 0 && constant_nr < (int) uniforms)<br>
> >>                 is_live[constant_nr] = true;<br>
> >>           }<br>
> >> @@ -1973,26 +1966,23 @@ fs_visitor::assign_constant_locations()<br>
> >>      */<br>
> >>     unsigned int max_push_components = 16 * 8;<br>
> >>     unsigned int num_push_constants = 0;<br>
> >> +   unsigned int num_pull_constants = 0;<br>
> >><br>
> >>     push_constant_loc = ralloc_array(mem_ctx, int, uniforms);<br>
> >> +   pull_constant_loc = ralloc_array(mem_ctx, int, uniforms);<br>
> >><br>
> >>     for (unsigned int i = 0; i < uniforms; i++) {<br>
> >> -      if (!is_live[i] || pull_constant_loc[i] != -1) {<br>
> >> -         /* This UNIFORM register is either dead, or has already been demoted<br>
> >> -          * to a pull const.  Mark it as no longer living in the param[] array.<br>
> >> -          */<br>
> >> -         push_constant_loc[i] = -1;<br>
> >> +      push_constant_loc[i] = -1;<br>
> >> +      pull_constant_loc[i] = -1;<br>
> >> +<br>
> >> +      if (!is_live[i])<br>
> >>           continue;<br>
> >> -      }<br>
> >><br>
> >> -      if (num_push_constants < max_push_components) {<br>
> >> -         /* Retain as a push constant.  Record the location in the params[]<br>
> >> -          * array.<br>
> >> -          */<br>
> >> +      if (!needs_pull[i] && num_push_constants < max_push_components) {<br>
> >> +         /* Retain as a push constant */<br>
> >>           push_constant_loc[i] = num_push_constants++;<br>
> >>        } else {<br>
> >> -         /* Demote to a pull constant. */<br>
> >> -         push_constant_loc[i] = -1;<br>
> >> +         /* We have to pull it */<br>
> >>           pull_constant_loc[i] = num_pull_constants++;<br>
> >>        }<br>
> >>     }<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="http://lists.freedesktop.org/mailman/listinfo/mesa-dev">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</p>