pan/bi: Use canonical name for FAU RAM sources

The uniform_constant field and BIFROST_SRC_CONST_{LO,HI} definitions
seem to imply that those only deal with embedded constants. Let's
rename them to reflect the fact that they actually encode accesses to
the Fast-Access-Uniform RAM.

Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7151>
This commit is contained in:
Boris Brezillon
2020-10-12 10:57:40 +02:00
parent 111cf7f0e8
commit f25850bf5f
5 changed files with 49 additions and 48 deletions

View File

@@ -115,17 +115,18 @@ bi_constant_field(unsigned idx)
} }
static bool static bool
bi_assign_uniform_constant_single( bi_assign_fau_idx_single(bi_registers *regs,
bi_registers *regs, bi_clause *clause,
bi_clause *clause, bi_instruction *ins,
bi_instruction *ins, bool assigned, bool fast_zero) bool assigned,
bool fast_zero)
{ {
if (!ins) if (!ins)
return assigned; return assigned;
if (ins->type == BI_BLEND) { if (ins->type == BI_BLEND) {
assert(!assigned); assert(!assigned);
regs->uniform_constant = 0x8; regs->fau_idx = 0x8;
return true; return true;
} }
@@ -140,10 +141,10 @@ bi_assign_uniform_constant_single(
/* Build the constant */ /* Build the constant */
unsigned C = bi_constant_field(idx) | lo; unsigned C = bi_constant_field(idx) | lo;
if (assigned && regs->uniform_constant != C) if (assigned && regs->fau_idx != C)
unreachable("Mismatched uniform/const field: branch"); unreachable("Mismatched fau_idx: branch");
regs->uniform_constant = C; regs->fau_idx = C;
return true; return true;
} }
@@ -163,25 +164,25 @@ bi_assign_uniform_constant_single(
unsigned lo = clause->constants[idx] & 0xF; unsigned lo = clause->constants[idx] & 0xF;
unsigned f = bi_constant_field(idx) | lo; unsigned f = bi_constant_field(idx) | lo;
if (assigned && regs->uniform_constant != f) if (assigned && regs->fau_idx != f)
unreachable("Mismatched uniform/const field: imm"); unreachable("Mismatched uniform/const field: imm");
regs->uniform_constant = f; regs->fau_idx = f;
ins->src[s] = BIR_INDEX_PASS | (hi ? BIFROST_SRC_CONST_HI : BIFROST_SRC_CONST_LO); ins->src[s] = BIR_INDEX_PASS | (hi ? BIFROST_SRC_FAU_HI : BIFROST_SRC_FAU_LO);
assigned = true; assigned = true;
} else if (ins->src[s] & BIR_INDEX_ZERO && (ins->type == BI_LOAD_UNIFORM || ins->type == BI_LOAD_VAR)) { } else if (ins->src[s] & BIR_INDEX_ZERO && (ins->type == BI_LOAD_UNIFORM || ins->type == BI_LOAD_VAR)) {
/* XXX: HACK UNTIL WE HAVE HI MATCHING DUE TO OVERFLOW XXX */ /* XXX: HACK UNTIL WE HAVE HI MATCHING DUE TO OVERFLOW XXX */
ins->src[s] = BIR_INDEX_PASS | BIFROST_SRC_CONST_HI; ins->src[s] = BIR_INDEX_PASS | BIFROST_SRC_FAU_HI;
} else if (ins->src[s] & BIR_INDEX_ZERO && !fast_zero) { } else if (ins->src[s] & BIR_INDEX_ZERO && !fast_zero) {
/* FMAs have a fast zero slot, ADD needs to use the /* FMAs have a fast zero slot, ADD needs to use the
* uniform/const slot's special 0 mode handled here */ * uniform/const slot's special 0 mode handled here */
unsigned f = 0; unsigned f = 0;
if (assigned && regs->uniform_constant != f) if (assigned && regs->fau_idx != f)
unreachable("Mismatched uniform/const field: 0"); unreachable("Mismatched uniform/const field: 0");
regs->uniform_constant = f; regs->fau_idx = f;
ins->src[s] = BIR_INDEX_PASS | BIFROST_SRC_CONST_LO; ins->src[s] = BIR_INDEX_PASS | BIFROST_SRC_FAU_LO;
assigned = true; assigned = true;
} else if (ins->src[s] & BIR_INDEX_ZERO && fast_zero) { } else if (ins->src[s] & BIR_INDEX_ZERO && fast_zero) {
ins->src[s] = BIR_INDEX_PASS | BIFROST_SRC_STAGE; ins->src[s] = BIR_INDEX_PASS | BIFROST_SRC_STAGE;
@@ -194,15 +195,14 @@ bi_assign_uniform_constant_single(
} }
static void static void
bi_assign_uniform_constant( bi_assign_fau_idx(bi_clause *clause,
bi_clause *clause, bi_registers *regs,
bi_registers *regs, bi_bundle bundle)
bi_bundle bundle)
{ {
bool assigned = bool assigned =
bi_assign_uniform_constant_single(regs, clause, bundle.fma, false, true); bi_assign_fau_idx_single(regs, clause, bundle.fma, false, true);
bi_assign_uniform_constant_single(regs, clause, bundle.add, assigned, false); bi_assign_fau_idx_single(regs, clause, bundle.add, assigned, false);
} }
/* Assigns a slot for reading, before anything is written */ /* Assigns a slot for reading, before anything is written */
@@ -395,7 +395,7 @@ bi_pack_registers(bi_registers regs)
s.reg2 = regs.slot[2]; s.reg2 = regs.slot[2];
s.reg3 = regs.slot[3]; s.reg3 = regs.slot[3];
s.uniform_const = regs.uniform_constant; s.fau_idx = regs.fau_idx;
memcpy(&packed, &s, sizeof(s)); memcpy(&packed, &s, sizeof(s));
return packed; return packed;
@@ -612,7 +612,7 @@ bi_pack_add_branch_cond(bi_instruction *ins, bi_registers *regs)
struct bifrost_branch pack = { struct bifrost_branch pack = {
.src0 = bi_get_src(ins, regs, 0), .src0 = bi_get_src(ins, regs, 0),
.src1 = (zero_ctrl << 1) | !slot_swapped, .src1 = (zero_ctrl << 1) | !slot_swapped,
.src2 = BIFROST_SRC_CONST_HI, .src2 = BIFROST_SRC_FAU_HI,
.cond = BR_COND_EQ, .cond = BR_COND_EQ,
.size = BR_SIZE_ZERO, .size = BR_SIZE_ZERO,
.op = BIFROST_ADD_OP_BRANCH .op = BIFROST_ADD_OP_BRANCH
@@ -626,11 +626,11 @@ bi_pack_add_branch_uncond(bi_instruction *ins, bi_registers *regs)
{ {
struct bifrost_branch pack = { struct bifrost_branch pack = {
/* It's unclear what these bits actually mean */ /* It's unclear what these bits actually mean */
.src0 = BIFROST_SRC_CONST_LO, .src0 = BIFROST_SRC_FAU_LO,
.src1 = BIFROST_SRC_PASS_FMA, .src1 = BIFROST_SRC_PASS_FMA,
/* Offset, see above */ /* Offset, see above */
.src2 = BIFROST_SRC_CONST_HI, .src2 = BIFROST_SRC_FAU_HI,
/* All ones in fact */ /* All ones in fact */
.cond = (BR_ALWAYS & 0x7), .cond = (BR_ALWAYS & 0x7),
@@ -894,7 +894,7 @@ static struct bi_packed_bundle
bi_pack_bundle(bi_clause *clause, bi_bundle bundle, bi_bundle prev, bool first_bundle, gl_shader_stage stage) bi_pack_bundle(bi_clause *clause, bi_bundle bundle, bi_bundle prev, bool first_bundle, gl_shader_stage stage)
{ {
bi_assign_slots(&bundle, &prev); bi_assign_slots(&bundle, &prev);
bi_assign_uniform_constant(clause, &bundle.regs, bundle); bi_assign_fau_idx(clause, &bundle.regs, bundle);
bundle.regs.first_instruction = first_bundle; bundle.regs.first_instruction = first_bundle;
bi_flip_slots(&bundle.regs); bi_flip_slots(&bundle.regs);

View File

@@ -163,8 +163,8 @@ enum bifrost_packed_src {
BIFROST_SRC_PORT1 = 1, BIFROST_SRC_PORT1 = 1,
BIFROST_SRC_PORT2 = 2, BIFROST_SRC_PORT2 = 2,
BIFROST_SRC_STAGE = 3, BIFROST_SRC_STAGE = 3,
BIFROST_SRC_CONST_LO = 4, BIFROST_SRC_FAU_LO = 4,
BIFROST_SRC_CONST_HI = 5, BIFROST_SRC_FAU_HI = 5,
BIFROST_SRC_PASS_FMA = 6, BIFROST_SRC_PASS_FMA = 6,
BIFROST_SRC_PASS_ADD = 7, BIFROST_SRC_PASS_ADD = 7,
}; };
@@ -252,7 +252,7 @@ enum branch_bit_size {
}; };
struct bifrost_regs { struct bifrost_regs {
unsigned uniform_const : 8; unsigned fau_idx : 8;
unsigned reg3 : 6; unsigned reg3 : 6;
unsigned reg2 : 6; unsigned reg2 : 6;
unsigned reg0 : 5; unsigned reg0 : 5;

View File

@@ -158,8 +158,8 @@ bi_emit_frag_out(bi_context *ctx, nir_intrinsic_instr *instr)
pan_src_index(&instr->src[0]), pan_src_index(&instr->src[0]),
BIR_INDEX_REGISTER | 60 /* Can this be arbitrary? */, BIR_INDEX_REGISTER | 60 /* Can this be arbitrary? */,
/* Blend descriptor */ /* Blend descriptor */
BIR_INDEX_PASS | BIFROST_SRC_CONST_LO, BIR_INDEX_PASS | BIFROST_SRC_FAU_LO,
BIR_INDEX_PASS | BIFROST_SRC_CONST_HI, BIR_INDEX_PASS | BIFROST_SRC_FAU_HI,
}, },
.src_types = { .src_types = {
nir_intrinsic_src_type(instr), nir_intrinsic_src_type(instr),
@@ -343,7 +343,7 @@ bi_emit_ld_frag_coord(bi_context *ctx, nir_intrinsic_instr *instr)
.dest = bi_make_temp(ctx), .dest = bi_make_temp(ctx),
.src = { .src = {
BIR_INDEX_CONSTANT, BIR_INDEX_CONSTANT,
BIR_INDEX_PASS | BIFROST_SRC_CONST_LO BIR_INDEX_PASS | BIFROST_SRC_FAU_LO
}, },
.src_types = { nir_type_uint32, nir_type_uint32 }, .src_types = { nir_type_uint32, nir_type_uint32 },
.constant = { .constant = {

View File

@@ -356,8 +356,8 @@ typedef struct {
/* Configuration for slots 2/3 */ /* Configuration for slots 2/3 */
struct bifrost_reg_ctrl_23 slot23; struct bifrost_reg_ctrl_23 slot23;
/* Packed uniform/constant */ /* Fast-Access-Uniform RAM index */
uint8_t uniform_constant; uint8_t fau_idx;
/* Whether writes are actually for the last instruction */ /* Whether writes are actually for the last instruction */
bool first_instruction; bool first_instruction;
@@ -369,6 +369,7 @@ typedef struct {
*/ */
typedef struct { typedef struct {
uint8_t fau_idx;
bi_registers regs; bi_registers regs;
bi_instruction *fma; bi_instruction *fma;
bi_instruction *add; bi_instruction *add;

View File

@@ -186,9 +186,9 @@ static void dump_regs(FILE *fp, struct bifrost_regs srcs, bool first)
else if (ctrl.slot23.slot3 == BIFROST_OP_WRITE_HI) else if (ctrl.slot23.slot3 == BIFROST_OP_WRITE_HI)
fprintf(fp, "slot 3: r%d (write hi %s) ", srcs.reg3, slot3_fma); fprintf(fp, "slot 3: r%d (write hi %s) ", srcs.reg3, slot3_fma);
if (srcs.uniform_const) { if (srcs.fau_idx) {
if (srcs.uniform_const & 0x80) { if (srcs.fau_idx & 0x80) {
fprintf(fp, "uniform: u%d", (srcs.uniform_const & 0x7f) * 2); fprintf(fp, "uniform: u%d", (srcs.fau_idx & 0x7f) * 2);
} }
} }
@@ -291,15 +291,15 @@ const_fau_to_idx(unsigned fau_value)
return map[fau_value]; return map[fau_value];
} }
static void dump_uniform_const_src(FILE *fp, struct bifrost_regs srcs, struct bi_constants *consts, bool high32) static void dump_fau_src(FILE *fp, struct bifrost_regs srcs, struct bi_constants *consts, bool high32)
{ {
if (srcs.uniform_const & 0x80) { if (srcs.fau_idx & 0x80) {
unsigned uniform = (srcs.uniform_const & 0x7f); unsigned uniform = (srcs.fau_idx & 0x7f);
fprintf(fp, "u%d.w%d", uniform, high32); fprintf(fp, "u%d.w%d", uniform, high32);
} else if (srcs.uniform_const >= 0x20) { } else if (srcs.fau_idx >= 0x20) {
unsigned idx = const_fau_to_idx(srcs.uniform_const >> 4); unsigned idx = const_fau_to_idx(srcs.fau_idx >> 4);
uint64_t imm = consts->raw[idx]; uint64_t imm = consts->raw[idx];
imm |= (srcs.uniform_const & 0xf); imm |= (srcs.fau_idx & 0xf);
if (consts->mods[idx] != BI_CONSTMOD_NONE) if (consts->mods[idx] != BI_CONSTMOD_NONE)
dump_pc_imm(fp, imm, consts->mods[idx], high32); dump_pc_imm(fp, imm, consts->mods[idx], high32);
else if (high32) else if (high32)
@@ -307,7 +307,7 @@ static void dump_uniform_const_src(FILE *fp, struct bifrost_regs srcs, struct bi
else else
dump_const_imm(fp, imm); dump_const_imm(fp, imm);
} else { } else {
switch (srcs.uniform_const) { switch (srcs.fau_idx) {
case 0: case 0:
fprintf(fp, "#0"); fprintf(fp, "#0");
break; break;
@@ -337,10 +337,10 @@ static void dump_uniform_const_src(FILE *fp, struct bifrost_regs srcs, struct bi
case 13: case 13:
case 14: case 14:
case 15: case 15:
fprintf(fp, "blend_descriptor_%u", (unsigned) srcs.uniform_const - 8); fprintf(fp, "blend_descriptor_%u", (unsigned) srcs.fau_idx - 8);
break; break;
default: default:
fprintf(fp, "XXX - reserved%u", (unsigned) srcs.uniform_const); fprintf(fp, "XXX - reserved%u", (unsigned) srcs.fau_idx);
break; break;
} }
@@ -371,10 +371,10 @@ dump_src(FILE *fp, unsigned src, struct bifrost_regs srcs, struct bi_constants *
fprintf(fp, "t"); // i.e. the output of FMA this cycle fprintf(fp, "t"); // i.e. the output of FMA this cycle
break; break;
case 4: case 4:
dump_uniform_const_src(fp, srcs, consts, false); dump_fau_src(fp, srcs, consts, false);
break; break;
case 5: case 5:
dump_uniform_const_src(fp, srcs, consts, true); dump_fau_src(fp, srcs, consts, true);
break; break;
case 6: case 6:
fprintf(fp, "t0"); fprintf(fp, "t0");