[Mesa-dev] [PATCH] (UNTESTED) virgl: filter out 2D constant file accesses and declarations
Nicolai Hähnle
nhaehnle at gmail.com
Tue Sep 12 20:36:28 UTC 2017
FWIW, this patch should be a no-op without the offending "tgsi/ureg:
always emit constants (and their decls) as 2D" commit.
On 12.09.2017 22:34, Nicolai Hähnle wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> Sorry for the mess.
>
> I suspect something like this patch is needed. Is this sufficient to
> fix the problem?
>
> Cheers,
> Nicolai
> ---
> src/gallium/drivers/virgl/virgl_tgsi.c | 24 ++++++++++++++++++++++++
> 1 file changed, 24 insertions(+)
>
> diff --git a/src/gallium/drivers/virgl/virgl_tgsi.c b/src/gallium/drivers/virgl/virgl_tgsi.c
> index 7ad1cbdb886..4151e1d8450 100644
> --- a/src/gallium/drivers/virgl/virgl_tgsi.c
> +++ b/src/gallium/drivers/virgl/virgl_tgsi.c
> @@ -42,36 +42,60 @@ virgl_tgsi_transform_property(struct tgsi_transform_context *ctx,
> case TGSI_PROPERTY_NUM_CULLDIST_ENABLED:
> case TGSI_PROPERTY_NEXT_SHADER:
> break;
> default:
> ctx->emit_property(ctx, prop);
> break;
> }
> }
>
> static void
> +virgl_tgsi_transform_declaration(struct tgsi_transform_context *ctx,
> + struct tgsi_full_declaration *decl)
> +{
> + if (decl->Declaration.File == TGSI_FILE_CONSTANT &&
> + decl->Declaration.Dimension &&
> + decl->Dim.Index2D == 0)
> + decl->Declaration.Dimension = 0;
> +
> + ctx->emit_declaration(ctx, decl);
> +}
> +
> +static void
> virgl_tgsi_transform_instruction(struct tgsi_transform_context *ctx,
> struct tgsi_full_instruction *inst)
> {
> if (inst->Instruction.Precise)
> inst->Instruction.Precise = 0;
> +
> + for (unsigned i = 0; i < inst->Instruction.NumSrcRegs; ++i) {
> + struct tgsi_full_src_register *src = &inst->Src[i];
> +
> + if (src->Register.File == TGSI_FILE_CONSTANT &&
> + src->Register.Dimension &&
> + !src->Dimension.Indirect &&
> + src->Dimension.Index == 0)
> + src->Register.Dimension = 0;
> + }
> +
> ctx->emit_instruction(ctx, inst);
> }
>
> struct tgsi_token *virgl_tgsi_transform(const struct tgsi_token *tokens_in)
> {
>
> struct virgl_transform_context transform;
> const uint newLen = tgsi_num_tokens(tokens_in);
> struct tgsi_token *new_tokens;
>
> new_tokens = tgsi_alloc_tokens(newLen);
> if (!new_tokens)
> return NULL;
>
> memset(&transform, 0, sizeof(transform));
> transform.base.transform_property = virgl_tgsi_transform_property;
> transform.base.transform_instruction = virgl_tgsi_transform_instruction;
> + transform.base.transform_declaration = virgl_tgsi_transform_declaration;
> tgsi_transform_shader(tokens_in, new_tokens, newLen, &transform.base);
>
> return new_tokens;
> }
>
--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
More information about the mesa-dev
mailing list