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.
This commit is contained in:
Christoph Bumiller
2011-02-14 14:10:41 +01:00
parent 293a8d1b60
commit 19f2272e94
3 changed files with 61 additions and 31 deletions
+39 -19
View 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_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_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_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
+10 -4
View 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);
+12 -8
View 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;
}