if (!ins)
return assigned;
- if (ins->type == BI_BLEND) {
- assert(!assigned);
- regs->fau_idx = 0x8;
- return true;
- }
-
if (ins->type == BI_BRANCH && clause->branch_constant) {
/* By convention branch constant is last */
unsigned idx = clause->constant_count - 1;
assigned = true;
} else if (ins->src[s] & BIR_INDEX_ZERO && fast_zero) {
ins->src[s] = BIR_INDEX_PASS | BIFROST_SRC_STAGE;
+ } else if (ins->src[s] & BIR_INDEX_BLEND) {
+ unsigned rt = ins->blend_location;
+
+ assert(rt <= 7);
+ assert((ins->src[s] & ~BIR_SPECIAL) == BIFROST_SRC_FAU_HI ||
+ (ins->src[s] & ~BIR_SPECIAL) == BIFROST_SRC_FAU_LO);
+ ins->src[s] = BIR_INDEX_PASS | (ins->src[s] & ~BIR_SPECIAL);
+ if (assigned && regs->fau_idx != (8 | rt))
+ unreachable("Mismatched FAU index");
+
+ regs->fau_idx = 8 | rt;
+ assigned = true;
} else if (s & BIR_INDEX_UNIFORM) {
unreachable("Push uniforms not implemented yet");
}
pan_src_index(&instr->src[0]),
BIR_INDEX_REGISTER | 60 /* Can this be arbitrary? */,
/* Blend descriptor */
- BIR_INDEX_PASS | BIFROST_SRC_FAU_LO,
- BIR_INDEX_PASS | BIFROST_SRC_FAU_HI,
+ BIR_INDEX_BLEND | BIFROST_SRC_FAU_LO,
+ BIR_INDEX_BLEND | BIFROST_SRC_FAU_HI,
},
.src_types = {
nir_intrinsic_src_type(instr),
#define BIR_INDEX_CONSTANT (1 << 29)
#define BIR_INDEX_ZERO (1 << 28)
#define BIR_INDEX_PASS (1 << 27)
+#define BIR_INDEX_BLEND (1 << 26)
/* Keep me synced please so we can check src & BIR_SPECIAL */
-#define BIR_SPECIAL ((BIR_INDEX_REGISTER | BIR_INDEX_UNIFORM) | \
- (BIR_INDEX_CONSTANT | BIR_INDEX_ZERO | BIR_INDEX_PASS))
+#define BIR_SPECIAL (BIR_INDEX_REGISTER | BIR_INDEX_UNIFORM | \
+ BIR_INDEX_CONSTANT | BIR_INDEX_ZERO | \
+ BIR_INDEX_PASS | BIR_INDEX_BLEND)
static inline unsigned
bi_max_temp(bi_context *ctx)