summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/virgl
diff options
context:
space:
mode:
authorDave Airlie <[email protected]>2017-09-13 09:23:15 +1000
committerDave Airlie <[email protected]>2017-09-15 10:33:14 +1000
commitb6f6ead198c51e2144c5e880007e2f0a6ffcad3a (patch)
treeaec045a5525dc4337b43a46753d710c487394a3d /src/gallium/drivers/virgl
parenta7a7bf21bdf0cf8e59f8c8e17c2580a363be7055 (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/virgl')
-rw-r--r--src/gallium/drivers/virgl/virgl_tgsi.c27
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);