[Mesa-stable] [Mesa-dev] [PATCH] nvc0/ir: fix overwriting of value backing non-constant gather offset

Samuel Pitoiset samuel.pitoiset at gmail.com
Wed Oct 12 09:09:09 UTC 2016


Unfortunately, this introduces some regressions:

spec/arb_gpu_shader5/texturegatheroffset/fs-r-none-shadow-2d: fail
spec/arb_gpu_shader5/texturegatheroffset/fs-r-none-shadow-2darray: fail
spec/arb_gpu_shader5/texturegatheroffset/fs-r-none-shadow-2drect: fail
spec/arb_gpu_shader5/texturegatheroffset/vs-r-none-shadow-2d: fail
spec/arb_gpu_shader5/texturegatheroffset/vs-r-none-shadow-2darray: fail
spec/arb_gpu_shader5/texturegatheroffset/vs-r-none-shadow-2drect: fail

Can you have a look?

On 10/10/2016 06:12 PM, Ilia Mirkin wrote:
> Normally the value is an immediate, which is moved to some temporary, so
> there's no problem. In the case of a non-constant offset (as allowed by
> ARB_gpu_shader5), we have to take care to copy it first before using it
> to build up the bits.
>
> This fixes a compilation error observed in F1 2015.
>
> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
> Cc: mesa-stable at lists.freedesktop.org
> ---
>  src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
> index 3c3d611..4c013c4 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
> @@ -820,11 +820,11 @@ NVC0LoweringPass::handleTEX(TexInstruction *i)
>           // Either there is 1 offset, which goes into the 2 low bytes of the
>           // first source, or there are 4 offsets, which go into 2 sources (8
>           // values, 1 byte each).
> -         Value *offs[2] = {NULL, NULL};
> +         Value *offs[2] = {bld.getScratch(), bld.getScratch()};
>           for (n = 0; n < i->tex.useOffsets; n++) {
>              for (c = 0; c < 2; ++c) {
>                 if ((n % 2) == 0 && c == 0)
> -                  offs[n / 2] = i->offset[n][c].get();
> +                  bld.mkMov(offs[n / 2], i->offset[n][c].get());
>                 else
>                    bld.mkOp3(OP_INSBF, TYPE_U32,
>                              offs[n / 2],
>

-- 
-Samuel


More information about the mesa-stable mailing list