[Mesa-dev] [PATCH] st/mesa: fix 2 crashes in st_tgsi_lower_yuv

Rob Clark robdclark at gmail.com
Fri May 10 20:57:42 UTC 2019


On Fri, May 10, 2019 at 1:29 PM Marek Olšák <maraeo at gmail.com> wrote:
>
> From: Marek Olšák <marek.olsak at amd.com>
>
> src/mesa/state_tracker/st_tgsi_lower_yuv.c:68: void reg_dst(struct
>  tgsi_full_dst_register *, const struct tgsi_full_dst_register *, unsigned
>  int): assertion "dst->Register.WriteMask" failed
>
> The second crash was due to insufficient allocated size for TGSI
> instructions.

I might have split this into two patches, but either way you can add my:

Reviewed-by: Rob Clark <robdclark at gmail.com>

>
> Cc: 19.0 19.1 <mesa-stable at lists.freedesktop.org>
> ---
>  src/mesa/state_tracker/st_tgsi_lower_yuv.c | 48 +++++++++++++---------
>  1 file changed, 28 insertions(+), 20 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_tgsi_lower_yuv.c b/src/mesa/state_tracker/st_tgsi_lower_yuv.c
> index 6acd173adc9..73437ddda70 100644
> --- a/src/mesa/state_tracker/st_tgsi_lower_yuv.c
> +++ b/src/mesa/state_tracker/st_tgsi_lower_yuv.c
> @@ -262,45 +262,53 @@ yuv_to_rgb(struct tgsi_transform_context *tctx,
>     inst.Instruction.Saturate = 0;
>     inst.Instruction.NumDstRegs = 1;
>     inst.Instruction.NumSrcRegs = 2;
>     reg_dst(&inst.Dst[0], &ctx->tmp[A].dst, TGSI_WRITEMASK_XYZ);
>     reg_src(&inst.Src[0], &ctx->tmp[A].src, SWIZ(X, Y, Z, _));
>     reg_src(&inst.Src[1], &ctx->imm[3], SWIZ(X, Y, Z, _));
>     inst.Src[1].Register.Negate = 1;
>     tctx->emit_instruction(tctx, &inst);
>
>     /* DP3 dst.x, tmpA, imm[0] */
> -   inst = dp3_instruction();
> -   reg_dst(&inst.Dst[0], dst, TGSI_WRITEMASK_X);
> -   reg_src(&inst.Src[0], &ctx->tmp[A].src, SWIZ(X, Y, Z, W));
> -   reg_src(&inst.Src[1], &ctx->imm[0], SWIZ(X, Y, Z, W));
> -   tctx->emit_instruction(tctx, &inst);
> +   if (dst->Register.WriteMask & TGSI_WRITEMASK_X) {
> +      inst = dp3_instruction();
> +      reg_dst(&inst.Dst[0], dst, TGSI_WRITEMASK_X);
> +      reg_src(&inst.Src[0], &ctx->tmp[A].src, SWIZ(X, Y, Z, W));
> +      reg_src(&inst.Src[1], &ctx->imm[0], SWIZ(X, Y, Z, W));
> +      tctx->emit_instruction(tctx, &inst);
> +   }
>
>     /* DP3 dst.y, tmpA, imm[1] */
> -   inst = dp3_instruction();
> -   reg_dst(&inst.Dst[0], dst, TGSI_WRITEMASK_Y);
> -   reg_src(&inst.Src[0], &ctx->tmp[A].src, SWIZ(X, Y, Z, W));
> -   reg_src(&inst.Src[1], &ctx->imm[1], SWIZ(X, Y, Z, W));
> -   tctx->emit_instruction(tctx, &inst);
> +   if (dst->Register.WriteMask & TGSI_WRITEMASK_Y) {
> +      inst = dp3_instruction();
> +      reg_dst(&inst.Dst[0], dst, TGSI_WRITEMASK_Y);
> +      reg_src(&inst.Src[0], &ctx->tmp[A].src, SWIZ(X, Y, Z, W));
> +      reg_src(&inst.Src[1], &ctx->imm[1], SWIZ(X, Y, Z, W));
> +      tctx->emit_instruction(tctx, &inst);
> +   }
>
>     /* DP3 dst.z, tmpA, imm[2] */
> -   inst = dp3_instruction();
> -   reg_dst(&inst.Dst[0], dst, TGSI_WRITEMASK_Z);
> -   reg_src(&inst.Src[0], &ctx->tmp[A].src, SWIZ(X, Y, Z, W));
> -   reg_src(&inst.Src[1], &ctx->imm[2], SWIZ(X, Y, Z, W));
> -   tctx->emit_instruction(tctx, &inst);
> +   if (dst->Register.WriteMask & TGSI_WRITEMASK_Z) {
> +      inst = dp3_instruction();
> +      reg_dst(&inst.Dst[0], dst, TGSI_WRITEMASK_Z);
> +      reg_src(&inst.Src[0], &ctx->tmp[A].src, SWIZ(X, Y, Z, W));
> +      reg_src(&inst.Src[1], &ctx->imm[2], SWIZ(X, Y, Z, W));
> +      tctx->emit_instruction(tctx, &inst);
> +   }
>
>     /* MOV dst.w, imm[0].x */
> -   inst = mov_instruction();
> -   reg_dst(&inst.Dst[0], dst, TGSI_WRITEMASK_W);
> -   reg_src(&inst.Src[0], &ctx->imm[3], SWIZ(_, _, _, W));
> -   tctx->emit_instruction(tctx, &inst);
> +   if (dst->Register.WriteMask & TGSI_WRITEMASK_W) {
> +      inst = mov_instruction();
> +      reg_dst(&inst.Dst[0], dst, TGSI_WRITEMASK_W);
> +      reg_src(&inst.Src[0], &ctx->imm[3], SWIZ(_, _, _, W));
> +      tctx->emit_instruction(tctx, &inst);
> +   }
>  }
>
>  static void
>  lower_nv12(struct tgsi_transform_context *tctx,
>             struct tgsi_full_instruction *originst)
>  {
>     struct tgsi_yuv_transform *ctx = tgsi_yuv_transform(tctx);
>     struct tgsi_full_instruction inst;
>     struct tgsi_full_src_register *coord = &originst->Src[0];
>     unsigned samp = originst->Src[1].Register.Index;
> @@ -427,21 +435,21 @@ st_tgsi_lower_yuv(const struct tgsi_token *tokens, unsigned free_slots,
>     memset(&ctx, 0, sizeof(ctx));
>     ctx.base.transform_instruction = transform_instr;
>     ctx.free_slots = free_slots;
>     ctx.lower_nv12 = lower_nv12;
>     ctx.lower_iyuv = lower_iyuv;
>     tgsi_scan_shader(tokens, &ctx.info);
>
>     /* TODO better job of figuring out how many extra tokens we need..
>      * this is a pain about tgsi_transform :-/
>      */
> -   newlen = tgsi_num_tokens(tokens) + 120;
> +   newlen = tgsi_num_tokens(tokens) + 300;
>     newtoks = tgsi_alloc_tokens(newlen);
>     if (!newtoks)
>        return NULL;
>
>     tgsi_transform_shader(tokens, newtoks, newlen, &ctx.base);
>
>  //   tgsi_dump(newtoks, 0);
>  //   debug_printf("\n");
>
>     return newtoks;
> --
> 2.17.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list