pan/midgard: Allow sysval destination override
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Fri, 2 Aug 2019 18:06:21 +0000 (11:06 -0700)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Mon, 12 Aug 2019 19:42:59 +0000 (12:42 -0700)
Sometimes a sysval is used to facilitate an instruction but is not the
instruction itself.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
src/panfrost/midgard/compiler.h
src/panfrost/midgard/midgard_compile.c

index da9e17f29c33ea758945709e85759c081fe450cb..c466ad6a3ab9b13eb7061a9b0dc7f38f664f56d6 100644 (file)
@@ -534,6 +534,9 @@ emit_ubo_read(
         nir_src *indirect_offset,
         unsigned index);
 
+void
+emit_sysval_read(compiler_context *ctx, nir_instr *instr, signed dest_override);
+
 void
 midgard_emit_derivatives(compiler_context *ctx, nir_alu_instr *instr);
 
index c3752784b6b4a39bf34cedaca39ed493691a413e..c0eedb8e1f0511b4bae03f9ba5997086a0563659 100644 (file)
@@ -1218,8 +1218,8 @@ emit_varying_read(
         emit_mir_instruction(ctx, ins);
 }
 
-static void
-emit_sysval_read(compiler_context *ctx, nir_instr *instr)
+void
+emit_sysval_read(compiler_context *ctx, nir_instr *instr, signed dest_override)
 {
         unsigned dest = 0;
 
@@ -1227,6 +1227,9 @@ emit_sysval_read(compiler_context *ctx, nir_instr *instr)
         int sysval = sysval_for_instr(ctx, instr, &dest);
         void *val = _mesa_hash_table_u64_search(ctx->sysval_to_id, sysval);
 
+        if (dest_override >= 0)
+                dest = dest_override;
+
         /* Sysvals are prefix uniforms */
         unsigned uniform = ((uintptr_t) val) - 1;
 
@@ -1437,7 +1440,7 @@ emit_intrinsic(compiler_context *ctx, nir_intrinsic_instr *instr)
 
         case nir_intrinsic_load_viewport_scale:
         case nir_intrinsic_load_viewport_offset:
-                emit_sysval_read(ctx, &instr->instr);
+                emit_sysval_read(ctx, &instr->instr, -1);
                 break;
 
         default:
@@ -1664,7 +1667,7 @@ emit_tex(compiler_context *ctx, nir_tex_instr *instr)
                 emit_texop_native(ctx, instr, TEXTURE_OP_TEXEL_FETCH);
                 break;
         case nir_texop_txs:
-                emit_sysval_read(ctx, &instr->instr);
+                emit_sysval_read(ctx, &instr->instr, -1);
                 break;
         default:
                 unreachable("Unhanlded texture op");