nvc0/ir: fix TargetNVC0::insnCanLoadOffset()
[mesa.git] / src / gallium / drivers / virgl / virgl_tgsi.c
index 7ad1cbdb886b56111f304d74618344c3d02c41fc..ff5abf6ddbd929752b0f890c4afea1f51d58c161 100644 (file)
 */
 #include "tgsi/tgsi_transform.h"
 #include "virgl_context.h"
+#include "virgl_screen.h"
 struct virgl_transform_context {
    struct tgsi_transform_context base;
+   bool cull_enabled;
 };
 
+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
 virgl_tgsi_transform_property(struct tgsi_transform_context *ctx,
                               struct tgsi_full_property *prop)
 {
+   struct virgl_transform_context *vtctx = (struct virgl_transform_context *)ctx;
    switch (prop->Property.PropertyName) {
    case TGSI_PROPERTY_NUM_CLIPDIST_ENABLED:
    case TGSI_PROPERTY_NUM_CULLDIST_ENABLED:
+      if (vtctx->cull_enabled)
+        ctx->emit_property(ctx, prop);
+      break;
    case TGSI_PROPERTY_NEXT_SHADER:
       break;
    default:
@@ -54,12 +78,19 @@ 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].Dimension.Index == 0)
+         inst->Src[i].Register.Dimension = 0;
+   }
    ctx->emit_instruction(ctx, inst);
 }
 
-struct tgsi_token *virgl_tgsi_transform(const struct tgsi_token *tokens_in)
+struct tgsi_token *virgl_tgsi_transform(struct virgl_context *vctx, const struct tgsi_token *tokens_in)
 {
-
+   struct virgl_screen *vscreen = (struct virgl_screen *)vctx->base.screen;
    struct virgl_transform_context transform;
    const uint newLen = tgsi_num_tokens(tokens_in);
    struct tgsi_token *new_tokens;
@@ -69,8 +100,10 @@ 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;
+   transform.cull_enabled = vscreen->caps.caps.v1.bset.has_cull;
    tgsi_transform_shader(tokens_in, new_tokens, newLen, &transform.base);
 
    return new_tokens;