radeon_ioctl.c revision e00ef43d796f0ae0247b1072bf0aa8cdd8e3034d
15df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**************************************************************************
25df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
35df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulCopyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and
45df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                     VA Linux Systems Inc., Fremont, California.
55df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
65df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulAll Rights Reserved.
75df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
85df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulPermission is hereby granted, free of charge, to any person obtaining
95df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paula copy of this software and associated documentation files (the
105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul"Software"), to deal in the Software without restriction, including
115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulwithout limitation the rights to use, copy, modify, merge, publish,
125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Pauldistribute, sublicense, and/or sell copies of the Software, and to
135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulpermit persons to whom the Software is furnished to do so, subject to
145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulthe following conditions:
155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulThe above copyright notice and this permission notice (including the
175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulnext paragraph) shall be included in all copies or substantial
185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulportions of the Software.
195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulIN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul**************************************************************************/
295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*
315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Authors:
325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *   Kevin E. Martin <martin@valinux.com>
335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *   Gareth Hughes <gareth@valinux.com>
345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *   Keith Whitwell <keith@tungstengraphics.com>
355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
36bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl
375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include <sched.h>
38bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl#include <errno.h>
395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
40c6ac53bc40508ab2f0b9e023eee7ec3793fdf917Dave Airlie#include "main/attrib.h"
41c6ac53bc40508ab2f0b9e023eee7ec3793fdf917Dave Airlie#include "main/enable.h"
42c6ac53bc40508ab2f0b9e023eee7ec3793fdf917Dave Airlie#include "main/blend.h"
43c6ac53bc40508ab2f0b9e023eee7ec3793fdf917Dave Airlie#include "main/bufferobj.h"
44c6ac53bc40508ab2f0b9e023eee7ec3793fdf917Dave Airlie#include "main/buffers.h"
45c6ac53bc40508ab2f0b9e023eee7ec3793fdf917Dave Airlie#include "main/depth.h"
46c6ac53bc40508ab2f0b9e023eee7ec3793fdf917Dave Airlie#include "main/shaders.h"
47c6ac53bc40508ab2f0b9e023eee7ec3793fdf917Dave Airlie#include "main/texstate.h"
48c6ac53bc40508ab2f0b9e023eee7ec3793fdf917Dave Airlie#include "main/varray.h"
49c6ac53bc40508ab2f0b9e023eee7ec3793fdf917Dave Airlie#include "glapi/dispatch.h"
50c6ac53bc40508ab2f0b9e023eee7ec3793fdf917Dave Airlie#include "swrast/swrast.h"
51c6ac53bc40508ab2f0b9e023eee7ec3793fdf917Dave Airlie#include "main/stencil.h"
52c6ac53bc40508ab2f0b9e023eee7ec3793fdf917Dave Airlie#include "main/matrix.h"
53c6ac53bc40508ab2f0b9e023eee7ec3793fdf917Dave Airlie
54ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/glheader.h"
55ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/imports.h"
56ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/simple_list.h"
575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "swrast/swrast.h"
585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_context.h"
6023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie#include "radeon_common.h"
615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_state.h"
625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_ioctl.h"
635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_tcl.h"
645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_sanity.h"
655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
66462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane#define STANDALONE_MMIO
675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_macros.h"  /* for INREG() */
685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
69da84f0b642a65614c2618121869d5cd45ad986f5Brian Paul#include "drirenderbuffer.h"
705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "vblank.h"
715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RADEON_TIMEOUT             512
735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RADEON_IDLE_RETRY           16
745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* =============================================================
775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Kernel command buffer handling
785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
805562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt/* The state atoms will be emitted in the order they appear in the atom list,
815562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt * so this step is important.
825562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt */
834637235183b80963536f2364e4d50fcb894886ddDave Airlievoid radeonSetUpAtomList( r100ContextPtr rmesa )
845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
854637235183b80963536f2364e4d50fcb894886ddDave Airlie   int i, mtu = rmesa->radeon.glCtx->Const.MaxTextureUnits;
865562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt
871090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   make_empty_list(&rmesa->radeon.hw.atomlist);
881090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   rmesa->radeon.hw.atomlist.name = "atom-list";
895562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt
901090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   insert_at_tail(&rmesa->radeon.hw.atomlist, &rmesa->hw.ctx);
911090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   insert_at_tail(&rmesa->radeon.hw.atomlist, &rmesa->hw.set);
921090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   insert_at_tail(&rmesa->radeon.hw.atomlist, &rmesa->hw.lin);
931090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   insert_at_tail(&rmesa->radeon.hw.atomlist, &rmesa->hw.msk);
941090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   insert_at_tail(&rmesa->radeon.hw.atomlist, &rmesa->hw.vpt);
951090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   insert_at_tail(&rmesa->radeon.hw.atomlist, &rmesa->hw.tcl);
961090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   insert_at_tail(&rmesa->radeon.hw.atomlist, &rmesa->hw.msc);
975562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt   for (i = 0; i < mtu; ++i) {
981090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie       insert_at_tail(&rmesa->radeon.hw.atomlist, &rmesa->hw.tex[i]);
991090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie       insert_at_tail(&rmesa->radeon.hw.atomlist, &rmesa->hw.txr[i]);
1001090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie       insert_at_tail(&rmesa->radeon.hw.atomlist, &rmesa->hw.cube[i]);
10122d1acf2ee25280c3294c2cfded232e612ffac2eFelix Kuehling   }
1021090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   insert_at_tail(&rmesa->radeon.hw.atomlist, &rmesa->hw.zbs);
1031090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   insert_at_tail(&rmesa->radeon.hw.atomlist, &rmesa->hw.mtl);
1045562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt   for (i = 0; i < 3 + mtu; ++i)
1051090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie      insert_at_tail(&rmesa->radeon.hw.atomlist, &rmesa->hw.mat[i]);
10622d1acf2ee25280c3294c2cfded232e612ffac2eFelix Kuehling   for (i = 0; i < 8; ++i)
1071090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie      insert_at_tail(&rmesa->radeon.hw.atomlist, &rmesa->hw.lit[i]);
10822d1acf2ee25280c3294c2cfded232e612ffac2eFelix Kuehling   for (i = 0; i < 6; ++i)
1091090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie      insert_at_tail(&rmesa->radeon.hw.atomlist, &rmesa->hw.ucp[i]);
1101090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   insert_at_tail(&rmesa->radeon.hw.atomlist, &rmesa->hw.eye);
1111090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   insert_at_tail(&rmesa->radeon.hw.atomlist, &rmesa->hw.grd);
1121090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   insert_at_tail(&rmesa->radeon.hw.atomlist, &rmesa->hw.fog);
1131090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   insert_at_tail(&rmesa->radeon.hw.atomlist, &rmesa->hw.glt);
1145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
1155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Fire a section of the retained (indexed_verts) buffer as a regular
1175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * primtive.
1185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
1194637235183b80963536f2364e4d50fcb894886ddDave Airlieextern void radeonEmitVbufPrim( r100ContextPtr rmesa,
1205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				GLuint vertex_format,
1215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				GLuint primitive,
1225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				GLuint vertex_nr )
1235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
124b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   BATCH_LOCALS(&rmesa->radeon);
1255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   assert(!(primitive & RADEON_CP_VC_CNTL_PRIM_WALK_IND));
1275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1281090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   radeonEmitState(&rmesa->radeon);
1295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1303fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie#if RADEON_OLD_PACKETS
1319df844b109a9d2cc1d3b16315c34ef84f147c5b6Dave Airlie   BEGIN_BATCH(8);
1323fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   OUT_BATCH_PACKET3_CLIP(RADEON_CP_PACKET3_3D_RNDR_GEN_INDX_PRIM, 3);
1332972d065265d38c7902ffeaa1e71706895649becDave Airlie   if (!rmesa->radeon.radeonScreen->kernel_mm) {
1342972d065265d38c7902ffeaa1e71706895649becDave Airlie     OUT_BATCH_RELOC(rmesa->ioctl.vertex_offset, rmesa->ioctl.bo, rmesa->ioctl.vertex_offset, RADEON_GEM_DOMAIN_GTT, 0, 0);
1352972d065265d38c7902ffeaa1e71706895649becDave Airlie   } else {
1362972d065265d38c7902ffeaa1e71706895649becDave Airlie     OUT_BATCH(rmesa->ioctl.vertex_offset);
1372972d065265d38c7902ffeaa1e71706895649becDave Airlie   }
1382972d065265d38c7902ffeaa1e71706895649becDave Airlie
1393fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   OUT_BATCH(vertex_nr);
1403fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   OUT_BATCH(vertex_format);
1413fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   OUT_BATCH(primitive |  RADEON_CP_VC_CNTL_PRIM_WALK_LIST |
1423fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie	     RADEON_CP_VC_CNTL_COLOR_ORDER_RGBA |
1433fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie	     RADEON_CP_VC_CNTL_VTX_FMT_RADEON_MODE |
1443fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie	     (vertex_nr << RADEON_CP_VC_CNTL_NUM_SHIFT));
1452972d065265d38c7902ffeaa1e71706895649becDave Airlie
1462972d065265d38c7902ffeaa1e71706895649becDave Airlie   if (rmesa->radeon.radeonScreen->kernel_mm) {
1472972d065265d38c7902ffeaa1e71706895649becDave Airlie     radeon_cs_write_reloc(rmesa->radeon.cmdbuf.cs,
1482972d065265d38c7902ffeaa1e71706895649becDave Airlie			   rmesa->ioctl.bo,
1492972d065265d38c7902ffeaa1e71706895649becDave Airlie			   RADEON_GEM_DOMAIN_GTT,
1502972d065265d38c7902ffeaa1e71706895649becDave Airlie			   0, 0);
1512972d065265d38c7902ffeaa1e71706895649becDave Airlie   }
1522972d065265d38c7902ffeaa1e71706895649becDave Airlie
1533fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   END_BATCH();
1545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1553fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie#else
1563fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   BEGIN_BATCH(4);
1573fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   OUT_BATCH_PACKET3_CLIP(RADEON_CP_PACKET3_3D_DRAW_VBUF, 1);
158b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   OUT_BATCH(vertex_format);
159b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   OUT_BATCH(primitive |
160b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie	     RADEON_CP_VC_CNTL_PRIM_WALK_LIST |
161b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie	     RADEON_CP_VC_CNTL_COLOR_ORDER_RGBA |
162b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie	     RADEON_CP_VC_CNTL_MAOS_ENABLE |
163b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie	     RADEON_CP_VC_CNTL_VTX_FMT_RADEON_MODE |
164b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie	     (vertex_nr << RADEON_CP_VC_CNTL_NUM_SHIFT));
165b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   END_BATCH();
1663fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie#endif
1675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
1685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1694637235183b80963536f2364e4d50fcb894886ddDave Airlievoid radeonFlushElts( GLcontext *ctx )
1705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
171ccf7814a315f0be05cdc36ca358e2917a3d4ac19Dave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
172ccf7814a315f0be05cdc36ca358e2917a3d4ac19Dave Airlie   BATCH_LOCALS(&rmesa->radeon);
173ccf7814a315f0be05cdc36ca358e2917a3d4ac19Dave Airlie   int nr;
1743fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   uint32_t *cmd = (uint32_t *)(rmesa->radeon.cmdbuf.cs->packets + rmesa->tcl.elt_cmd_start);
175ccf7814a315f0be05cdc36ca358e2917a3d4ac19Dave Airlie   int dwords = (rmesa->radeon.cmdbuf.cs->section_ndw - rmesa->radeon.cmdbuf.cs->section_cdw);
1763fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie
1775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (RADEON_DEBUG & DEBUG_IOCTL)
1785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "%s\n", __FUNCTION__);
1795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1805ba92a5b0543b4ff2c7db6101029ba36cb9843faDave Airlie   assert( rmesa->radeon.dma.flush == radeonFlushElts );
1815ba92a5b0543b4ff2c7db6101029ba36cb9843faDave Airlie   rmesa->radeon.dma.flush = NULL;
1825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
183ccf7814a315f0be05cdc36ca358e2917a3d4ac19Dave Airlie   nr = rmesa->tcl.elt_used;
1843fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie
1852972d065265d38c7902ffeaa1e71706895649becDave Airlie#if RADEON_OLD_PACKETS
1862972d065265d38c7902ffeaa1e71706895649becDave Airlie   if (rmesa->radeon.radeonScreen->kernel_mm) {
1872972d065265d38c7902ffeaa1e71706895649becDave Airlie     dwords -= 2;
1882972d065265d38c7902ffeaa1e71706895649becDave Airlie   }
1892972d065265d38c7902ffeaa1e71706895649becDave Airlie#endif
1905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#if RADEON_OLD_PACKETS
1923fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   cmd[1] |= (dwords + 3) << 16;
1935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   cmd[5] |= nr << RADEON_CP_VC_CNTL_NUM_SHIFT;
1945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#else
195ccf7814a315f0be05cdc36ca358e2917a3d4ac19Dave Airlie   cmd[1] |= (dwords + 2) << 16;
1965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   cmd[3] |= nr << RADEON_CP_VC_CNTL_NUM_SHIFT;
1975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#endif
198150ed2e43d5541556d282cae728cebeec692e07aDave Airlie
1992972d065265d38c7902ffeaa1e71706895649becDave Airlie   rmesa->radeon.cmdbuf.cs->cdw += dwords;
2003fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   rmesa->radeon.cmdbuf.cs->section_cdw += dwords;
2012972d065265d38c7902ffeaa1e71706895649becDave Airlie
2022972d065265d38c7902ffeaa1e71706895649becDave Airlie#if RADEON_OLD_PACKETS
2032972d065265d38c7902ffeaa1e71706895649becDave Airlie   if (rmesa->radeon.radeonScreen->kernel_mm) {
2042972d065265d38c7902ffeaa1e71706895649becDave Airlie      radeon_cs_write_reloc(rmesa->radeon.cmdbuf.cs,
2052972d065265d38c7902ffeaa1e71706895649becDave Airlie			    rmesa->ioctl.bo,
2062972d065265d38c7902ffeaa1e71706895649becDave Airlie			    RADEON_GEM_DOMAIN_GTT,
2072972d065265d38c7902ffeaa1e71706895649becDave Airlie			    0, 0);
2082972d065265d38c7902ffeaa1e71706895649becDave Airlie   }
2092972d065265d38c7902ffeaa1e71706895649becDave Airlie#endif
2102972d065265d38c7902ffeaa1e71706895649becDave Airlie
2113fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   END_BATCH();
2123fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie
213150ed2e43d5541556d282cae728cebeec692e07aDave Airlie   if (RADEON_DEBUG & DEBUG_SYNC) {
214150ed2e43d5541556d282cae728cebeec692e07aDave Airlie      fprintf(stderr, "%s: Syncing\n", __FUNCTION__);
2154637235183b80963536f2364e4d50fcb894886ddDave Airlie      radeonFinish( rmesa->radeon.glCtx );
216150ed2e43d5541556d282cae728cebeec692e07aDave Airlie   }
2175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2183fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie}
2195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2204637235183b80963536f2364e4d50fcb894886ddDave AirlieGLushort *radeonAllocEltsOpenEnded( r100ContextPtr rmesa,
2215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				    GLuint vertex_format,
2225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				    GLuint primitive,
2235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				    GLuint min_nr )
2245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
2255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLushort *retval;
2269df844b109a9d2cc1d3b16315c34ef84f147c5b6Dave Airlie   int align_min_nr;
2273fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   BATCH_LOCALS(&rmesa->radeon);
228639b5fca0c5cea26a9dc393b538508aece16ce6bDave Airlie
2295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (RADEON_DEBUG & DEBUG_IOCTL)
230639b5fca0c5cea26a9dc393b538508aece16ce6bDave Airlie      fprintf(stderr, "%s %d prim %x\n", __FUNCTION__, min_nr, primitive);
2315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   assert((primitive & RADEON_CP_VC_CNTL_PRIM_WALK_IND));
2335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2341090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   radeonEmitState(&rmesa->radeon);
2355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2363fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   rmesa->tcl.elt_cmd_start = rmesa->radeon.cmdbuf.cs->cdw;
2373fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie
2389df844b109a9d2cc1d3b16315c34ef84f147c5b6Dave Airlie   /* round up min_nr to align the state */
2399df844b109a9d2cc1d3b16315c34ef84f147c5b6Dave Airlie   align_min_nr = (min_nr + 1) & ~1;
2409df844b109a9d2cc1d3b16315c34ef84f147c5b6Dave Airlie
2413fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie#if RADEON_OLD_PACKETS
2429df844b109a9d2cc1d3b16315c34ef84f147c5b6Dave Airlie   BEGIN_BATCH_NO_AUTOSTATE(2+ELTS_BUFSZ(align_min_nr)/4);
2433fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   OUT_BATCH_PACKET3_CLIP(RADEON_CP_PACKET3_3D_RNDR_GEN_INDX_PRIM, 0);
2442972d065265d38c7902ffeaa1e71706895649becDave Airlie   if (!rmesa->radeon.radeonScreen->kernel_mm) {
2452972d065265d38c7902ffeaa1e71706895649becDave Airlie     OUT_BATCH_RELOC(rmesa->ioctl.vertex_offset, rmesa->ioctl.bo, rmesa->ioctl.vertex_offset, RADEON_GEM_DOMAIN_GTT, 0, 0);
2462972d065265d38c7902ffeaa1e71706895649becDave Airlie   } else {
2472972d065265d38c7902ffeaa1e71706895649becDave Airlie     OUT_BATCH(rmesa->ioctl.vertex_offset);
2482972d065265d38c7902ffeaa1e71706895649becDave Airlie   }
2493fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   OUT_BATCH(0xffff);
2503fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   OUT_BATCH(vertex_format);
2513fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   OUT_BATCH(primitive |
2523fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie	     RADEON_CP_VC_CNTL_PRIM_WALK_IND |
2533fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie	     RADEON_CP_VC_CNTL_COLOR_ORDER_RGBA |
2543fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie	     RADEON_CP_VC_CNTL_VTX_FMT_RADEON_MODE);
2553fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie
2563fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie#else
2579df844b109a9d2cc1d3b16315c34ef84f147c5b6Dave Airlie   BEGIN_BATCH_NO_AUTOSTATE(ELTS_BUFSZ(align_min_nr)/4);
2583fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   OUT_BATCH_PACKET3_CLIP(RADEON_CP_PACKET3_DRAW_INDX, 0);
2593fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   OUT_BATCH(vertex_format);
2603fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   OUT_BATCH(primitive |
2613fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie	     RADEON_CP_VC_CNTL_PRIM_WALK_IND |
2623fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie	     RADEON_CP_VC_CNTL_COLOR_ORDER_RGBA |
2633fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie	     RADEON_CP_VC_CNTL_MAOS_ENABLE |
2643fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie	     RADEON_CP_VC_CNTL_VTX_FMT_RADEON_MODE);
2653fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie#endif
2663fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie
2673fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie
2683fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   rmesa->tcl.elt_cmd_offset = rmesa->radeon.cmdbuf.cs->cdw;
269ccf7814a315f0be05cdc36ca358e2917a3d4ac19Dave Airlie   rmesa->tcl.elt_used = min_nr;
270b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie
2713fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   retval = (GLushort *)(rmesa->radeon.cmdbuf.cs->packets + rmesa->tcl.elt_cmd_offset);
2723fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie
2735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (RADEON_DEBUG & DEBUG_PRIMS)
2743fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie      fprintf(stderr, "%s: header prim %x \n",
2753fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie	      __FUNCTION__, primitive);
2765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2775ba92a5b0543b4ff2c7db6101029ba36cb9843faDave Airlie   assert(!rmesa->radeon.dma.flush);
2784637235183b80963536f2364e4d50fcb894886ddDave Airlie   rmesa->radeon.glCtx->Driver.NeedFlush |= FLUSH_STORED_VERTICES;
2795ba92a5b0543b4ff2c7db6101029ba36cb9843faDave Airlie   rmesa->radeon.dma.flush = radeonFlushElts;
2805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return retval;
2825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2844637235183b80963536f2364e4d50fcb894886ddDave Airlievoid radeonEmitVertexAOS( r100ContextPtr rmesa,
2855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			  GLuint vertex_size,
2863fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie			  struct radeon_bo *bo,
2875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			  GLuint offset )
2885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
2895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#if RADEON_OLD_PACKETS
2905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->ioctl.vertex_offset = offset;
2913fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   rmesa->ioctl.bo = bo;
2925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#else
293b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   BATCH_LOCALS(&rmesa->radeon);
2945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (RADEON_DEBUG & (DEBUG_PRIMS|DEBUG_IOCTL))
2965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "%s:  vertex_size 0x%x offset 0x%x \n",
2975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      __FUNCTION__, vertex_size, offset);
2985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2993fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   BEGIN_BATCH(7);
300b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   OUT_BATCH_PACKET3(RADEON_CP_PACKET3_3D_LOAD_VBPNTR, 2);
301b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   OUT_BATCH(1);
302b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   OUT_BATCH(vertex_size | (vertex_size << 8));
303b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   OUT_BATCH_RELOC(offset, bo, offset, RADEON_GEM_DOMAIN_GTT, 0, 0);
304b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   END_BATCH();
3053fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie
3065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#endif
3075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3104637235183b80963536f2364e4d50fcb894886ddDave Airlievoid radeonEmitAOS( r100ContextPtr rmesa,
3115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		    GLuint nr,
3125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		    GLuint offset )
3135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
3145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#if RADEON_OLD_PACKETS
3155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   assert( nr == 1 );
316e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie   rmesa->ioctl.bo = rmesa->radeon.tcl.aos[0].bo;
3175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->ioctl.vertex_offset =
318e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie     (rmesa->radeon.tcl.aos[0].offset + offset * rmesa->radeon.tcl.aos[0].stride * 4);
3195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#else
3203fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   BATCH_LOCALS(&rmesa->radeon);
3213fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   uint32_t voffset;
3223fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   //   int sz = AOS_BUFSZ(nr);
3233fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   int sz = 1 + (nr >> 1) * 3 + (nr & 1) * 2;
3245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int i;
3255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (RADEON_DEBUG & DEBUG_IOCTL)
3275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "%s\n", __FUNCTION__);
3285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3293fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   BEGIN_BATCH(sz+2+(nr * 2));
3303fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   OUT_BATCH_PACKET3(RADEON_CP_PACKET3_3D_LOAD_VBPNTR, sz - 1);
3313fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   OUT_BATCH(nr);
3323fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie
3333fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   if (!rmesa->radeon.radeonScreen->kernel_mm) {
3343fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie      for (i = 0; i + 1 < nr; i += 2) {
335e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	 OUT_BATCH((rmesa->radeon.tcl.aos[i].components << 0) |
336e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		   (rmesa->radeon.tcl.aos[i].stride << 8) |
337e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		   (rmesa->radeon.tcl.aos[i + 1].components << 16) |
338e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		   (rmesa->radeon.tcl.aos[i + 1].stride << 24));
3393fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie
340e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	 voffset =  rmesa->radeon.tcl.aos[i + 0].offset +
341e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	    offset * 4 * rmesa->radeon.tcl.aos[i + 0].stride;
3423fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie	 OUT_BATCH_RELOC(voffset,
343e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie			 rmesa->radeon.tcl.aos[i].bo,
3443fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie			 voffset,
3453fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie			 RADEON_GEM_DOMAIN_GTT,
3463fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie			 0, 0);
347e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	 voffset =  rmesa->radeon.tcl.aos[i + 1].offset +
348e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	    offset * 4 * rmesa->radeon.tcl.aos[i + 1].stride;
3493fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie	 OUT_BATCH_RELOC(voffset,
350e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie			 rmesa->radeon.tcl.aos[i+1].bo,
3513fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie			 voffset,
3523fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie			 RADEON_GEM_DOMAIN_GTT,
3533fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie			 0, 0);
3543fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie      }
3553fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie
3563fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie      if (nr & 1) {
357e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	 OUT_BATCH((rmesa->radeon.tcl.aos[nr - 1].components << 0) |
358e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		   (rmesa->radeon.tcl.aos[nr - 1].stride << 8));
359e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	 voffset =  rmesa->radeon.tcl.aos[nr - 1].offset +
360e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	    offset * 4 * rmesa->radeon.tcl.aos[nr - 1].stride;
3613fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie	 OUT_BATCH_RELOC(voffset,
362e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie			 rmesa->radeon.tcl.aos[nr - 1].bo,
3633fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie			 voffset,
3643fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie			 RADEON_GEM_DOMAIN_GTT,
3653fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie			 0, 0);
3663fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie      }
3673fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   } else {
3683fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie      for (i = 0; i + 1 < nr; i += 2) {
369e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	 OUT_BATCH((rmesa->radeon.tcl.aos[i].components << 0) |
370e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		   (rmesa->radeon.tcl.aos[i].stride << 8) |
371e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		   (rmesa->radeon.tcl.aos[i + 1].components << 16) |
372e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		   (rmesa->radeon.tcl.aos[i + 1].stride << 24));
3733fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie
374e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	 voffset =  rmesa->radeon.tcl.aos[i + 0].offset +
375e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	    offset * 4 * rmesa->radeon.tcl.aos[i + 0].stride;
3763fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie	 OUT_BATCH(voffset);
377e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	 voffset =  rmesa->radeon.tcl.aos[i + 1].offset +
378e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	    offset * 4 * rmesa->radeon.tcl.aos[i + 1].stride;
3793fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie	 OUT_BATCH(voffset);
3803fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie      }
3813fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie
3823fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie      if (nr & 1) {
383e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	 OUT_BATCH((rmesa->radeon.tcl.aos[nr - 1].components << 0) |
384e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie		   (rmesa->radeon.tcl.aos[nr - 1].stride << 8));
385e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	 voffset =  rmesa->radeon.tcl.aos[nr - 1].offset +
386e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	    offset * 4 * rmesa->radeon.tcl.aos[nr - 1].stride;
3873fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie	 OUT_BATCH(voffset);
3885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
3893fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie      for (i = 0; i + 1 < nr; i += 2) {
390e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	 voffset =  rmesa->radeon.tcl.aos[i + 0].offset +
391e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	    offset * 4 * rmesa->radeon.tcl.aos[i + 0].stride;
3923fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie	 radeon_cs_write_reloc(rmesa->radeon.cmdbuf.cs,
393e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie			       rmesa->radeon.tcl.aos[i+0].bo,
3943fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie			       RADEON_GEM_DOMAIN_GTT,
3953fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie			       0, 0);
396e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	 voffset =  rmesa->radeon.tcl.aos[i + 1].offset +
397e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	    offset * 4 * rmesa->radeon.tcl.aos[i + 1].stride;
3983fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie	 radeon_cs_write_reloc(rmesa->radeon.cmdbuf.cs,
399e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie			       rmesa->radeon.tcl.aos[i+1].bo,
4003fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie			       RADEON_GEM_DOMAIN_GTT,
4013fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie			       0, 0);
4023fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie      }
4033fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie      if (nr & 1) {
404e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	 voffset =  rmesa->radeon.tcl.aos[nr - 1].offset +
405e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie	    offset * 4 * rmesa->radeon.tcl.aos[nr - 1].stride;
4063fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie	 radeon_cs_write_reloc(rmesa->radeon.cmdbuf.cs,
407e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie			       rmesa->radeon.tcl.aos[nr-1].bo,
4083fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie			       RADEON_GEM_DOMAIN_GTT,
4093fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie			       0, 0);
4105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
4115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4123fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   END_BATCH();
4135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#endif
4155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ================================================================
4185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Buffer clear
4195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
4205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RADEON_MAX_CLEARS	256
4215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
422c6ac53bc40508ab2f0b9e023eee7ec3793fdf917Dave Airliestatic void radeonUserClear(GLcontext *ctx, GLuint mask)
423c6ac53bc40508ab2f0b9e023eee7ec3793fdf917Dave Airlie{
424c6ac53bc40508ab2f0b9e023eee7ec3793fdf917Dave Airlie   radeon_clear_tris(ctx, mask);
425940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie}
426940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie
427940d47de08eedaf5d8471628ba4860663d79a98eDave Airliestatic void radeonKernelClear(GLcontext *ctx, GLuint flags)
428940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie{
429940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie     r100ContextPtr rmesa = R100_CONTEXT(ctx);
430940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie   __DRIdrawablePrivate *dPriv = rmesa->radeon.dri.drawable;
431940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie   drm_radeon_sarea_t *sarea = rmesa->radeon.sarea;
432940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie   uint32_t clear;
433940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie   GLint ret, i;
434940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie   GLint cx, cy, cw, ch;
4355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
436d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie   LOCK_HARDWARE( &rmesa->radeon );
4375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
438446972bc2756cf9770a82f51aa0dc4f529c6cae5Brian Paul   /* compute region after locking: */
439446972bc2756cf9770a82f51aa0dc4f529c6cae5Brian Paul   cx = ctx->DrawBuffer->_Xmin;
440446972bc2756cf9770a82f51aa0dc4f529c6cae5Brian Paul   cy = ctx->DrawBuffer->_Ymin;
441446972bc2756cf9770a82f51aa0dc4f529c6cae5Brian Paul   cw = ctx->DrawBuffer->_Xmax - cx;
442446972bc2756cf9770a82f51aa0dc4f529c6cae5Brian Paul   ch = ctx->DrawBuffer->_Ymax - cy;
443446972bc2756cf9770a82f51aa0dc4f529c6cae5Brian Paul
444a2104dc6e18879ed3ba2108a09b6779e461eaa17Roland Scheidegger   /* Flip top to bottom */
445a2104dc6e18879ed3ba2108a09b6779e461eaa17Roland Scheidegger   cx += dPriv->x;
446a2104dc6e18879ed3ba2108a09b6779e461eaa17Roland Scheidegger   cy  = dPriv->y + dPriv->h - cy - ch;
447a2104dc6e18879ed3ba2108a09b6779e461eaa17Roland Scheidegger
4485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Throttle the number of clear ioctls we do.
4495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
4505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   while ( 1 ) {
4515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      int ret;
452b302419abe96cdb81878913c164d7ae2209ddcdaRoland Scheidegger      drm_radeon_getparam_t gp;
4535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
454b302419abe96cdb81878913c164d7ae2209ddcdaRoland Scheidegger      gp.param = RADEON_PARAM_LAST_CLEAR;
455b302419abe96cdb81878913c164d7ae2209ddcdaRoland Scheidegger      gp.value = (int *)&clear;
4564637235183b80963536f2364e4d50fcb894886ddDave Airlie      ret = drmCommandWriteRead( rmesa->radeon.dri.fd,
457b302419abe96cdb81878913c164d7ae2209ddcdaRoland Scheidegger				 DRM_RADEON_GETPARAM, &gp, sizeof(gp) );
4585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( ret ) {
460ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl	 fprintf( stderr, "%s: drm_radeon_getparam_t: %d\n", __FUNCTION__, ret );
4615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 exit(1);
4625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
4635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( sarea->last_clear - clear <= RADEON_MAX_CLEARS ) {
4655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
4665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
4675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4684637235183b80963536f2364e4d50fcb894886ddDave Airlie      if ( rmesa->radeon.do_usleeps ) {
469d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie	 UNLOCK_HARDWARE( &rmesa->radeon );
4705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 DO_USLEEP( 1 );
471d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie	 LOCK_HARDWARE( &rmesa->radeon );
4725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
4735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
475626f825bcc91a3068e2e1c68e7467b42826c51eaEric Anholt   /* Send current state to the hardware */
4768fe61fc5ba70be29b9d7dbdfab45c5434be587fcDave Airlie   rcommonFlushCmdBufLocked( &rmesa->radeon, __FUNCTION__ );
477626f825bcc91a3068e2e1c68e7467b42826c51eaEric Anholt
4785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   for ( i = 0 ; i < dPriv->numClipRects ; ) {
4795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLint nr = MIN2( i + RADEON_NR_SAREA_CLIPRECTS, dPriv->numClipRects );
480ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl      drm_clip_rect_t *box = dPriv->pClipRects;
4814637235183b80963536f2364e4d50fcb894886ddDave Airlie      drm_clip_rect_t *b = rmesa->radeon.sarea->boxes;
482ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl      drm_radeon_clear_t clear;
483ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl      drm_radeon_clear_rect_t depth_boxes[RADEON_NR_SAREA_CLIPRECTS];
4845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLint n = 0;
4855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
486446972bc2756cf9770a82f51aa0dc4f529c6cae5Brian Paul      if (cw != dPriv->w || ch != dPriv->h) {
487446972bc2756cf9770a82f51aa0dc4f529c6cae5Brian Paul         /* clear subregion */
4885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 for ( ; i < nr ; i++ ) {
4895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    GLint x = box[i].x1;
4905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    GLint y = box[i].y1;
4915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    GLint w = box[i].x2 - x;
4925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    GLint h = box[i].y2 - y;
4935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if ( x < cx ) w -= cx - x, x = cx;
4955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if ( y < cy ) h -= cy - y, y = cy;
4965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if ( x + w > cx + cw ) w = cx + cw - x;
4975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if ( y + h > cy + ch ) h = cy + ch - y;
4985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if ( w <= 0 ) continue;
4995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if ( h <= 0 ) continue;
5005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    b->x1 = x;
5025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    b->y1 = y;
5035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    b->x2 = x + w;
5045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    b->y2 = y + h;
5055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    b++;
5065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    n++;
5075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
5085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
509446972bc2756cf9770a82f51aa0dc4f529c6cae5Brian Paul         /* clear whole buffer */
5105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 for ( ; i < nr ; i++ ) {
5115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    *b++ = box[i];
5125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    n++;
5135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
5145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
5155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5164637235183b80963536f2364e4d50fcb894886ddDave Airlie      rmesa->radeon.sarea->nbox = n;
5175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      clear.flags       = flags;
519d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie      clear.clear_color = rmesa->radeon.state.color.clear;
520d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie      clear.clear_depth = rmesa->radeon.state.depth.clear;
5215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      clear.color_mask  = rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK];
522d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie      clear.depth_mask  = rmesa->radeon.state.stencil.clear;
5235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      clear.depth_boxes = depth_boxes;
5245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      n--;
5264637235183b80963536f2364e4d50fcb894886ddDave Airlie      b = rmesa->radeon.sarea->boxes;
5275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      for ( ; n >= 0 ; n-- ) {
528ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl	 depth_boxes[n].f[CLEAR_X1] = (float)b[n].x1;
529ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl	 depth_boxes[n].f[CLEAR_Y1] = (float)b[n].y1;
530ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl	 depth_boxes[n].f[CLEAR_X2] = (float)b[n].x2;
531ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl	 depth_boxes[n].f[CLEAR_Y2] = (float)b[n].y2;
532ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl	 depth_boxes[n].f[CLEAR_DEPTH] =
533d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie	    (float)rmesa->radeon.state.depth.clear;
5345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
5355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5364637235183b80963536f2364e4d50fcb894886ddDave Airlie      ret = drmCommandWrite( rmesa->radeon.dri.fd, DRM_RADEON_CLEAR,
537ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl			     &clear, sizeof(drm_radeon_clear_t));
5385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( ret ) {
540d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie	 UNLOCK_HARDWARE( &rmesa->radeon );
5415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf( stderr, "DRM_RADEON_CLEAR: return = %d\n", ret );
5425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 exit( 1 );
5435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
5445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
545d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie   UNLOCK_HARDWARE( &rmesa->radeon );
546940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie}
547940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie
548940d47de08eedaf5d8471628ba4860663d79a98eDave Airliestatic void radeonClear( GLcontext *ctx, GLbitfield mask )
549940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie{
550940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
551940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie   __DRIdrawablePrivate *dPriv = rmesa->radeon.dri.drawable;
552940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie   GLuint flags = 0;
553940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie   GLuint color_mask = 0;
554c6ac53bc40508ab2f0b9e023eee7ec3793fdf917Dave Airlie   GLuint orig_mask = mask;
555940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie
556940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie   if ( RADEON_DEBUG & DEBUG_IOCTL ) {
557940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie      fprintf( stderr, "radeonClear\n");
558940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie   }
559940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie
560940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie   {
561940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie      LOCK_HARDWARE( &rmesa->radeon );
562940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie      UNLOCK_HARDWARE( &rmesa->radeon );
563940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie      if ( dPriv->numClipRects == 0 )
564940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie	 return;
565940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie   }
566940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie
567c6ac53bc40508ab2f0b9e023eee7ec3793fdf917Dave Airlie   radeon_firevertices(&rmesa->radeon);
568940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie
569940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie   if ( mask & BUFFER_BIT_FRONT_LEFT ) {
570940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie      flags |= RADEON_FRONT;
571940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie      color_mask = rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK];
572940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie      mask &= ~BUFFER_BIT_FRONT_LEFT;
573940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie   }
574940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie
575940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie   if ( mask & BUFFER_BIT_BACK_LEFT ) {
576940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie      flags |= RADEON_BACK;
577940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie      color_mask = rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK];
578940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie      mask &= ~BUFFER_BIT_BACK_LEFT;
579940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie   }
580940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie
581940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie   if ( mask & BUFFER_BIT_DEPTH ) {
582940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie      flags |= RADEON_DEPTH;
583940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie      mask &= ~BUFFER_BIT_DEPTH;
584940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie   }
585940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie
5868c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie   if ( (mask & BUFFER_BIT_STENCIL) ) {
587940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie      flags |= RADEON_STENCIL;
588940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie      mask &= ~BUFFER_BIT_STENCIL;
589940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie   }
590940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie
591940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie   if ( mask ) {
592940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie      if (RADEON_DEBUG & DEBUG_FALLBACKS)
593940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie	 fprintf(stderr, "%s: swrast clear, mask: %x\n", __FUNCTION__, mask);
594940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie      _swrast_Clear( ctx, mask );
595940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie   }
596940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie
597940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie   if ( !flags )
598940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie      return;
599940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie
600940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie   if (rmesa->using_hyperz) {
601940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie      flags |= RADEON_USE_COMP_ZBUF;
602940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie/*      if (rmesa->radeon.radeonScreen->chipset & RADEON_CHIPSET_TCL)
603940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie         flags |= RADEON_USE_HIERZ; */
6048c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie      if (((flags & RADEON_DEPTH) && (flags & RADEON_STENCIL) &&
605940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie	    ((rmesa->radeon.state.stencil.clear & RADEON_STENCIL_WRITE_MASK) == RADEON_STENCIL_WRITE_MASK))) {
606940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie	  flags |= RADEON_CLEAR_FASTZ;
607940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie      }
608940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie   }
609940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie
610940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie   if (rmesa->radeon.radeonScreen->kernel_mm)
611c6ac53bc40508ab2f0b9e023eee7ec3793fdf917Dave Airlie     radeonUserClear(ctx, orig_mask);
612c6ac53bc40508ab2f0b9e023eee7ec3793fdf917Dave Airlie   else {
613940d47de08eedaf5d8471628ba4860663d79a98eDave Airlie      radeonKernelClear(ctx, flags);
614c6ac53bc40508ab2f0b9e023eee7ec3793fdf917Dave Airlie      rmesa->radeon.hw.all_dirty = GL_TRUE;
615c6ac53bc40508ab2f0b9e023eee7ec3793fdf917Dave Airlie   }
6165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
6175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonInitIoctlFuncs( GLcontext *ctx )
6195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
6205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    ctx->Driver.Clear = radeonClear;
6215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    ctx->Driver.Finish = radeonFinish;
6225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    ctx->Driver.Flush = radeonFlush;
6235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
6245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
625