Mesa (master): nv50: emit constbuf relocs before uploading constants

Christoph Bumiller chrisbmr at kemper.freedesktop.org
Sat Sep 18 13:23:45 UTC 2010


Module: Mesa
Branch: master
Commit: 4c1e7d931dd6e5676297bee23932cc6d66c93cac
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=4c1e7d931dd6e5676297bee23932cc6d66c93cac

Author: Christoph Bumiller <e0425955 at student.tuwien.ac.at>
Date:   Sat Sep 18 15:19:34 2010 +0200

nv50: emit constbuf relocs before uploading constants

---

 src/gallium/drivers/nv50/nv50_screen.c       |   47 ++++++++++++++++++--------
 src/gallium/drivers/nv50/nv50_screen.h       |    2 +
 src/gallium/drivers/nv50/nv50_shader_state.c |   28 +++++++++++----
 3 files changed, 56 insertions(+), 21 deletions(-)

diff --git a/src/gallium/drivers/nv50/nv50_screen.c b/src/gallium/drivers/nv50/nv50_screen.c
index a8f7721..7c9342b 100644
--- a/src/gallium/drivers/nv50/nv50_screen.c
+++ b/src/gallium/drivers/nv50/nv50_screen.c
@@ -222,6 +222,36 @@ nv50_screen_destroy(struct pipe_screen *pscreen)
    OUT_RELOC(ch, bo, (n << 18) | (gr->subc << 13) | m, fl, 0, 0)
 
 void
+nv50_screen_reloc_constbuf(struct nv50_screen *screen, unsigned cbi)
+{
+	struct nouveau_bo *bo;
+	struct nouveau_channel *chan = screen->base.channel;
+	struct nouveau_grobj *tesla = screen->tesla;
+	unsigned size;
+	const unsigned rl = NOUVEAU_BO_VRAM | NOUVEAU_BO_RD | NOUVEAU_BO_DUMMY;
+
+	switch (cbi) {
+	case NV50_CB_PMISC:
+		bo = screen->constbuf_misc[0];
+		size = 0x200;
+		break;
+	case NV50_CB_PVP:
+	case NV50_CB_PFP:
+	case NV50_CB_PGP:
+		bo = screen->constbuf_parm[cbi - NV50_CB_PVP];
+		size = 0;
+		break;
+	default:
+		return;
+	}
+
+	BGN_RELOC (chan, bo, tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3, rl);
+	OUT_RELOCh(chan, bo, 0, rl);
+	OUT_RELOCl(chan, bo, 0, rl);
+	OUT_RELOC (chan, bo, (cbi << 16) | size, rl, 0, 0);
+}
+
+void
 nv50_screen_relocs(struct nv50_screen *screen)
 {
 	struct nouveau_channel *chan = screen->base.channel;
@@ -243,12 +273,7 @@ nv50_screen_relocs(struct nv50_screen *screen)
 	OUT_RELOCh(chan, screen->tsc, 0, rl);
 	OUT_RELOCl(chan, screen->tsc, 0, rl);
 
-	BGN_RELOC (chan, screen->constbuf_misc[0],
-		   tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3, rl);
-	OUT_RELOCh(chan, screen->constbuf_misc[0], 0, rl);
-	OUT_RELOCl(chan, screen->constbuf_misc[0], 0, rl);
-	OUT_RELOC (chan, screen->constbuf_misc[0],
-		   (NV50_CB_PMISC << 16) | 0x0200, rl, 0, 0);
+	nv50_screen_reloc_constbuf(screen, NV50_CB_PMISC);
 
 	BGN_RELOC (chan, screen->constbuf_misc[0],
 		   tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3, rl);
@@ -257,14 +282,8 @@ nv50_screen_relocs(struct nv50_screen *screen)
 	OUT_RELOC (chan, screen->constbuf_misc[0],
 		   (NV50_CB_AUX << 16) | 0x0200, rl, 0, 0);
 
-	for (i = 0; i < 3; ++i) {
-		BGN_RELOC (chan, screen->constbuf_parm[i],
-			   tesla, NV50TCL_CB_DEF_ADDRESS_HIGH, 3, rl);
-		OUT_RELOCh(chan, screen->constbuf_parm[i], 0, rl);
-		OUT_RELOCl(chan, screen->constbuf_parm[i], 0, rl);
-		OUT_RELOC (chan, screen->constbuf_parm[i],
-			   ((NV50_CB_PVP + i) << 16) | 0x0000, rl, 0, 0);
-	}
+	for (i = 0; i < 3; ++i)
+		nv50_screen_reloc_constbuf(screen, NV50_CB_PVP + i);
 
 	BGN_RELOC (chan, screen->stack_bo,
 		   tesla, NV50TCL_STACK_ADDRESS_HIGH, 2, rl);
diff --git a/src/gallium/drivers/nv50/nv50_screen.h b/src/gallium/drivers/nv50/nv50_screen.h
index ad6bdeb..6e15230 100644
--- a/src/gallium/drivers/nv50/nv50_screen.h
+++ b/src/gallium/drivers/nv50/nv50_screen.h
@@ -39,6 +39,8 @@ nv50_screen(struct pipe_screen *screen)
 
 extern void nv50_screen_relocs(struct nv50_screen *);
 
+extern void nv50_screen_reloc_constbuf(struct nv50_screen *, unsigned cbi);
+
 struct nv50_format {
 	uint32_t rt;
 	uint32_t tic;
diff --git a/src/gallium/drivers/nv50/nv50_shader_state.c b/src/gallium/drivers/nv50/nv50_shader_state.c
index 8057ec9..7d2989d 100644
--- a/src/gallium/drivers/nv50/nv50_shader_state.c
+++ b/src/gallium/drivers/nv50/nv50_shader_state.c
@@ -47,10 +47,17 @@ nv50_transfer_constbuf(struct nv50_context *nv50,
    start = 0;
 
    while (count) {
-      unsigned nr = count;
-      nr = MIN2(nr, 2047);
+      unsigned nr = AVAIL_RING(chan);
+
+      if (nr < 8) {
+         FIRE_RING(chan);
+         continue;
+      }
+      nr = MIN2(count, nr - 7);
+      nr = MIN2(nr, 2074);
+
+      nv50_screen_reloc_constbuf(nv50->screen, cbi);
 
-      /* FIXME: emit relocs for unsuiTed MM */
       BEGIN_RING(chan, tesla, NV50TCL_CB_ADDR, 1);
       OUT_RING  (chan, (start << 8) | cbi);
       BEGIN_RING_NI(chan, tesla, NV50TCL_CB_DATA(0), nr);
@@ -77,8 +84,16 @@ nv50_program_validate_data(struct nv50_context *nv50, struct nv50_program *p)
       unsigned start = 0;
 
       while (count) {
-         unsigned nr = count;
-         nr = MIN2(nr, 2047);
+         unsigned nr = AVAIL_RING(chan);
+
+         if (nr < 8) {
+            FIRE_RING(chan);
+            continue;
+         }
+         nr = MIN2(count, nr - 7);
+         nr = MIN2(nr, 2074);
+
+         nv50_screen_reloc_constbuf(nv50->screen, NV50_CB_PMISC);
 
          BEGIN_RING(chan, tesla, NV50TCL_CB_ADDR, 1);
          OUT_RING  (chan, (start << 8) | NV50_CB_PMISC);
@@ -111,8 +126,7 @@ nv50_program_validate_data(struct nv50_context *nv50, struct nv50_program *p)
       break;
    default:
       assert(0);
-      cbi = 0;
-      break;
+      return;
    }
 
    nv50_transfer_constbuf(nv50, nv50->constbuf[p->type], p->parm_size, cbi);




More information about the mesa-commit mailing list