diff options
author | Eric Anholt <[email protected]> | 2015-01-08 18:32:29 -0800 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2015-01-10 13:54:12 +1300 |
commit | 72cb6619cb75a92901d372d687505a747a384571 (patch) | |
tree | 90568090fa72cec2f3c6aa78cd274dd5453cece0 /src/gallium/drivers/vc4/vc4_qpu_emit.c | |
parent | 3093bfacf042516cd2a0fa2346da1e9df5f321ec (diff) |
vc4: Restructure color packing as a series of channel replacements.
I'm using this in some WIP commits for doing blending in 8888 instead of
vec4. But it also gives us these results immediately, thanks to allowing
more uniforms/immediates in the arguments:
total instructions in shared programs: 41027 -> 40960 (-0.16%)
instructions in affected programs: 4381 -> 4314 (-1.53%)
Diffstat (limited to 'src/gallium/drivers/vc4/vc4_qpu_emit.c')
-rw-r--r-- | src/gallium/drivers/vc4/vc4_qpu_emit.c | 50 |
1 files changed, 25 insertions, 25 deletions
diff --git a/src/gallium/drivers/vc4/vc4_qpu_emit.c b/src/gallium/drivers/vc4/vc4_qpu_emit.c index 503f32a4c05..857d56e0f44 100644 --- a/src/gallium/drivers/vc4/vc4_qpu_emit.c +++ b/src/gallium/drivers/vc4/vc4_qpu_emit.c @@ -347,40 +347,40 @@ vc4_generate_code(struct vc4_context *vc4, struct vc4_compile *c) break; - case QOP_PACK_COLORS: { - /* We have to be careful not to start writing over one - * of our source values when incrementally writing the - * destination. So, if the dst is one of the srcs, we - * pack that one first (and we pack 4 channels at once - * for the first pack). - */ - struct qpu_reg first_pack = src[0]; - for (int i = 0; i < 4; i++) { - if (src[i].mux == dst.mux && - src[i].addr == dst.addr) { - first_pack = dst; - break; - } - } - queue(c, qpu_m_MOV(dst, first_pack)); + case QOP_PACK_8888_F: + queue(c, qpu_m_MOV(dst, src[0])); *last_inst(c) |= QPU_PM; *last_inst(c) |= QPU_SET_FIELD(QPU_PACK_MUL_8888, QPU_PACK); + break; - for (int i = 0; i < 4; i++) { - if (src[i].mux == first_pack.mux && - src[i].addr == first_pack.addr) { - continue; + case QOP_PACK_8A_F: + case QOP_PACK_8B_F: + case QOP_PACK_8C_F: + case QOP_PACK_8D_F: + /* If dst doesn't happen to already contain src[0], + * then we have to move it in. + */ + if (qinst->src[0].file != QFILE_NULL && + (src[0].mux != dst.mux || src[0].addr != dst.addr)) { + /* Don't overwrite src1 while setting up + * the dst! + */ + if (dst.mux == src[1].mux && + dst.addr == src[1].addr) { + queue(c, qpu_m_MOV(qpu_rb(31), src[1])); + src[1] = qpu_rb(31); } - queue(c, qpu_m_MOV(dst, src[i])); - *last_inst(c) |= QPU_PM; - *last_inst(c) |= QPU_SET_FIELD(QPU_PACK_MUL_8A + i, - QPU_PACK); + queue(c, qpu_m_MOV(dst, src[0])); } + queue(c, qpu_m_MOV(dst, src[1])); + *last_inst(c) |= QPU_PM; + *last_inst(c) |= QPU_SET_FIELD(QPU_PACK_MUL_8A + + qinst->op - QOP_PACK_8A_F, + QPU_PACK); break; - } case QOP_FRAG_X: queue(c, qpu_a_ITOF(dst, |