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:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user