vc4: Fix using and emitting the 1/W from the vertex/coord shaders.

v2: Rebase on helpers change.
This commit is contained in:
Eric Anholt 2014-08-01 15:45:41 -07:00
parent 88bc5baa00
commit 1d03692f78
1 changed files with 20 additions and 14 deletions

View File

@ -579,7 +579,7 @@ emit_frag_end(struct tgsi_to_qir *trans)
}
static void
emit_scaled_viewport_write(struct tgsi_to_qir *trans)
emit_scaled_viewport_write(struct tgsi_to_qir *trans, struct qreg rcp_w)
{
struct qcompile *c = trans->c;
struct qreg xyi[2];
@ -588,28 +588,30 @@ emit_scaled_viewport_write(struct tgsi_to_qir *trans)
struct qreg scale =
add_uniform(trans, QUNIFORM_VIEWPORT_X_SCALE + i, 0);
xyi[i] = qir_FTOI(c, qir_FMUL(c, trans->outputs[i], scale));
xyi[i] = qir_FTOI(c, qir_FMUL(c,
qir_FMUL(c,
trans->outputs[i],
scale),
rcp_w));
}
qir_VPM_WRITE(c, qir_PACK_SCALED(c, xyi[0], xyi[1]));
}
static void
emit_zs_write(struct tgsi_to_qir *trans)
emit_zs_write(struct tgsi_to_qir *trans, struct qreg rcp_w)
{
struct qcompile *c = trans->c;
/* XXX: rescale */
qir_VPM_WRITE(c, trans->outputs[2]);
qir_VPM_WRITE(c, qir_FMUL(c, trans->outputs[2], rcp_w));
}
static void
emit_1_wc_write(struct tgsi_to_qir *trans)
emit_rcp_wc_write(struct tgsi_to_qir *trans, struct qreg rcp_w)
{
struct qcompile *c = trans->c;
/* XXX: RCP */
qir_VPM_WRITE(c, trans->outputs[3]);
qir_VPM_WRITE(c, rcp_w);
}
static void
@ -617,9 +619,11 @@ emit_vert_end(struct tgsi_to_qir *trans)
{
struct qcompile *c = trans->c;
emit_scaled_viewport_write(trans);
emit_zs_write(trans);
emit_1_wc_write(trans);
struct qreg rcp_w = qir_RCP(c, trans->outputs[3]);
emit_scaled_viewport_write(trans, rcp_w);
emit_zs_write(trans, rcp_w);
emit_rcp_wc_write(trans, rcp_w);
for (int i = 4; i < trans->num_outputs; i++) {
qir_VPM_WRITE(c, trans->outputs[i]);
@ -631,12 +635,14 @@ emit_coord_end(struct tgsi_to_qir *trans)
{
struct qcompile *c = trans->c;
struct qreg rcp_w = qir_RCP(c, trans->outputs[3]);
for (int i = 0; i < 4; i++)
qir_VPM_WRITE(c, trans->outputs[i]);
emit_scaled_viewport_write(trans);
emit_zs_write(trans);
emit_1_wc_write(trans);
emit_scaled_viewport_write(trans, rcp_w);
emit_zs_write(trans, rcp_w);
emit_rcp_wc_write(trans, rcp_w);
}
static struct tgsi_to_qir *