summaryrefslogtreecommitdiff
path: root/src/gallium/drivers
diff options
context:
space:
mode:
authorBen Skeggs <skeggsb@gmail.com>2008-06-09 13:07:38 +1000
committerBen Skeggs <skeggsb@gmail.com>2008-06-29 15:46:16 +1000
commit776e9581d16fc0fd28058fbcd879756fd5d40b96 (patch)
tree0a5910a517009fe250ceb34adcf9f06e5c4c396d /src/gallium/drivers
parent34a039ae7b158cacb5b20d91067e9d6458d30a56 (diff)
nv50: delayed write of fragprog result regs until end of program
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r--src/gallium/drivers/nv50/nv50_program.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/gallium/drivers/nv50/nv50_program.c b/src/gallium/drivers/nv50/nv50_program.c
index 936a8ef9b3..1733cf97b7 100644
--- a/src/gallium/drivers/nv50/nv50_program.c
+++ b/src/gallium/drivers/nv50/nv50_program.c
@@ -27,6 +27,8 @@
*
* FUCK! watch dst==src vectors, can overwrite components that are needed.
* ie. SUB R0, R0.yzxw, R0
+ *
+ * NV50_PROG* -> PIPE_SHADER*
*/
struct nv50_reg {
enum {
@@ -1198,11 +1200,13 @@ nv50_program_tx_prep(struct nv50_pc *pc)
for (i = 0; i < pc->result_nr; i++) {
for (c = 0; c < 4; c++) {
- if (pc->p->type == NV50_PROG_FRAGMENT)
+ if (pc->p->type == NV50_PROG_FRAGMENT) {
pc->result[i*4+c].type = P_TEMP;
- else
+ pc->result[i*4+c].hw = -1;
+ } else {
pc->result[i*4+c].type = P_RESULT;
- pc->result[i*4+c].hw = rid++;
+ pc->result[i*4+c].hw = rid++;
+ }
pc->result[i*4+c].index = i;
}
}
@@ -1281,6 +1285,14 @@ nv50_program_tx(struct nv50_program *p)
}
}
+ if (p->type == NV50_PROG_FRAGMENT) {
+ struct nv50_reg out;
+
+ out.type = P_TEMP;
+ for (out.hw = 0; out.hw < pc->result_nr * 4; out.hw++)
+ emit_mov(pc, &out, &pc->result[out.hw]);
+ }
+
p->immd_nr = pc->immd_nr * 4;
p->immd = pc->immd_buf;