summaryrefslogtreecommitdiffstats
path: root/src/panfrost/midgard
diff options
context:
space:
mode:
authorAlyssa Rosenzweig <[email protected]>2020-02-27 09:41:17 -0500
committerMarge Bot <[email protected]>2020-02-27 21:02:35 +0000
commit0bb25e4713f8d7e1eb58c071d98b081afed9f3dc (patch)
tree9d847b8c8656bbca7aca751615e32591d26ba377 /src/panfrost/midgard
parentf5401cb8866cc74c5b3d0fde278fb1046779b415 (diff)
pan/midgard: Use address analysis for globals, etc
..instead of opencoding for constants and doing the rest as ALU. Signed-off-by: Alyssa Rosenzweig <[email protected]> Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3978> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3978>
Diffstat (limited to 'src/panfrost/midgard')
-rw-r--r--src/panfrost/midgard/compiler.h2
-rw-r--r--src/panfrost/midgard/meson.build1
-rw-r--r--src/panfrost/midgard/midgard_compile.c41
3 files changed, 7 insertions, 37 deletions
diff --git a/src/panfrost/midgard/compiler.h b/src/panfrost/midgard/compiler.h
index ca7d2c708ca..8ee99ab3549 100644
--- a/src/panfrost/midgard/compiler.h
+++ b/src/panfrost/midgard/compiler.h
@@ -574,6 +574,8 @@ void mir_insert_instruction_after_scheduled(compiler_context *ctx, midgard_block
void mir_flip(midgard_instruction *ins);
void mir_compute_temp_count(compiler_context *ctx);
+void mir_set_offset(compiler_context *ctx, midgard_instruction *ins, nir_src *offset, bool is_shared);
+
/* 'Intrinsic' move for aliasing */
static inline midgard_instruction
diff --git a/src/panfrost/midgard/meson.build b/src/panfrost/midgard/meson.build
index ddc6ad3c639..af2c09d5902 100644
--- a/src/panfrost/midgard/meson.build
+++ b/src/panfrost/midgard/meson.build
@@ -22,6 +22,7 @@
libpanfrost_midgard_files = files(
'midgard_compile.c',
'mir.c',
+ 'midgard_address.c',
'midgard_print.c',
'midgard_schedule.c',
'midgard_derivatives.c',
diff --git a/src/panfrost/midgard/midgard_compile.c b/src/panfrost/midgard/midgard_compile.c
index 179902fd993..eb50e215d9e 100644
--- a/src/panfrost/midgard/midgard_compile.c
+++ b/src/panfrost/midgard/midgard_compile.c
@@ -1265,8 +1265,7 @@ emit_global(
nir_instr *instr,
bool is_read,
unsigned srcdest,
- unsigned offset,
- nir_src *indirect_offset,
+ nir_src *offset,
bool is_shared)
{
/* TODO: types */
@@ -1278,31 +1277,7 @@ emit_global(
else
ins = m_st_int4(srcdest, 0);
- ins.constants.u32[0] = offset;
-
- /* The source array:
- *
- * src[0] = store ? value : unused
- * src[1] = arg_1
- * src[2] = arg_2
- *
- * We would like arg_1 = the address and
- * arg_2 = the offset. For shareds, there is no address and we use a
- * magic number instead.
- */
-
- /* TODO: What is this? */
- ins.load_store.arg_1 = is_shared ?
- indirect_offset ? 0xEE : 0x6E :
- 0x7E;
-
- assert(indirect_offset || is_shared); /* is_global => indirect */
-
- if (indirect_offset)
- ins.src[2] = nir_src_index(ctx, indirect_offset);
- else
- ins.load_store.arg_2 = 0x1E;
-
+ mir_set_offset(ctx, &ins, offset, is_shared);
mir_set_intr_mask(instr, &ins, is_read);
emit_mir_instruction(ctx, ins);
@@ -1593,7 +1568,7 @@ emit_intrinsic(compiler_context *ctx, nir_intrinsic_instr *instr)
uint32_t uindex = nir_src_as_uint(index) + 1;
emit_ubo_read(ctx, &instr->instr, reg, offset, indirect_offset, 0, uindex);
} else if (is_global || is_shared) {
- emit_global(ctx, &instr->instr, true, reg, offset, indirect_offset, is_shared);
+ emit_global(ctx, &instr->instr, true, reg, src_offset, is_shared);
} else if (ctx->stage == MESA_SHADER_FRAGMENT && !ctx->is_blend) {
emit_varying_read(ctx, reg, offset, nr_comp, component, indirect_offset, t, is_flat);
} else if (ctx->is_blend) {
@@ -1790,15 +1765,7 @@ emit_intrinsic(compiler_context *ctx, nir_intrinsic_instr *instr)
reg = nir_src_index(ctx, &instr->src[0]);
emit_explicit_constant(ctx, reg, reg);
- nir_src *indirect_offset = &instr->src[1];
- unsigned offset = 0;
-
- if (nir_src_is_const(*indirect_offset)) {
- offset = nir_src_as_uint(*indirect_offset);
- indirect_offset = NULL;
- }
-
- emit_global(ctx, &instr->instr, false, reg, offset, indirect_offset, instr->intrinsic == nir_intrinsic_store_shared);
+ emit_global(ctx, &instr->instr, false, reg, &instr->src[1], instr->intrinsic == nir_intrinsic_store_shared);
break;
case nir_intrinsic_load_ssbo_address: