diff options
author | Dave Airlie <[email protected]> | 2017-09-13 09:23:15 +1000 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2017-09-15 10:33:14 +1000 |
commit | b6f6ead198c51e2144c5e880007e2f0a6ffcad3a (patch) | |
tree | aec045a5525dc4337b43a46753d710c487394a3d /src/gallium/drivers | |
parent | a7a7bf21bdf0cf8e59f8c8e17c2580a363be7055 (diff) |
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 <[email protected]>
for also writing nearly the same patch.
Fixes: 41e342d5 tgsi/ureg: always emit constants (and their decls) as 2D
Tested-by: Rob Herring <[email protected]>
Signed-off-by: Dave Airlie <[email protected]>
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r-- | src/gallium/drivers/virgl/virgl_tgsi.c | 27 |
1 files changed, 27 insertions, 0 deletions
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); |