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