Mesa (master): nv50: adapt to clear interface changes

Roland Scheidegger sroland at kemper.freedesktop.org
Thu Jun 3 08:47:35 PDT 2010


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

Author: Roland Scheidegger <sroland at vmware.com>
Date:   Sat May 29 01:25:09 2010 +0200

nv50: adapt to clear interface changes

should support separate depth/stencil clears just fine.

---

 src/gallium/drivers/nv50/nv50_clear.c   |    8 +++++---
 src/gallium/drivers/nv50/nv50_screen.c  |    2 ++
 src/gallium/drivers/nv50/nv50_surface.c |   30 +++++++++++++++---------------
 3 files changed, 22 insertions(+), 18 deletions(-)

diff --git a/src/gallium/drivers/nv50/nv50_clear.c b/src/gallium/drivers/nv50/nv50_clear.c
index 5447904..ee7cf28 100644
--- a/src/gallium/drivers/nv50/nv50_clear.c
+++ b/src/gallium/drivers/nv50/nv50_clear.c
@@ -51,13 +51,15 @@ nv50_clear(struct pipe_context *pipe, unsigned buffers,
 		mode |= 0x3c;
 	}
 
-	if (buffers & PIPE_CLEAR_DEPTHSTENCIL) {
+	if (buffers & PIPE_CLEAR_DEPTH) {
 		BEGIN_RING(chan, tesla, NV50TCL_CLEAR_DEPTH, 1);
 		OUT_RING  (chan, fui(depth));
+		mode |= NV50TCL_CLEAR_BUFFERS_Z;
+	}
+	if (buffers & PIPE_CLEAR_STENCIL) {
 		BEGIN_RING(chan, tesla, NV50TCL_CLEAR_STENCIL, 1);
 		OUT_RING  (chan, stencil & 0xff);
-
-		mode |= 0x03;
+		mode |= NV50TCL_CLEAR_BUFFERS_S;
 	}
 
 	BEGIN_RING(chan, tesla, NV50TCL_CLEAR_BUFFERS, 1);
diff --git a/src/gallium/drivers/nv50/nv50_screen.c b/src/gallium/drivers/nv50/nv50_screen.c
index 2c0caad..21908bc 100644
--- a/src/gallium/drivers/nv50/nv50_screen.c
+++ b/src/gallium/drivers/nv50/nv50_screen.c
@@ -150,6 +150,8 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
 		return 1;
 	case PIPE_CAP_INDEP_BLEND_FUNC:
 		return 0;
+	case PIPE_CAP_DEPTHSTENCIL_CLEAR_SEPARATE:
+		return 1;
 	case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
 	case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
 		return 1;
diff --git a/src/gallium/drivers/nv50/nv50_surface.c b/src/gallium/drivers/nv50/nv50_surface.c
index 40b8d25..470df1b 100644
--- a/src/gallium/drivers/nv50/nv50_surface.c
+++ b/src/gallium/drivers/nv50/nv50_surface.c
@@ -27,6 +27,7 @@
 #include "nv50_resource.h"
 #include "pipe/p_defines.h"
 #include "util/u_inlines.h"
+#include "util/u_pack_color.h"
 
 #include "util/u_tile.h"
 #include "util/u_format.h"
@@ -221,50 +222,49 @@ nv50_surface_copy(struct pipe_context *pipe,
 	nv50_miptree_surface_del(ps_dst);
 }
 
+/* XXX this should probably look more along the lines of nv50_clear */
 static void
-nv50_surface_fill(struct pipe_context *pipe, struct pipe_resource *dest,
-		  struct pipe_subresource subdst,
-		  unsigned destx, unsigned desty, unsigned destz,
-		  unsigned width, unsigned height, unsigned value)
+nv50_clearRT(struct pipe_context *pipe,
+	     struct pipe_surface *dst,
+	     const float *rgba,
+	     unsigned dstx, unsigned dsty,
+	     unsigned width, unsigned height)
 {
 	struct nv50_context *nv50 = nv50_context(pipe);
-	struct pipe_surface *ps;
 	struct nv50_screen *screen = nv50->screen;
 	struct nouveau_channel *chan = screen->eng2d->channel;
 	struct nouveau_grobj *eng2d = screen->eng2d;
 	int format, ret;
+	union util_color uc;
+	util_pack_color(rgba, dst->format, &uc);
 
-	format = nv50_format(dest->format);
+	format = nv50_format(dst->format);
 	if (format < 0)
 		return;
 
-	ps = nv50_miptree_surface_new(pipe->screen, dest, subdst.face,
-				      subdst.level, destz, 0 /* bind flags */);
-	
 	WAIT_RING (chan, 32);
 
-	ret = nv50_surface_set(screen, ps, 1);
+	ret = nv50_surface_set(screen, dst, 1);
 	if (ret)
 		return;
 
 	BEGIN_RING(chan, eng2d, NV50_2D_DRAW_SHAPE, 3);
 	OUT_RING  (chan, NV50_2D_DRAW_SHAPE_RECTANGLES);
 	OUT_RING  (chan, format);
-	OUT_RING  (chan, value);
+	OUT_RING  (chan, uc.ui);
 	BEGIN_RING(chan, eng2d, NV50_2D_DRAW_POINT32_X(0), 4);
-	OUT_RING  (chan, destx);
-	OUT_RING  (chan, desty);
+	OUT_RING  (chan, dstx);
+	OUT_RING  (chan, dsty);
 	OUT_RING  (chan, width);
 	OUT_RING  (chan, height);
 
-	nv50_miptree_surface_del(ps);
 }
 
 void
 nv50_init_surface_functions(struct nv50_context *nv50)
 {
 	nv50->pipe.resource_copy_region = nv50_surface_copy;
-	nv50->pipe.resource_fill_region = nv50_surface_fill;
+	nv50->pipe.clearRT = nv50_clearRT;
 }
 
 



More information about the mesa-commit mailing list