mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 00:58:05 +02:00
vc4: Move FRAG_X/Y/REV_FLAG to a QFILE like VPM or TLB color writes.
This gives us one less set of special instruction generation cases, and instead just the case for returning the correct register to read.
This commit is contained in:
parent
f029932cac
commit
30b818d5eb
4 changed files with 29 additions and 27 deletions
|
|
@ -646,8 +646,8 @@ emit_vertex_input(struct vc4_compile *c, int attr)
|
|||
static void
|
||||
emit_fragcoord_input(struct vc4_compile *c, int attr)
|
||||
{
|
||||
c->inputs[attr * 4 + 0] = qir_FRAG_X(c);
|
||||
c->inputs[attr * 4 + 1] = qir_FRAG_Y(c);
|
||||
c->inputs[attr * 4 + 0] = qir_ITOF(c, qir_reg(QFILE_FRAG_X, 0));
|
||||
c->inputs[attr * 4 + 1] = qir_ITOF(c, qir_reg(QFILE_FRAG_Y, 0));
|
||||
c->inputs[attr * 4 + 2] =
|
||||
qir_FMUL(c,
|
||||
qir_ITOF(c, qir_FRAG_Z(c)),
|
||||
|
|
@ -1428,7 +1428,9 @@ ntq_setup_inputs(struct vc4_compile *c)
|
|||
if (var->data.location == VARYING_SLOT_POS) {
|
||||
emit_fragcoord_input(c, loc);
|
||||
} else if (var->data.location == VARYING_SLOT_FACE) {
|
||||
c->inputs[loc * 4 + 0] = qir_FRAG_REV_FLAG(c);
|
||||
c->inputs[loc * 4 + 0] =
|
||||
qir_ITOF(c, qir_reg(QFILE_FRAG_REV_FLAG,
|
||||
0));
|
||||
} else if (var->data.location >= VARYING_SLOT_VAR0 &&
|
||||
(c->fs_key->point_sprite_mask &
|
||||
(1 << (var->data.location -
|
||||
|
|
|
|||
|
|
@ -72,11 +72,8 @@ static const struct qir_op_info qir_op_info[] = {
|
|||
[QOP_MS_MASK] = { "ms_mask", 0, 1, true },
|
||||
[QOP_VARY_ADD_C] = { "vary_add_c", 1, 1 },
|
||||
|
||||
[QOP_FRAG_X] = { "frag_x", 1, 0 },
|
||||
[QOP_FRAG_Y] = { "frag_y", 1, 0 },
|
||||
[QOP_FRAG_Z] = { "frag_z", 1, 0 },
|
||||
[QOP_FRAG_W] = { "frag_w", 1, 0 },
|
||||
[QOP_FRAG_REV_FLAG] = { "frag_rev_flag", 1, 0 },
|
||||
|
||||
[QOP_TEX_S] = { "tex_s", 0, 2 },
|
||||
[QOP_TEX_T] = { "tex_t", 0, 2 },
|
||||
|
|
@ -236,6 +233,9 @@ qir_print_reg(struct vc4_compile *c, struct qreg reg, bool write)
|
|||
[QFILE_TLB_COLOR_WRITE_MS] = "tlb_c_ms",
|
||||
[QFILE_TLB_Z_WRITE] = "tlb_z",
|
||||
[QFILE_TLB_STENCIL_SETUP] = "tlb_stencil",
|
||||
[QFILE_FRAG_X] = "frag_x",
|
||||
[QFILE_FRAG_Y] = "frag_y",
|
||||
[QFILE_FRAG_REV_FLAG] = "frag_rev_flag",
|
||||
};
|
||||
|
||||
switch (reg.file) {
|
||||
|
|
|
|||
|
|
@ -54,6 +54,13 @@ enum qfile {
|
|||
QFILE_TLB_Z_WRITE,
|
||||
QFILE_TLB_STENCIL_SETUP,
|
||||
|
||||
/* Payload registers that aren't in the physical register file, so we
|
||||
* can just use the corresponding qpu_reg at qpu_emit time.
|
||||
*/
|
||||
QFILE_FRAG_X,
|
||||
QFILE_FRAG_Y,
|
||||
QFILE_FRAG_REV_FLAG,
|
||||
|
||||
/**
|
||||
* Stores an immediate value in the index field that can be turned
|
||||
* into a small immediate field by qpu_encode_small_immediate().
|
||||
|
|
@ -114,11 +121,8 @@ enum qop {
|
|||
QOP_MS_MASK,
|
||||
QOP_VARY_ADD_C,
|
||||
|
||||
QOP_FRAG_X,
|
||||
QOP_FRAG_Y,
|
||||
QOP_FRAG_Z,
|
||||
QOP_FRAG_W,
|
||||
QOP_FRAG_REV_FLAG,
|
||||
|
||||
/** Texture x coordinate parameter write */
|
||||
QOP_TEX_S,
|
||||
|
|
@ -622,11 +626,8 @@ QIR_NODST_2(TEX_T)
|
|||
QIR_NODST_2(TEX_R)
|
||||
QIR_NODST_2(TEX_B)
|
||||
QIR_NODST_2(TEX_DIRECT)
|
||||
QIR_ALU0(FRAG_X)
|
||||
QIR_ALU0(FRAG_Y)
|
||||
QIR_ALU0(FRAG_Z)
|
||||
QIR_ALU0(FRAG_W)
|
||||
QIR_ALU0(FRAG_REV_FLAG)
|
||||
QIR_ALU0(TEX_RESULT)
|
||||
QIR_ALU0(TLB_COLOR_READ)
|
||||
QIR_NODST_1(MS_MASK)
|
||||
|
|
|
|||
|
|
@ -300,6 +300,17 @@ vc4_generate_code(struct vc4_context *vc4, struct vc4_compile *c)
|
|||
last_vpm_read_index = qinst->src[i].index;
|
||||
src[i] = qpu_ra(QPU_R_VPM);
|
||||
break;
|
||||
|
||||
case QFILE_FRAG_X:
|
||||
src[i] = qpu_ra(QPU_R_XY_PIXEL_COORD);
|
||||
break;
|
||||
case QFILE_FRAG_Y:
|
||||
src[i] = qpu_rb(QPU_R_XY_PIXEL_COORD);
|
||||
break;
|
||||
case QFILE_FRAG_REV_FLAG:
|
||||
src[i] = qpu_rb(QPU_R_MS_REV_FLAGS);
|
||||
break;
|
||||
|
||||
case QFILE_TLB_COLOR_WRITE:
|
||||
case QFILE_TLB_COLOR_WRITE_MS:
|
||||
case QFILE_TLB_Z_WRITE:
|
||||
|
|
@ -339,6 +350,9 @@ vc4_generate_code(struct vc4_context *vc4, struct vc4_compile *c)
|
|||
case QFILE_VARY:
|
||||
case QFILE_UNIF:
|
||||
case QFILE_SMALL_IMM:
|
||||
case QFILE_FRAG_X:
|
||||
case QFILE_FRAG_Y:
|
||||
case QFILE_FRAG_REV_FLAG:
|
||||
assert(!"not reached");
|
||||
break;
|
||||
}
|
||||
|
|
@ -375,21 +389,6 @@ vc4_generate_code(struct vc4_context *vc4, struct vc4_compile *c)
|
|||
|
||||
break;
|
||||
|
||||
case QOP_FRAG_X:
|
||||
queue(c, qpu_a_ITOF(dst,
|
||||
qpu_ra(QPU_R_XY_PIXEL_COORD)));
|
||||
break;
|
||||
|
||||
case QOP_FRAG_Y:
|
||||
queue(c, qpu_a_ITOF(dst,
|
||||
qpu_rb(QPU_R_XY_PIXEL_COORD)));
|
||||
break;
|
||||
|
||||
case QOP_FRAG_REV_FLAG:
|
||||
queue(c, qpu_a_ITOF(dst,
|
||||
qpu_rb(QPU_R_MS_REV_FLAGS)));
|
||||
break;
|
||||
|
||||
case QOP_MS_MASK:
|
||||
src[1] = qpu_ra(QPU_R_MS_REV_FLAGS);
|
||||
fixup_raddr_conflict(c, dst, &src[0], &src[1],
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue