From: Dave Airlie Date: Tue, 12 Sep 2017 23:23:15 +0000 (+1000) Subject: virgl: drop const dimensions on first block. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b6f6ead198c51e2144c5e880007e2f0a6ffcad3a;p=mesa.git virgl: drop const dimensions on first block. The virgl protocol version of tgsi doesn't handle this yet, transform it back to the old ways. Thanks to Nicolai Hähnle for also writing nearly the same patch. Fixes: 41e342d5 tgsi/ureg: always emit constants (and their decls) as 2D Tested-by: Rob Herring Signed-off-by: Dave Airlie --- diff --git a/src/gallium/drivers/virgl/virgl_tgsi.c b/src/gallium/drivers/virgl/virgl_tgsi.c index 7ad1cbdb886..aa483ade5df 100644 --- a/src/gallium/drivers/virgl/virgl_tgsi.c +++ b/src/gallium/drivers/virgl/virgl_tgsi.c @@ -31,6 +31,24 @@ struct virgl_transform_context { struct tgsi_transform_context base; }; +static void +virgl_tgsi_transform_declaration(struct tgsi_transform_context *ctx, + struct tgsi_full_declaration *decl) +{ + switch (decl->Declaration.File) { + case TGSI_FILE_CONSTANT: + if (decl->Declaration.Dimension) { + if (decl->Dim.Index2D == 0) + decl->Declaration.Dimension = 0; + } + break; + default: + break; + } + ctx->emit_declaration(ctx, decl); + +} + /* for now just strip out the new properties the remote doesn't understand yet */ static void @@ -54,6 +72,14 @@ virgl_tgsi_transform_instruction(struct tgsi_transform_context *ctx, { if (inst->Instruction.Precise) inst->Instruction.Precise = 0; + + for (unsigned i = 0; i < inst->Instruction.NumSrcRegs; i++) { + if (inst->Src[i].Register.File == TGSI_FILE_CONSTANT && + inst->Src[i].Register.Dimension && + !inst->Src[i].Register.Indirect && + inst->Src[i].Dimension.Index == 0) + inst->Src[i].Register.Dimension = 0; + } ctx->emit_instruction(ctx, inst); } @@ -69,6 +95,7 @@ struct tgsi_token *virgl_tgsi_transform(const struct tgsi_token *tokens_in) return NULL; memset(&transform, 0, sizeof(transform)); + transform.base.transform_declaration = virgl_tgsi_transform_declaration; transform.base.transform_property = virgl_tgsi_transform_property; transform.base.transform_instruction = virgl_tgsi_transform_instruction; tgsi_transform_shader(tokens_in, new_tokens, newLen, &transform.base);