nvc0: demagic the clear flags and fix region clears
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Mon, 14 Feb 2011 13:10:41 +0000 (14:10 +0100)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Wed, 16 Feb 2011 14:45:31 +0000 (15:45 +0100)
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
src/gallium/drivers/nvc0/nvc0_screen.c
src/gallium/drivers/nvc0/nvc0_surface.c

index 59da15e..7352aa1 100644 (file)
@@ -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
index 88daf31..5451069 100644 (file)
@@ -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);
index faa5176..8898bc7 100644 (file)
@@ -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;
 }