[PATCH] nv50: move some stuff into nv50_program_tx_postprocess

Christoph Bumiller e0425955 at student.tuwien.ac.at
Sat Jun 20 11:48:48 PDT 2009


The _postprocess function is called in nv50_program_tx and
performs moving of FP outputs, will append clipping distance
calculations, and converts unpaired half insn to long.
---
 src/gallium/drivers/nv50/nv50_program.c |   91 ++++++++++++++++---------------
 1 files changed, 48 insertions(+), 43 deletions(-)

diff --git a/src/gallium/drivers/nv50/nv50_program.c b/src/gallium/drivers/nv50/nv50_program.c
index 71a084e..7a4bc18 100644
--- a/src/gallium/drivers/nv50/nv50_program.c
+++ b/src/gallium/drivers/nv50/nv50_program.c
@@ -2024,6 +2024,7 @@ nv50_program_tx_prep(struct nv50_pc *pc)
 
 			if (depr != 0xffff)
 				pc->result[depr*4+2].rhw = rid++;
+			pc->p->cfg.high_result = rid;
 		}
 	}
 
@@ -2108,12 +2109,57 @@ ctor_nv50_pc(struct nv50_pc *pc, struct nv50_program *p)
 	}
 }
 
+static void
+nv50fp_move_outputs(struct nv50_pc *pc)
+{
+	struct nv50_reg out;
+	int i;
+
+	ctor_reg(&out, P_TEMP, -1, -1);
+
+	for (i = 0; i < pc->result_nr * 4; i++) {
+		if (pc->result[i].rhw < 0)
+			continue;
+		out.hw = pc->result[i].rhw;
+		emit_mov(pc, &out, &pc->result[i]);
+	}
+}
+
+static void nv50_program_tx_postprocess(struct nv50_pc *pc)
+{
+	struct nv50_program_exec *e, *e_prev = NULL;
+	unsigned pos;
+
+	if (pc->p->type == PIPE_SHADER_FRAGMENT)
+		nv50fp_move_outputs(pc);
+
+	for (e = pc->p->exec_head, pos = 0; e; e = e->next) {
+		pos += is_long(e) ? 2 : 1;
+
+		if ((!e->next || is_long(e->next)) && (pos & 1)) {
+			convert_to_long(pc, e);
+			pos++;
+		}
+		e_prev = e->next ? e : e_prev;
+	}
+
+	/* last instruction must be long */
+	if (!is_long(pc->p->exec_tail)) {
+		convert_to_long(pc, pc->p->exec_tail);
+		convert_to_long(pc, e_prev);
+	}
+
+	assert(!is_immd(pc->p->exec_head));
+	assert(!is_immd(pc->p->exec_tail));
+
+	pc->p->exec_tail->inst[1] |= 0x00000001;
+}
+
 static boolean
 nv50_program_tx(struct nv50_program *p)
 {
 	struct tgsi_parse_context parse;
 	struct nv50_pc *pc;
-	unsigned k;
 	boolean ret;
 
 	pc = CALLOC_STRUCT(nv50_pc);
@@ -2148,48 +2194,7 @@ nv50_program_tx(struct nv50_program *p)
 		}
 	}
 
-	if (p->type == PIPE_SHADER_FRAGMENT) {
-		struct nv50_reg out;
-		ctor_reg(&out, P_TEMP, -1, -1);
-
-		for (k = 0; k < pc->result_nr * 4; k++) {
-			if (pc->result[k].rhw == -1)
-				continue;
-			if (pc->result[k].hw != pc->result[k].rhw) {
-				out.hw = pc->result[k].rhw;
-				emit_mov(pc, &out, &pc->result[k]);
-			}
-			if (pc->p->cfg.high_result < (pc->result[k].rhw + 1))
-				pc->p->cfg.high_result = pc->result[k].rhw + 1;
-		}
-	}
-
-	/* look for single half instructions and make them long */
-	struct nv50_program_exec *e, *e_prev;
-
-	for (k = 0, e = pc->p->exec_head, e_prev = NULL; e; e = e->next) {
-		if (!is_long(e))
-			k++;
-
-		if (!e->next || is_long(e->next)) {
-			if (k & 1)
-				convert_to_long(pc, e);
-			k = 0;
-		}
-
-		if (e->next)
-			e_prev = e;
-	}
-
-	if (!is_long(pc->p->exec_tail)) {
-		/* this may occur if moving FP results */
-		assert(e_prev && !is_long(e_prev));
-		convert_to_long(pc, e_prev);
-		convert_to_long(pc, pc->p->exec_tail);
-	}
-
-	assert(is_long(pc->p->exec_tail) && !is_immd(pc->p->exec_head));
-	pc->p->exec_tail->inst[1] |= 0x00000001;
+	nv50_program_tx_postprocess(pc);
 
 	p->param_nr = pc->param_nr * 4;
 	p->immd_nr = pc->immd_nr * 4;
-- 
1.6.0.6


--------------090503050107050804030002
Content-Type: text/plain;
 name="0007-nv50-add-support-for-two-sided-lighting.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="0007-nv50-add-support-for-two-sided-lighting.patch"



More information about the Nouveau mailing list