summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/nvc0/nvc0_tgsi_to_nc.c
diff options
context:
space:
mode:
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>2010-12-11 16:23:43 +0100
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>2010-12-11 16:24:27 +0100
commit5138ac033ad3708e2b82f2beebc887f65a77309e (patch)
treeb7b76fc8bd95046f8b389418f17defd67c7015f6 /src/gallium/drivers/nvc0/nvc0_tgsi_to_nc.c
parent67d0c3dd792bc2d188f5f53b7e00eb120758d66c (diff)
nvc0: support user clip planes
Diffstat (limited to 'src/gallium/drivers/nvc0/nvc0_tgsi_to_nc.c')
-rw-r--r--src/gallium/drivers/nvc0/nvc0_tgsi_to_nc.c48
1 files changed, 46 insertions, 2 deletions
diff --git a/src/gallium/drivers/nvc0/nvc0_tgsi_to_nc.c b/src/gallium/drivers/nvc0/nvc0_tgsi_to_nc.c
index 8a20983a7e..d0c8275489 100644
--- a/src/gallium/drivers/nvc0/nvc0_tgsi_to_nc.c
+++ b/src/gallium/drivers/nvc0/nvc0_tgsi_to_nc.c
@@ -111,6 +111,7 @@ struct bld_context {
struct bld_register ovs[BLD_MAX_OUTPS][4]; /* TGSI_FILE_OUTPUT, FP only */
uint32_t outputs_written[(PIPE_MAX_SHADER_OUTPUTS + 7) / 8];
+ int hpos_index;
struct nv_value *zero;
struct nv_value *frag_coord[4];
@@ -904,6 +905,38 @@ bld_is_output_written(struct bld_context *bld, int i, int c)
}
static void
+bld_append_vp_ucp(struct bld_context *bld)
+{
+ struct nv_value *res[6];
+ struct nv_value *ucp, *vtx, *out;
+ struct nv_instruction *insn;
+ int i, c;
+
+ assert(bld->ti->prog->vp.num_ucps <= 6);
+
+ for (c = 0; c < 4; ++c) {
+ vtx = bld_fetch_global(bld, &bld->ovs[bld->hpos_index][c]);
+
+ for (i = 0; i < bld->ti->prog->vp.num_ucps; ++i) {
+ ucp = new_value(bld->pc, NV_FILE_MEM_C(15), 4);
+ ucp->reg.address = i * 16 + c * 4;
+
+ if (c == 0)
+ res[i] = bld_insn_2(bld, NV_OP_MUL_F32, vtx, ucp);
+ else
+ res[i] = bld_insn_3(bld, NV_OP_MAD_F32, vtx, ucp, res[i]);
+ }
+ }
+
+ for (i = 0; i < bld->ti->prog->vp.num_ucps; ++i) {
+ (out = new_value(bld->pc, NV_FILE_MEM_V, 4))->reg.address = 0x2c0 + i * 4;
+ (insn = new_instruction(bld->pc, NV_OP_EXPORT))->fixed = 1;
+ nv_reference(bld->pc, insn, 0, out);
+ nv_reference(bld->pc, insn, 1, res[i]);
+ }
+}
+
+static void
bld_export_fp_outputs(struct bld_context *bld)
{
struct nv_value *vals[4];
@@ -1755,11 +1788,13 @@ bld_instruction(struct bld_context *bld,
/* VP outputs are exported in-place as scalars, optimization later */
if (bld->pc->is_fragprog)
bld_export_fp_outputs(bld);
- break;
+ if (bld->ti->append_ucp)
+ bld_append_vp_ucp(bld);
+ return;
default:
NOUVEAU_ERR("unhandled opcode %u\n", insn->Instruction.Opcode);
abort();
- break;
+ return;
}
if (insn->Dst[0].Register.File == TGSI_FILE_OUTPUT &&
@@ -1767,6 +1802,15 @@ bld_instruction(struct bld_context *bld,
struct nv_instruction *mi = NULL;
uint size;
+ if (bld->ti->append_ucp) {
+ if (bld->ti->output_loc[insn->Dst[0].Register.Index][0] == 0x70) {
+ bld->hpos_index = insn->Dst[0].Register.Index;
+ for (c = 0; c < 4; ++c)
+ if (mask & (1 << c))
+ STORE_OUTP(insn->Dst[0].Register.Index, c, dst0[c]);
+ }
+ }
+
for (c = 0; c < 4; ++c)
if ((mask & (1 << c)) &&
((dst0[c]->reg.file == NV_FILE_IMM) ||