[Mesa-dev] [PATCH v3 15/24] i965/vec4: fix VEC4_OPCODE_FROM_DOUBLE for IVB/BYT

Francisco Jerez currojerez at riseup.net
Fri Mar 3 23:55:05 UTC 2017


Samuel Iglesias Gonsálvez <siglesias at igalia.com> writes:

> From: "Juan A. Suarez Romero" <jasuarez at igalia.com>
>
> In the generator we must generate slightly different code for
> Ivybridge/Baytrail, because of the way the stride works in
> this hardware.
> ---
>  src/mesa/drivers/dri/i965/brw_vec4_generator.cpp | 17 ++++++++++++++++-
>  1 file changed, 16 insertions(+), 1 deletion(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp b/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp
> index 7bb1ab1879c..7fa1afc9073 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp
> @@ -1948,13 +1948,28 @@ generate_code(struct brw_codegen *p,
>  
>           brw_set_default_access_mode(p, BRW_ALIGN_1);
>  
> -         dst.hstride = BRW_HORIZONTAL_STRIDE_2;

How would this know whether there was enough space allocated in the
destination to hold the destination value with a stride of two?  What if
the following SIMD vector in the same GRF allocation actually contained
useful single-precision data that is getting corrupted by the oversized
strided destination?  I think we should be doing this pre-regalloc so we
can allocate a temporary large enough to hold the strided value...

> +         /* When converting from DF->F, we set destination's stride as 2 as an
> +          * aligment requirement. But in IVB/BYT, each DF implicitly writes
> +          * two floats, being the first one the converted value. So we don't
> +          * need to explicitly set stride 2, but 1.
> +          */
> +         if (devinfo->gen == 7 && !devinfo->is_haswell)
> +            dst.hstride = BRW_HORIZONTAL_STRIDE_1;
> +         else
> +            dst.hstride = BRW_HORIZONTAL_STRIDE_2;
> +
>           dst.width = BRW_WIDTH_4;
>           src[0].vstride = BRW_VERTICAL_STRIDE_4;
>           src[0].width = BRW_WIDTH_4;
>           brw_MOV(p, dst, src[0]);
>  
spread(dst, desired-stride) so you don't mess up the original
destination brw_reg and have to fix it up again later.

>           struct brw_reg dst_as_src = dst;
> +         /* As we have set horizontal stride 1 instead of 2 in IVB/BYT, we
> +          * need to fix it here to have the expected value.
> +          */
> +         if (devinfo->gen == 7 && !devinfo->is_haswell)
> +            dst_as_src.hstride = BRW_HORIZONTAL_STRIDE_2;
> +
>           dst.hstride = BRW_HORIZONTAL_STRIDE_1;
>           dst.width = BRW_WIDTH_8;
>           brw_MOV(p, dst, dst_as_src);
> -- 
> 2.11.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 212 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170303/f2cbf901/attachment.sig>


More information about the mesa-dev mailing list