[PATCH] r600g: R700+ can do more than 8 tex and vtx clauses

Christian König deathsimple at vodafone.de
Tue Mar 8 15:28:59 PST 2011


---
 src/gallium/drivers/r600/r600_asm.c |   38 +++++++++++++++++++++++++++++-----
 src/gallium/drivers/r600/r600_asm.h |    1 +
 src/gallium/drivers/r600/r700_asm.c |    9 ++++++++
 3 files changed, 42 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_asm.c b/src/gallium/drivers/r600/r600_asm.c
index e788c6c..227af72 100644
--- a/src/gallium/drivers/r600/r600_asm.c
+++ b/src/gallium/drivers/r600/r600_asm.c
@@ -1247,6 +1247,24 @@ int r600_bc_add_alu(struct r600_bc *bc, const struct r600_bc_alu *alu)
 	return r600_bc_add_alu_type(bc, alu, BC_INST(bc, V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU));
 }
 
+static int r600_bc_num_tex_and_vtx_clauses(struct r600_bc *bc)
+{
+        switch (bc->chiprev) {
+        case CHIPREV_R600:
+                return 8;
+
+        case CHIPREV_R700:
+                return 16;
+
+        case CHIPREV_EVERGREEN:
+                return 64;
+
+        default:
+                R600_ERR("unknown chiprev %d\n", bc->chiprev);
+                return 8;
+        }
+}
+
 int r600_bc_add_vtx(struct r600_bc *bc, const struct r600_bc_vtx *vtx)
 {
 	struct r600_bc_vtx *nvtx = r600_bc_vtx();
@@ -1272,7 +1290,7 @@ int r600_bc_add_vtx(struct r600_bc *bc, const struct r600_bc_vtx *vtx)
 	/* each fetch use 4 dwords */
 	bc->cf_last->ndw += 4;
 	bc->ndw += 4;
-	if ((bc->cf_last->ndw / 4) > 7)
+	if ((bc->cf_last->ndw / 4) >= r600_bc_num_tex_and_vtx_clauses(bc))
 		bc->force_add_cf = 1;
 	return 0;
 }
@@ -1319,7 +1337,7 @@ int r600_bc_add_tex(struct r600_bc *bc, const struct r600_bc_tex *tex)
 	/* each texture fetch use 4 dwords */
 	bc->cf_last->ndw += 4;
 	bc->ndw += 4;
-	if ((bc->cf_last->ndw / 4) > 7)
+	if ((bc->cf_last->ndw / 4) >= r600_bc_num_tex_and_vtx_clauses(bc))
 		bc->force_add_cf = 1;
 	return 0;
 }
@@ -1456,6 +1474,14 @@ static int r600_bc_alu_build(struct r600_bc *bc, struct r600_bc_alu *alu, unsign
 	return 0;
 }
 
+static void r600_bc_cf_vtx_build(struct r600_bc *bc, struct r600_bc_cf *cf, unsigned id)
+{
+	bc->bytecode[id++] = S_SQ_CF_WORD0_ADDR(cf->addr >> 1);
+	bc->bytecode[id++] = S_SQ_CF_WORD1_CF_INST(cf->inst) |
+				S_SQ_CF_WORD1_BARRIER(1) |
+				S_SQ_CF_WORD1_COUNT((cf->ndw / 4) - 1);
+}
+
 /* common for r600/r700 - eg in eg_asm.c */
 static int r600_bc_cf_build(struct r600_bc *bc, struct r600_bc_cf *cf)
 {
@@ -1482,10 +1508,10 @@ static int r600_bc_cf_build(struct r600_bc *bc, struct r600_bc_cf *cf)
 	case V_SQ_CF_WORD1_SQ_CF_INST_TEX:
 	case V_SQ_CF_WORD1_SQ_CF_INST_VTX:
 	case V_SQ_CF_WORD1_SQ_CF_INST_VTX_TC:
-		bc->bytecode[id++] = S_SQ_CF_WORD0_ADDR(cf->addr >> 1);
-		bc->bytecode[id++] = S_SQ_CF_WORD1_CF_INST(cf->inst) |
-					S_SQ_CF_WORD1_BARRIER(1) |
-					S_SQ_CF_WORD1_COUNT((cf->ndw / 4) - 1);
+                if (bc->chiprev == CHIPREV_R700)
+                        r700_bc_cf_vtx_build(bc, cf, id);
+                else
+                        r600_bc_cf_vtx_build(bc, cf, id);
 		break;
 	case V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT:
 	case V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE:
diff --git a/src/gallium/drivers/r600/r600_asm.h b/src/gallium/drivers/r600/r600_asm.h
index b22c21d..8d7961c 100644
--- a/src/gallium/drivers/r600/r600_asm.h
+++ b/src/gallium/drivers/r600/r600_asm.h
@@ -208,6 +208,7 @@ void r600_bc_dump(struct r600_bc *bc);
 int r600_vertex_elements_build_fetch_shader(struct r600_pipe_context *rctx, struct r600_vertex_element *ve);
 
 /* r700_asm.c */
+void r700_bc_cf_vtx_build(struct r600_bc *bc, struct r600_bc_cf *cf, unsigned id);
 int r700_bc_alu_build(struct r600_bc *bc, struct r600_bc_alu *alu, unsigned id);
 
 #endif
diff --git a/src/gallium/drivers/r600/r700_asm.c b/src/gallium/drivers/r600/r700_asm.c
index a7f2f54..4b1e9ad 100644
--- a/src/gallium/drivers/r600/r700_asm.c
+++ b/src/gallium/drivers/r600/r700_asm.c
@@ -26,6 +26,15 @@
 #include "r600_asm.h"
 #include "r700_sq.h"
 
+void r700_bc_cf_vtx_build(struct r600_bc *bc, struct r600_bc_cf *cf, unsigned id)
+{
+        unsigned count = (cf->ndw / 4) - 1;
+	bc->bytecode[id++] = S_SQ_CF_WORD0_ADDR(cf->addr >> 1);
+	bc->bytecode[id++] = S_SQ_CF_WORD1_CF_INST(cf->inst) |
+				S_SQ_CF_WORD1_BARRIER(1) |
+				S_SQ_CF_WORD1_COUNT(count) |
+				S_SQ_CF_WORD1_COUNT_3(count >> 3);
+}
 
 int r700_bc_alu_build(struct r600_bc *bc, struct r600_bc_alu *alu, unsigned id)
 {
-- 
1.7.1


--=-1jW7iFoSezm8oAVdjw15--



More information about the mesa-dev mailing list