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.haeh...@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.
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to