Mesa (master): nvc0: demagic the clear flags and fix region clears

Christoph Bumiller chrisbmr at kemper.freedesktop.org
Wed Feb 16 14:48:36 UTC 2011


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

Author: Christoph Bumiller <e0425955 at student.tuwien.ac.at>
Date:   Mon Feb 14 14:10:41 2011 +0100

nvc0: demagic the clear flags and fix region clears

The CLIP_RECTs always affect dedicated clears, and it's nicer than
having to mark the viewport or scissor state dirty after it.

---

 src/gallium/drivers/nvc0/nvc0_3d.xml.h  |   60 ++++++++++++++++++++----------
 src/gallium/drivers/nvc0/nvc0_screen.c  |   14 +++++--
 src/gallium/drivers/nvc0/nvc0_surface.c |   20 ++++++----
 3 files changed, 62 insertions(+), 32 deletions(-)

diff --git a/src/gallium/drivers/nvc0/nvc0_3d.xml.h b/src/gallium/drivers/nvc0/nvc0_3d.xml.h
index 59da15e..7352aa1 100644
--- a/src/gallium/drivers/nvc0/nvc0_3d.xml.h
+++ b/src/gallium/drivers/nvc0/nvc0_3d.xml.h
@@ -230,21 +230,21 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #define NVC0_3D_DEPTH_RANGE_FAR__ESIZE				0x00000010
 #define NVC0_3D_DEPTH_RANGE_FAR__LEN				0x00000010
 
-#define NVC0_3D_VIEWPORT_CLIP_HORIZ(i0)			       (0x00000d00 + 0x8*(i0))
-#define NVC0_3D_VIEWPORT_CLIP_HORIZ__ESIZE			0x00000008
-#define NVC0_3D_VIEWPORT_CLIP_HORIZ__LEN			0x00000008
-#define NVC0_3D_VIEWPORT_CLIP_HORIZ_MIN__MASK			0x0000ffff
-#define NVC0_3D_VIEWPORT_CLIP_HORIZ_MIN__SHIFT			0
-#define NVC0_3D_VIEWPORT_CLIP_HORIZ_MAX__MASK			0xffff0000
-#define NVC0_3D_VIEWPORT_CLIP_HORIZ_MAX__SHIFT			16
-
-#define NVC0_3D_VIEWPORT_CLIP_VERT(i0)			       (0x00000d04 + 0x8*(i0))
-#define NVC0_3D_VIEWPORT_CLIP_VERT__ESIZE			0x00000008
-#define NVC0_3D_VIEWPORT_CLIP_VERT__LEN				0x00000008
-#define NVC0_3D_VIEWPORT_CLIP_VERT_MIN__MASK			0x0000ffff
-#define NVC0_3D_VIEWPORT_CLIP_VERT_MIN__SHIFT			0
-#define NVC0_3D_VIEWPORT_CLIP_VERT_MAX__MASK			0xffff0000
-#define NVC0_3D_VIEWPORT_CLIP_VERT_MAX__SHIFT			16
+#define NVC0_3D_CLIP_RECT_HORIZ(i0)			       (0x00000d00 + 0x8*(i0))
+#define NVC0_3D_CLIP_RECT_HORIZ__ESIZE				0x00000008
+#define NVC0_3D_CLIP_RECT_HORIZ__LEN				0x00000008
+#define NVC0_3D_CLIP_RECT_HORIZ_MIN__MASK			0x0000ffff
+#define NVC0_3D_CLIP_RECT_HORIZ_MIN__SHIFT			0
+#define NVC0_3D_CLIP_RECT_HORIZ_MAX__MASK			0xffff0000
+#define NVC0_3D_CLIP_RECT_HORIZ_MAX__SHIFT			16
+
+#define NVC0_3D_CLIP_RECT_VERT(i0)			       (0x00000d04 + 0x8*(i0))
+#define NVC0_3D_CLIP_RECT_VERT__ESIZE				0x00000008
+#define NVC0_3D_CLIP_RECT_VERT__LEN				0x00000008
+#define NVC0_3D_CLIP_RECT_VERT_MIN__MASK			0x0000ffff
+#define NVC0_3D_CLIP_RECT_VERT_MIN__SHIFT			0
+#define NVC0_3D_CLIP_RECT_VERT_MAX__MASK			0xffff0000
+#define NVC0_3D_CLIP_RECT_VERT_MAX__SHIFT			16
 
 #define NVC0_3D_CLIPID_REGION_HORIZ(i0)			       (0x00000d40 + 0x8*(i0))
 #define NVC0_3D_CLIPID_REGION_HORIZ__ESIZE			0x00000008
@@ -370,6 +370,12 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #define NVC0_3D_SCREEN_SCISSOR_VERT_Y__MASK			0x0000ffff
 #define NVC0_3D_SCREEN_SCISSOR_VERT_Y__SHIFT			0
 
+#define NVC0_3D_CLEAR_FLAGS					0x000010f8
+#define NVC0_3D_CLEAR_FLAGS_STENCIL_MASK			0x00000001
+#define NVC0_3D_CLEAR_FLAGS_UNK4				0x00000010
+#define NVC0_3D_CLEAR_FLAGS_SCISSOR				0x00000100
+#define NVC0_3D_CLEAR_FLAGS_VIEWPORT				0x00001000
+
 #define NVC0_3D_VERTEX_ID					0x00001118
 
 #define NVC0_3D_VTX_ATTR_DEFINE					0x0000114c
@@ -656,6 +662,18 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #define NVC0_3D_CLIPID_HEIGHT					0x00001504
 #define NVC0_3D_CLIPID_HEIGHT__MAX				0x00002000
 
+#define NVC0_3D_CLIPID_FILL_RECT_HORIZ				0x00001508
+#define NVC0_3D_CLIPID_FILL_RECT_HORIZ_LOW__MASK		0x0000ffff
+#define NVC0_3D_CLIPID_FILL_RECT_HORIZ_LOW__SHIFT		0
+#define NVC0_3D_CLIPID_FILL_RECT_HORIZ_HIGH__MASK		0xffff0000
+#define NVC0_3D_CLIPID_FILL_RECT_HORIZ_HIGH__SHIFT		16
+
+#define NVC0_3D_CLIPID_FILL_RECT_VERT				0x0000150c
+#define NVC0_3D_CLIPID_FILL_RECT_VERT_LOW__MASK			0x0000ffff
+#define NVC0_3D_CLIPID_FILL_RECT_VERT_LOW__SHIFT		0
+#define NVC0_3D_CLIPID_FILL_RECT_VERT_HIGH__MASK		0xffff0000
+#define NVC0_3D_CLIPID_FILL_RECT_VERT_HIGH__SHIFT		16
+
 #define NVC0_3D_VP_CLIP_DISTANCE_ENABLE				0x00001510
 #define NVC0_3D_VP_CLIP_DISTANCE_ENABLE_0			0x00000001
 #define NVC0_3D_VP_CLIP_DISTANCE_ENABLE_1			0x00000002
@@ -954,12 +972,12 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #define NVC0_3D_VIEW_VOLUME_CLIP_CTRL_UNK12			0x00001000
 #define NVC0_3D_VIEW_VOLUME_CLIP_CTRL_UNK13			0x00002000
 
-#define NVC0_3D_VIEWPORT_CLIP_RECTS_EN				0x0000194c
+#define NVC0_3D_CLIP_RECTS_EN					0x0000194c
 
-#define NVC0_3D_VIEWPORT_CLIP_MODE				0x00001950
-#define NVC0_3D_VIEWPORT_CLIP_MODE_INSIDE_ANY			0x00000000
-#define NVC0_3D_VIEWPORT_CLIP_MODE_OUTSIDE_ALL			0x00000001
-#define NVC0_3D_VIEWPORT_CLIP_MODE_NEVER			0x00000002
+#define NVC0_3D_CLIP_RECTS_MODE					0x00001950
+#define NVC0_3D_CLIP_RECTS_MODE_INSIDE_ANY			0x00000000
+#define NVC0_3D_CLIP_RECTS_MODE_OUTSIDE_ALL			0x00000001
+#define NVC0_3D_CLIP_RECTS_MODE_NEVER				0x00000002
 
 #define NVC0_3D_FP_ZORDER_CTRL					0x0000196c
 #define NVC0_3D_FP_ZORDER_CTRL_0				0x00000001
@@ -1012,6 +1030,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #define NVC0_3D_CLEAR_BUFFERS_LAYER__MASK			0x001ffc00
 #define NVC0_3D_CLEAR_BUFFERS_LAYER__SHIFT			10
 
+#define NVC0_3D_CLIPID_FILL					0x000019d4
+
 #define NVC0_3D_COLOR_MASK(i0)				       (0x00001a00 + 0x4*(i0))
 #define NVC0_3D_COLOR_MASK__ESIZE				0x00000004
 #define NVC0_3D_COLOR_MASK__LEN					0x00000008
diff --git a/src/gallium/drivers/nvc0/nvc0_screen.c b/src/gallium/drivers/nvc0/nvc0_screen.c
index 88daf31..5451069 100644
--- a/src/gallium/drivers/nvc0/nvc0_screen.c
+++ b/src/gallium/drivers/nvc0/nvc0_screen.c
@@ -283,9 +283,6 @@ nvc0_magic_3d_init(struct nouveau_channel *chan)
    BEGIN_RING(chan, RING_3D_(0x074c), 1);
    OUT_RING  (chan, 0x3f);
 
-   BEGIN_RING(chan, RING_3D_(0x10f8), 1);
-   OUT_RING  (chan, 0x0101);
-
    BEGIN_RING(chan, RING_3D_(0x16a8), 1);
    OUT_RING  (chan, (3 << 16) | 3);
    BEGIN_RING(chan, RING_3D_(0x1794), 1);
@@ -534,11 +531,20 @@ nvc0_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
    BEGIN_RING(chan, RING_3D_(0x1590), 1); /* deactivate ZCULL */
    OUT_RING  (chan, 0x3f);
 
-   BEGIN_RING(chan, RING_3D(VIEWPORT_CLIP_RECTS_EN), 1);
+   BEGIN_RING(chan, RING_3D(CLIP_RECTS_MODE), 1);
+   OUT_RING  (chan, NVC0_3D_CLIP_RECTS_MODE_INSIDE_ANY);
+   BEGIN_RING(chan, RING_3D(CLIP_RECT_HORIZ(0)), 8 * 2);
+   for (i = 0; i < 8 * 2; ++i)
+      OUT_RING(chan, 0);
+   BEGIN_RING(chan, RING_3D(CLIP_RECTS_EN), 1);
    OUT_RING  (chan, 0);
    BEGIN_RING(chan, RING_3D(CLIPID_ENABLE), 1);
    OUT_RING  (chan, 0);
 
+   /* neither scissors, viewport nor stencil mask should affect clears */
+   BEGIN_RING(chan, RING_3D(CLEAR_FLAGS), 1);
+   OUT_RING  (chan, 0);
+
    BEGIN_RING(chan, RING_3D(VIEWPORT_TRANSFORM_EN), 1);
    OUT_RING  (chan, 1);
    BEGIN_RING(chan, RING_3D(DEPTH_RANGE_NEAR(0)), 2);
diff --git a/src/gallium/drivers/nvc0/nvc0_surface.c b/src/gallium/drivers/nvc0/nvc0_surface.c
index faa5176..8898bc7 100644
--- a/src/gallium/drivers/nvc0/nvc0_surface.c
+++ b/src/gallium/drivers/nvc0/nvc0_surface.c
@@ -243,15 +243,16 @@ nvc0_clear_render_target(struct pipe_context *pipe,
 	OUT_RING  (chan, 1);
 	OUT_RING  (chan, 0);
 
-	/* NOTE: only works with D3D clear flag (5097/0x143c bit 4) */
-
-	BEGIN_RING(chan, RING_3D(VIEWPORT_HORIZ(0)), 2);
-	OUT_RING  (chan, (width << 16) | dstx);
-	OUT_RING  (chan, (height << 16) | dsty);
+	BEGIN_RING(chan, RING_3D(CLIP_RECT_HORIZ(0)), 2);
+	OUT_RING  (chan, ((dstx + width) << 16) | dstx);
+	OUT_RING  (chan, ((dsty + height) << 16) | dsty);
+	IMMED_RING(chan, RING_3D(CLIP_RECTS_EN), 1);
 
 	BEGIN_RING(chan, RING_3D(CLEAR_BUFFERS), 1);
 	OUT_RING  (chan, 0x3c);
 
+	IMMED_RING(chan, RING_3D(CLIP_RECTS_EN), 0);
+
 	nv50->dirty |= NVC0_NEW_FRAMEBUFFER;
 }
 
@@ -300,13 +301,16 @@ nvc0_clear_depth_stencil(struct pipe_context *pipe,
 	OUT_RING  (chan, sf->height);
 	OUT_RING  (chan, (1 << 16) | 1);
 
-	BEGIN_RING(chan, RING_3D(VIEWPORT_HORIZ(0)), 2);
-	OUT_RING  (chan, (width << 16) | dstx);
-	OUT_RING  (chan, (height << 16) | dsty);
+	BEGIN_RING(chan, RING_3D(CLIP_RECT_HORIZ(0)), 2);
+	OUT_RING  (chan, ((dstx + width) << 16) | dstx);
+	OUT_RING  (chan, ((dsty + height) << 16) | dsty);
+	IMMED_RING(chan, RING_3D(CLIP_RECTS_EN), 1);
 
 	BEGIN_RING(chan, RING_3D(CLEAR_BUFFERS), 1);
 	OUT_RING  (chan, mode);
 
+	IMMED_RING(chan, RING_3D(CLIP_RECTS_EN), 0);
+
 	nv50->dirty |= NVC0_NEW_FRAMEBUFFER;
 }
 




More information about the mesa-commit mailing list