Mesa (gallium-0.2): nv50: stop using nouveau_push.h, it's evil

Ben Skeggs darktama at kemper.freedesktop.org
Thu Feb 5 08:46:18 UTC 2009


Module: Mesa
Branch: gallium-0.2
Commit: 75f0b38d9ea4a7318b0d661712dda15e24707395
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=75f0b38d9ea4a7318b0d661712dda15e24707395

Author: Ben Skeggs <skeggsb at gmail.com>
Date:   Thu Feb  5 18:40:38 2009 +1000

nv50: stop using nouveau_push.h, it's evil

---

 src/gallium/drivers/nv50/nv50_clear.c   |   28 ++++++-----
 src/gallium/drivers/nv50/nv50_context.c |    2 +-
 src/gallium/drivers/nv50/nv50_context.h |    4 --
 src/gallium/drivers/nv50/nv50_program.c |   23 +++++----
 src/gallium/drivers/nv50/nv50_query.c   |   25 ++++++----
 src/gallium/drivers/nv50/nv50_vbo.c     |   81 ++++++++++++++++++-------------
 6 files changed, 92 insertions(+), 71 deletions(-)

diff --git a/src/gallium/drivers/nv50/nv50_clear.c b/src/gallium/drivers/nv50/nv50_clear.c
index 6380f39..f9bc3b5 100644
--- a/src/gallium/drivers/nv50/nv50_clear.c
+++ b/src/gallium/drivers/nv50/nv50_clear.c
@@ -31,6 +31,8 @@ nv50_clear(struct pipe_context *pipe, struct pipe_surface *ps,
 	   unsigned clearValue)
 {
 	struct nv50_context *nv50 = nv50_context(pipe);
+	struct nouveau_channel *chan = nv50->screen->nvws->channel;
+	struct nouveau_grobj *tesla = nv50->screen->tesla;
 	struct pipe_framebuffer_state fb, s_fb = nv50->framebuffer;
 	struct pipe_scissor_state sc, s_sc = nv50->scissor;
 	unsigned dirty = nv50->dirty;
@@ -59,21 +61,21 @@ nv50_clear(struct pipe_context *pipe, struct pipe_surface *ps,
 
 	switch (ps->format) {
 	case PIPE_FORMAT_A8R8G8B8_UNORM:
-		BEGIN_RING(tesla, 0x0d80, 4);
-		OUT_RINGf (ubyte_to_float((clearValue >> 16) & 0xff));
-		OUT_RINGf (ubyte_to_float((clearValue >>  8) & 0xff));
-		OUT_RINGf (ubyte_to_float((clearValue >>  0) & 0xff));
-		OUT_RINGf (ubyte_to_float((clearValue >> 24) & 0xff));
-		BEGIN_RING(tesla, 0x19d0, 1);
-		OUT_RING  (0x3c);
+		BEGIN_RING(chan, tesla, 0x0d80, 4);
+		OUT_RINGf (chan, ubyte_to_float((clearValue >> 16) & 0xff));
+		OUT_RINGf (chan, ubyte_to_float((clearValue >>  8) & 0xff));
+		OUT_RINGf (chan, ubyte_to_float((clearValue >>  0) & 0xff));
+		OUT_RINGf (chan, ubyte_to_float((clearValue >> 24) & 0xff));
+		BEGIN_RING(chan, tesla, 0x19d0, 1);
+		OUT_RING  (chan, 0x3c);
 		break;
 	case PIPE_FORMAT_Z24S8_UNORM:
-		BEGIN_RING(tesla, 0x0d90, 1);
-		OUT_RINGf ((float)(clearValue >> 8) * (1.0 / 16777215.0));
-		BEGIN_RING(tesla, 0x0da0, 1);
-		OUT_RING  (clearValue & 0xff);
-		BEGIN_RING(tesla, 0x19d0, 1);
-		OUT_RING  (0x03);
+		BEGIN_RING(chan, tesla, 0x0d90, 1);
+		OUT_RINGf (chan, (float)(clearValue >> 8) * (1.0 / 16777215.0));
+		BEGIN_RING(chan, tesla, 0x0da0, 1);
+		OUT_RING  (chan, clearValue & 0xff);
+		BEGIN_RING(chan, tesla, 0x19d0, 1);
+		OUT_RING  (chan, 0x03);
 		break;
 	default:
 		pipe->surface_fill(pipe, ps, 0, 0, ps->width, ps->height,
diff --git a/src/gallium/drivers/nv50/nv50_context.c b/src/gallium/drivers/nv50/nv50_context.c
index 9977623..565a5da 100644
--- a/src/gallium/drivers/nv50/nv50_context.c
+++ b/src/gallium/drivers/nv50/nv50_context.c
@@ -33,7 +33,7 @@ nv50_flush(struct pipe_context *pipe, unsigned flags,
 {
 	struct nv50_context *nv50 = (struct nv50_context *)pipe;
 	
-	FIRE_RING(fence);
+	FIRE_RING(nv50->screen->nvws->channel);
 }
 
 static void
diff --git a/src/gallium/drivers/nv50/nv50_context.h b/src/gallium/drivers/nv50/nv50_context.h
index 6c9e184..6a11572 100644
--- a/src/gallium/drivers/nv50/nv50_context.h
+++ b/src/gallium/drivers/nv50/nv50_context.h
@@ -15,10 +15,6 @@
 #include "nouveau/nouveau_gldefs.h"
 #include "nouveau/nouveau_stateobj.h"
 
-#define NOUVEAU_PUSH_CONTEXT(ctx)                                              \
-	struct nv50_screen *ctx = nv50->screen
-#include "nouveau/nouveau_push.h"
-
 #include "nv50_screen.h"
 #include "nv50_program.h"
 
diff --git a/src/gallium/drivers/nv50/nv50_program.c b/src/gallium/drivers/nv50/nv50_program.c
index b902c8c..14c5d47 100644
--- a/src/gallium/drivers/nv50/nv50_program.c
+++ b/src/gallium/drivers/nv50/nv50_program.c
@@ -1545,13 +1545,16 @@ static void
 nv50_program_upload_data(struct nv50_context *nv50, float *map,
 			 unsigned start, unsigned count)
 {
+	struct nouveau_channel *chan = nv50->screen->nvws->channel;
+	struct nouveau_grobj *tesla = nv50->screen->tesla;
+
 	while (count) {
 		unsigned nr = count > 2047 ? 2047 : count;
 
-		BEGIN_RING(tesla, 0x00000f00, 1);
-		OUT_RING  ((NV50_CB_PMISC << 0) | (start << 8));
-		BEGIN_RING(tesla, 0x40000f04, nr);
-		OUT_RINGp (map, nr);
+		BEGIN_RING(chan, tesla, 0x00000f00, 1);
+		OUT_RING  (chan, (NV50_CB_PMISC << 0) | (start << 8));
+		BEGIN_RING(chan, tesla, 0x40000f04, nr);
+		OUT_RINGp (chan, map, nr);
 
 		map += nr;
 		start += nr;
@@ -1598,6 +1601,8 @@ nv50_program_validate_data(struct nv50_context *nv50, struct nv50_program *p)
 static void
 nv50_program_validate_code(struct nv50_context *nv50, struct nv50_program *p)
 {
+	struct nouveau_channel *chan = nv50->screen->nvws->channel;
+	struct nouveau_grobj *tesla = nv50->screen->tesla;
 	struct pipe_winsys *ws = nv50->pipe.winsys;
 	struct nv50_program_exec *e;
 	struct nouveau_stateobj *so;
@@ -1664,14 +1669,14 @@ nv50_program_validate_code(struct nv50_context *nv50, struct nv50_program *p)
 		nr = MIN2(count, 2047);
 		nr = MIN2(nvws->channel->pushbuf->remaining, nr);
 		if (nvws->channel->pushbuf->remaining < (nr + 3)) {
-			FIRE_RING(NULL);
+			FIRE_RING(chan);
 			continue;
 		}
 
-		BEGIN_RING(tesla, 0x0f00, 1);
-		OUT_RING  ((start << 8) | NV50_CB_PUPLOAD);
-		BEGIN_RING(tesla, 0x40000f04, nr);	
-		OUT_RINGp (up + start, nr);
+		BEGIN_RING(chan, tesla, 0x0f00, 1);
+		OUT_RING  (chan, (start << 8) | NV50_CB_PUPLOAD);
+		BEGIN_RING(chan, tesla, 0x40000f04, nr);	
+		OUT_RINGp (chan, up + start, nr);
 
 		start += nr;
 		count -= nr;
diff --git a/src/gallium/drivers/nv50/nv50_query.c b/src/gallium/drivers/nv50/nv50_query.c
index 1b3a413..20745ce 100644
--- a/src/gallium/drivers/nv50/nv50_query.c
+++ b/src/gallium/drivers/nv50/nv50_query.c
@@ -71,12 +71,14 @@ static void
 nv50_query_begin(struct pipe_context *pipe, struct pipe_query *pq)
 {
 	struct nv50_context *nv50 = nv50_context(pipe);
+	struct nouveau_channel *chan = nv50->screen->nvws->channel;
+	struct nouveau_grobj *tesla = nv50->screen->tesla;
 	struct nv50_query *q = nv50_query(pq);
 
-	BEGIN_RING(tesla, 0x1530, 1);
-	OUT_RING  (1);
-	BEGIN_RING(tesla, 0x1514, 1);
-	OUT_RING  (1);
+	BEGIN_RING(chan, tesla, 0x1530, 1);
+	OUT_RING  (chan, 1);
+	BEGIN_RING(chan, tesla, 0x1514, 1);
+	OUT_RING  (chan, 1);
 
 	q->ready = FALSE;
 }
@@ -85,14 +87,17 @@ static void
 nv50_query_end(struct pipe_context *pipe, struct pipe_query *pq)
 {
 	struct nv50_context *nv50 = nv50_context(pipe);
+	struct nouveau_channel *chan = nv50->screen->nvws->channel;
+	struct nouveau_grobj *tesla = nv50->screen->tesla;
 	struct nv50_query *q = nv50_query(pq);
 
-	BEGIN_RING(tesla, 0x1b00, 4);
-	OUT_RELOCh(q->buffer, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR);
-	OUT_RELOCl(q->buffer, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR);
-	OUT_RING  (0x00000000);
-	OUT_RING  (0x0100f002);
-	FIRE_RING (NULL);
+	WAIT_RING (chan, 5);
+	BEGIN_RING(chan, tesla, 0x1b00, 4);
+	OUT_RELOCh(chan, q->buffer, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR);
+	OUT_RELOCl(chan, q->buffer, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR);
+	OUT_RING  (chan, 0x00000000);
+	OUT_RING  (chan, 0x0100f002);
+	FIRE_RING (chan);
 }
 
 static boolean
diff --git a/src/gallium/drivers/nv50/nv50_vbo.c b/src/gallium/drivers/nv50/nv50_vbo.c
index c482a4c..0c970ad 100644
--- a/src/gallium/drivers/nv50/nv50_vbo.c
+++ b/src/gallium/drivers/nv50/nv50_vbo.c
@@ -53,25 +53,27 @@ nv50_draw_arrays(struct pipe_context *pipe, unsigned mode, unsigned start,
 		 unsigned count)
 {
 	struct nv50_context *nv50 = nv50_context(pipe);
+	struct nouveau_channel *chan = nv50->screen->nvws->channel;
+	struct nouveau_grobj *tesla = nv50->screen->tesla;
 
 	nv50_state_validate(nv50);
 
-	BEGIN_RING(tesla, 0x142c, 1);
-	OUT_RING  (0);
-	BEGIN_RING(tesla, 0x142c, 1);
-	OUT_RING  (0);
-	BEGIN_RING(tesla, 0x1440, 1);
-	OUT_RING  (0);
-	BEGIN_RING(tesla, 0x1334, 1);
-	OUT_RING  (0);
-
-	BEGIN_RING(tesla, NV50TCL_VERTEX_BEGIN, 1);
-	OUT_RING  (nv50_prim(mode));
-	BEGIN_RING(tesla, NV50TCL_VERTEX_BUFFER_FIRST, 2);
-	OUT_RING  (start);
-	OUT_RING  (count);
-	BEGIN_RING(tesla, NV50TCL_VERTEX_END, 1);
-	OUT_RING  (0);
+	BEGIN_RING(chan, tesla, 0x142c, 1);
+	OUT_RING  (chan, 0);
+	BEGIN_RING(chan, tesla, 0x142c, 1);
+	OUT_RING  (chan, 0);
+	BEGIN_RING(chan, tesla, 0x1440, 1);
+	OUT_RING  (chan, 0);
+	BEGIN_RING(chan, tesla, 0x1334, 1);
+	OUT_RING  (chan, 0);
+
+	BEGIN_RING(chan, tesla, NV50TCL_VERTEX_BEGIN, 1);
+	OUT_RING  (chan, nv50_prim(mode));
+	BEGIN_RING(chan, tesla, NV50TCL_VERTEX_BUFFER_FIRST, 2);
+	OUT_RING  (chan, start);
+	OUT_RING  (chan, count);
+	BEGIN_RING(chan, tesla, NV50TCL_VERTEX_END, 1);
+	OUT_RING  (chan, 0);
 
 	pipe->flush(pipe, 0, NULL);
 	return TRUE;
@@ -81,11 +83,14 @@ static INLINE void
 nv50_draw_elements_inline_u08(struct nv50_context *nv50, uint8_t *map,
 			      unsigned start, unsigned count)
 {
+	struct nouveau_channel *chan = nv50->screen->nvws->channel;
+	struct nouveau_grobj *tesla = nv50->screen->tesla;
+
 	map += start;
 
 	if (count & 1) {
-		BEGIN_RING(tesla, 0x15e8, 1);
-		OUT_RING  (map[0]);
+		BEGIN_RING(chan, tesla, 0x15e8, 1);
+		OUT_RING  (chan, map[0]);
 		map++;
 		count--;
 	}
@@ -94,9 +99,9 @@ nv50_draw_elements_inline_u08(struct nv50_context *nv50, uint8_t *map,
 		unsigned nr = count > 2046 ? 2046 : count;
 		int i;
 
-		BEGIN_RING(tesla, 0x400015f0, nr >> 1);
+		BEGIN_RING(chan, tesla, 0x400015f0, nr >> 1);
 		for (i = 0; i < nr; i += 2)
-			OUT_RING  ((map[1] << 16) | map[0]);
+			OUT_RING  (chan, (map[1] << 16) | map[0]);
 
 		count -= nr;
 		map += nr;
@@ -107,11 +112,14 @@ static INLINE void
 nv50_draw_elements_inline_u16(struct nv50_context *nv50, uint16_t *map,
 			      unsigned start, unsigned count)
 {
+	struct nouveau_channel *chan = nv50->screen->nvws->channel;
+	struct nouveau_grobj *tesla = nv50->screen->tesla;
+
 	map += start;
 
 	if (count & 1) {
-		BEGIN_RING(tesla, 0x15e8, 1);
-		OUT_RING  (map[0]);
+		BEGIN_RING(chan, tesla, 0x15e8, 1);
+		OUT_RING  (chan, map[0]);
 		map++;
 		count--;
 	}
@@ -120,9 +128,9 @@ nv50_draw_elements_inline_u16(struct nv50_context *nv50, uint16_t *map,
 		unsigned nr = count > 2046 ? 2046 : count;
 		int i;
 
-		BEGIN_RING(tesla, 0x400015f0, nr >> 1);
+		BEGIN_RING(chan, tesla, 0x400015f0, nr >> 1);
 		for (i = 0; i < nr; i += 2)
-			OUT_RING  ((map[1] << 16) | map[0]);
+			OUT_RING  (chan, (map[1] << 16) | map[0]);
 
 		count -= nr;
 		map += nr;
@@ -133,13 +141,16 @@ static INLINE void
 nv50_draw_elements_inline_u32(struct nv50_context *nv50, uint8_t *map,
 			      unsigned start, unsigned count)
 {
+	struct nouveau_channel *chan = nv50->screen->nvws->channel;
+	struct nouveau_grobj *tesla = nv50->screen->tesla;
+
 	map += start;
 
 	while (count) {
 		unsigned nr = count > 2047 ? 2047 : count;
 
-		BEGIN_RING(tesla, 0x400015e8, nr);
-		OUT_RINGp (map, nr);
+		BEGIN_RING(chan, tesla, 0x400015e8, nr);
+		OUT_RINGp (chan, map, nr);
 
 		count -= nr;
 		map += nr;
@@ -152,18 +163,20 @@ nv50_draw_elements(struct pipe_context *pipe,
 		   unsigned mode, unsigned start, unsigned count)
 {
 	struct nv50_context *nv50 = nv50_context(pipe);
+	struct nouveau_channel *chan = nv50->screen->nvws->channel;
+	struct nouveau_grobj *tesla = nv50->screen->tesla;
 	struct pipe_winsys *ws = pipe->winsys;
 	void *map = ws->buffer_map(ws, indexBuffer, PIPE_BUFFER_USAGE_CPU_READ);
 
 	nv50_state_validate(nv50);
 
-	BEGIN_RING(tesla, 0x142c, 1);
-	OUT_RING  (0);
-	BEGIN_RING(tesla, 0x142c, 1);
-	OUT_RING  (0);
+	BEGIN_RING(chan, tesla, 0x142c, 1);
+	OUT_RING  (chan, 0);
+	BEGIN_RING(chan, tesla, 0x142c, 1);
+	OUT_RING  (chan, 0);
 
-	BEGIN_RING(tesla, NV50TCL_VERTEX_BEGIN, 1);
-	OUT_RING  (nv50_prim(mode));
+	BEGIN_RING(chan, tesla, NV50TCL_VERTEX_BEGIN, 1);
+	OUT_RING  (chan, nv50_prim(mode));
 	switch (indexSize) {
 	case 1:
 		nv50_draw_elements_inline_u08(nv50, map, start, count);
@@ -177,8 +190,8 @@ nv50_draw_elements(struct pipe_context *pipe,
 	default:
 		assert(0);
 	}
-	BEGIN_RING(tesla, NV50TCL_VERTEX_END, 1);
-	OUT_RING  (0);
+	BEGIN_RING(chan, tesla, NV50TCL_VERTEX_END, 1);
+	OUT_RING  (chan, 0);
 
 	pipe->flush(pipe, 0, NULL);
 	return TRUE;




More information about the mesa-commit mailing list