[Mesa-dev] [PATCH 2/2] i965: Handle nested uniform array indexing

Kenneth Graunke kenneth at whitecape.org
Tue Nov 18 00:54:18 PST 2014


On Tuesday, November 18, 2014 09:15:06 PM Chris Forbes wrote:
> When converting a uniform array reference to a pull constant load, the
> `reladdr` expression itself may have its own `reladdr`, arbitrarily
> deeply. This arises from expressions like:
> 
>    a[b[x]]     where a, b are uniform arrays (or lowered const arrays),
>                and x is not a constant.
> 
> Just iterate the lowering to pull constants until we stop seeing these
> nested. For most shaders, there will be only one pass through this loop.
> 
> Fixes the piglit test:
> tests/spec/glsl-1.20/linker/double-indirect-1.shader_test
> 
> Signed-off-by: Chris Forbes <chrisf at ijw.co.nz>
> Cc: "10.3 10.4" <mesa-stable at lists.freedesktop.org>
> ---
>  src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 66 
+++++++++++++++-----------
>  1 file changed, 37 insertions(+), 29 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp 
b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
> index af7ca0c..22a6fb9 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
> @@ -3354,6 +3354,7 @@ 
vec4_visitor::move_uniform_array_access_to_pull_constants()
>  {
>     int pull_constant_loc[this->uniforms];
>     memset(pull_constant_loc, -1, sizeof(pull_constant_loc));
> +   bool nested_reladdr;
>  
>     /* Walk through and find array access of uniforms.  Put a copy of that
>      * uniform in the pull constant buffer.
> @@ -3361,44 +3362,51 @@ 
vec4_visitor::move_uniform_array_access_to_pull_constants()
>      * Note that we don't move constant-indexed accesses to arrays.  No
>      * testing has been done of the performance impact of this choice.
>      */
> -   foreach_block_and_inst_safe(block, vec4_instruction, inst, cfg) {
> -      for (int i = 0 ; i < 3; i++) {
> -	 if (inst->src[i].file != UNIFORM || !inst->src[i].reladdr)
> -	    continue;
> +   do {
> +      nested_reladdr = false;

Yikes.  Good find on the bug.

Wrapping it in a loop like this is definitely nice and simple, which is great 
for stable branches.  It might be worth adding a TODO comment for doing it 
more efficiently someday:

/* TODO: We could refactor this and avoid doing N passes over the instruction
 * stream (where N is the reladdr nesting depth).
 */

I think this is fine, though, since the reladdr depth is probably 0 or 1...and 
we just found our first case of 2 today...

I think you need an equivalent patch for the FS.

As is,
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20141118/4aebebd3/attachment.sig>


More information about the mesa-dev mailing list