From be56840d5ac3351eb8a650759c62bee6ee5cc1e9 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Thu, 25 Jul 2019 07:09:40 -0700 Subject: [PATCH] pan/midgard: Update RA for cubemap coords Following the RA work, we apply the same technique to eliminate the move to r27 when loading cubemaps. Signed-off-by: Alyssa Rosenzweig --- src/panfrost/midgard/helpers.h | 3 ++- src/panfrost/midgard/midgard_compile.c | 13 ++++--------- src/panfrost/midgard/midgard_ra.c | 2 ++ 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/panfrost/midgard/helpers.h b/src/panfrost/midgard/helpers.h index 76bda28..92545cf 100644 --- a/src/panfrost/midgard/helpers.h +++ b/src/panfrost/midgard/helpers.h @@ -57,7 +57,8 @@ ) #define OP_IS_R27_ONLY(op) ( \ - OP_IS_PROJECTION(op) \ + OP_IS_PROJECTION(op) || \ + op == midgard_op_st_cubemap_coords \ ) #define OP_IS_MOVE(op) ( \ diff --git a/src/panfrost/midgard/midgard_compile.c b/src/panfrost/midgard/midgard_compile.c index 6f50e34..71625e8 100644 --- a/src/panfrost/midgard/midgard_compile.c +++ b/src/panfrost/midgard/midgard_compile.c @@ -173,7 +173,7 @@ M_LOAD(ld_uniform_32); M_LOAD(ld_color_buffer_8); //M_STORE(st_vary_16); M_STORE(st_vary_32); -M_STORE(st_cubemap_coords); +M_LOAD(st_cubemap_coords); static midgard_instruction v_alu_br_compact_cond(midgard_jmp_writeout_op op, unsigned tag, signed offset, unsigned cond) @@ -1578,17 +1578,12 @@ emit_texop_native(compiler_context *ctx, nir_tex_instr *instr, /* texelFetch is undefined on samplerCube */ assert(midgard_texop != TEXTURE_OP_TEXEL_FETCH); - /* For cubemaps, we need to load coords into - * special r27, and then use a special ld/st op - * to select the face and copy the xy into the + /* For cubemaps, we use a special ld/st op to + * select the face and copy the xy into the * texture register */ - alu_src.swizzle = SWIZZLE(COMPONENT_X, COMPONENT_Y, COMPONENT_Z, COMPONENT_X); - - midgard_instruction move = v_mov(index, alu_src, SSA_FIXED_REGISTER(27)); - emit_mir_instruction(ctx, move); - midgard_instruction st = m_st_cubemap_coords(reg, 0); + st.ssa_args.src0 = index; st.load_store.unknown = 0x24; /* XXX: What is this? */ st.mask = 0x3; /* xy */ st.load_store.swizzle = alu_src.swizzle; diff --git a/src/panfrost/midgard/midgard_ra.c b/src/panfrost/midgard/midgard_ra.c index 485ab78..cca167c 100644 --- a/src/panfrost/midgard/midgard_ra.c +++ b/src/panfrost/midgard/midgard_ra.c @@ -704,6 +704,8 @@ install_registers_instr( if (OP_IS_STORE_R26(ins->load_store.op) && fixed) { ins->load_store.reg = SSA_REG_FROM_FIXED(args.src0); + } else if (ins->load_store.op == midgard_op_st_cubemap_coords) { + ins->load_store.reg = SSA_REG_FROM_FIXED(args.dest); } else if (OP_IS_STORE_VARY(ins->load_store.op)) { struct phys_reg src = index_to_reg(ctx, g, args.src0); assert(src.reg == 26 || src.reg == 27); -- 2.7.4