summaryrefslogtreecommitdiff
path: root/src/mesa/pipe/nv40/nv40_fragprog.c
diff options
context:
space:
mode:
authorBen Skeggs <skeggsb@gmail.com>2007-12-11 16:02:14 +1100
committerBen Skeggs <skeggsb@gmail.com>2007-12-11 16:02:14 +1100
commitc23d0f4c501b9e80ba18d6ccf09d4c95353c1a28 (patch)
treeaf46b03b00004e6db55a94d8a90dd2f80ef0ebe3 /src/mesa/pipe/nv40/nv40_fragprog.c
parentb34952c758cf009927e7d7091205e7c13052efad (diff)
nv40: allow reading from fragprog result regs
Diffstat (limited to 'src/mesa/pipe/nv40/nv40_fragprog.c')
-rw-r--r--src/mesa/pipe/nv40/nv40_fragprog.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/mesa/pipe/nv40/nv40_fragprog.c b/src/mesa/pipe/nv40/nv40_fragprog.c
index cc3cb97043..105d7937f3 100644
--- a/src/mesa/pipe/nv40/nv40_fragprog.c
+++ b/src/mesa/pipe/nv40/nv40_fragprog.c
@@ -85,6 +85,9 @@ emit_src(struct nv40_fpc *fpc, uint32_t *hw, int pos, struct nv40_sreg src)
sr |= (NV40_FP_REG_TYPE_INPUT << NV40_FP_REG_TYPE_SHIFT);
hw[0] |= (src.index << NV40_FP_OP_INPUT_SRC_SHIFT);
break;
+ case NV40SR_OUTPUT:
+ sr |= NV40_FP_REG_SRC_HALF;
+ /* fall-through */
case NV40SR_TEMP:
sr |= (NV40_FP_REG_TYPE_TEMP << NV40_FP_REG_TYPE_SHIFT);
sr |= (src.index << NV40_FP_REG_SRC_SHIFT);
@@ -129,7 +132,7 @@ emit_dst(struct nv40_fpc *fpc, uint32_t *hw, struct nv40_sreg dst)
if (dst.index == 1) {
fp->writes_depth = 1;
} else {
- hw[0] |= NV40_FP_OP_UNK0_7;
+ hw[0] |= NV40_FP_OP_OUT_REG_HALF;
}
break;
case NV40SR_NONE:
@@ -213,6 +216,15 @@ tgsi_src(struct nv40_fpc *fpc, const struct tgsi_full_src_register *fsrc)
if (fpc->high_temp < src.index)
fpc->high_temp = src.index;
break;
+ /* This is clearly insane, but gallium hands us shaders like this.
+ * Luckily fragprog results are just temp regs..
+ */
+ case TGSI_FILE_OUTPUT:
+ if (fsrc->SrcRegister.Index == fpc->colour_id)
+ return nv40_sr(NV40SR_OUTPUT, 0);
+ else
+ return nv40_sr(NV40SR_OUTPUT, 1);
+ break;
default:
NOUVEAU_ERR("bad src file\n");
break;
@@ -391,6 +403,8 @@ nv40_fragprog_parse_instruction(struct nv40_fpc *fpc,
case TGSI_FILE_SAMPLER:
unit = fsrc->SrcRegister.Index;
break;
+ case TGSI_FILE_OUTPUT:
+ break;
default:
NOUVEAU_ERR("bad src file\n");
return FALSE;