radeon_ioctl.c revision ccf7814a315f0be05cdc36ca358e2917a3d4ac19
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 40ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/glheader.h" 41ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/imports.h" 42ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/simple_list.h" 435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "swrast/swrast.h" 445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_context.h" 46b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie#include "common_cmdbuf.h" 47b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie#include "radeon_cs.h" 485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_state.h" 495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_ioctl.h" 505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_tcl.h" 515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_sanity.h" 525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 53462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane#define STANDALONE_MMIO 545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_macros.h" /* for INREG() */ 555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 56da84f0b642a65614c2618121869d5cd45ad986f5Brian Paul#include "drirenderbuffer.h" 575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "vblank.h" 585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RADEON_TIMEOUT 512 605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RADEON_IDLE_RETRY 16 615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 623fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie#define DEBUG_CMDBUF 1 638e3926575264d31b3caacb9cbb606f8f2914f57dRoland Scheidegger 644637235183b80963536f2364e4d50fcb894886ddDave Airliestatic void radeonSaveHwState( r100ContextPtr rmesa ) 655562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt{ 665562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt struct radeon_state_atom *atom; 677a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt char * dest = rmesa->backup_store.cmd_buf; 685562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt 698e3926575264d31b3caacb9cbb606f8f2914f57dRoland Scheidegger if (RADEON_DEBUG & DEBUG_STATE) 708e3926575264d31b3caacb9cbb606f8f2914f57dRoland Scheidegger fprintf(stderr, "%s\n", __FUNCTION__); 718e3926575264d31b3caacb9cbb606f8f2914f57dRoland Scheidegger 727a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt rmesa->backup_store.cmd_used = 0; 735562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt 747a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt foreach( atom, &rmesa->hw.atomlist ) { 754637235183b80963536f2364e4d50fcb894886ddDave Airlie if ( atom->check( rmesa->radeon.glCtx, 0 ) ) { 767a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt int size = atom->cmd_size * 4; 777a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt memcpy( dest, atom->cmd, size); 787a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt dest += size; 797a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt rmesa->backup_store.cmd_used += size; 808e3926575264d31b3caacb9cbb606f8f2914f57dRoland Scheidegger if (RADEON_DEBUG & DEBUG_STATE) 8136d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie radeon_print_state_atom( atom ); 827a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt } 835562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt } 847a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt 857a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt assert( rmesa->backup_store.cmd_used <= RADEON_CMD_BUF_SZ ); 868e3926575264d31b3caacb9cbb606f8f2914f57dRoland Scheidegger if (RADEON_DEBUG & DEBUG_STATE) 878e3926575264d31b3caacb9cbb606f8f2914f57dRoland Scheidegger fprintf(stderr, "Returning to radeonEmitState\n"); 885562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt} 895562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt 905562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt/* At this point we were in FlushCmdBufLocked but we had lost our context, so 917a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt * we need to unwire our current cmdbuf, hook the one with the saved state in 927a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt * it, flush it, and then put the current one back. This is so commands at the 937a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt * start of a cmdbuf can rely on the state being kept from the previous one. 945562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt */ 954637235183b80963536f2364e4d50fcb894886ddDave Airliestatic void radeonBackUpAndEmitLostStateLocked( r100ContextPtr rmesa ) 965562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt{ 978e3926575264d31b3caacb9cbb606f8f2914f57dRoland Scheidegger GLuint nr_released_bufs; 987a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt struct radeon_store saved_store; 997a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt 1007a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt if (rmesa->backup_store.cmd_used == 0) 1017a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt return; 1027a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt 1037a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt if (RADEON_DEBUG & DEBUG_STATE) 1047a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt fprintf(stderr, "Emitting backup state on lost context\n"); 1055562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt 1064637235183b80963536f2364e4d50fcb894886ddDave Airlie rmesa->radeon.lost_context = GL_FALSE; 1075562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt 1085ba92a5b0543b4ff2c7db6101029ba36cb9843faDave Airlie nr_released_bufs = rmesa->radeon.dma.nr_released_bufs; 1097a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt saved_store = rmesa->store; 1105ba92a5b0543b4ff2c7db6101029ba36cb9843faDave Airlie rmesa->radeon.dma.nr_released_bufs = 0; 1117a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt rmesa->store = rmesa->backup_store; 1128fe61fc5ba70be29b9d7dbdfab45c5434be587fcDave Airlie rcommonFlushCmdBufLocked( &rmesa->radeon, __FUNCTION__ ); 1135ba92a5b0543b4ff2c7db6101029ba36cb9843faDave Airlie rmesa->radeon.dma.nr_released_bufs = nr_released_bufs; 1147a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt rmesa->store = saved_store; 1155562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt} 1165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ============================================================= 1185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Kernel command buffer handling 1195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 1205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1215562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt/* The state atoms will be emitted in the order they appear in the atom list, 1225562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt * so this step is important. 1235562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt */ 1244637235183b80963536f2364e4d50fcb894886ddDave Airlievoid radeonSetUpAtomList( r100ContextPtr rmesa ) 1255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 1264637235183b80963536f2364e4d50fcb894886ddDave Airlie int i, mtu = rmesa->radeon.glCtx->Const.MaxTextureUnits; 1275562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt 1285562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt make_empty_list(&rmesa->hw.atomlist); 1295562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt rmesa->hw.atomlist.name = "atom-list"; 1305562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt 1315562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt insert_at_tail(&rmesa->hw.atomlist, &rmesa->hw.ctx); 1325562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt insert_at_tail(&rmesa->hw.atomlist, &rmesa->hw.set); 1335562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt insert_at_tail(&rmesa->hw.atomlist, &rmesa->hw.lin); 1345562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt insert_at_tail(&rmesa->hw.atomlist, &rmesa->hw.msk); 1355562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt insert_at_tail(&rmesa->hw.atomlist, &rmesa->hw.vpt); 1365562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt insert_at_tail(&rmesa->hw.atomlist, &rmesa->hw.tcl); 1375562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt insert_at_tail(&rmesa->hw.atomlist, &rmesa->hw.msc); 1385562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt for (i = 0; i < mtu; ++i) { 1395562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt insert_at_tail(&rmesa->hw.atomlist, &rmesa->hw.tex[i]); 1405562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt insert_at_tail(&rmesa->hw.atomlist, &rmesa->hw.txr[i]); 141247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger insert_at_tail(&rmesa->hw.atomlist, &rmesa->hw.cube[i]); 14222d1acf2ee25280c3294c2cfded232e612ffac2eFelix Kuehling } 1435562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt insert_at_tail(&rmesa->hw.atomlist, &rmesa->hw.zbs); 1445562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt insert_at_tail(&rmesa->hw.atomlist, &rmesa->hw.mtl); 1455562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt for (i = 0; i < 3 + mtu; ++i) 1465562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt insert_at_tail(&rmesa->hw.atomlist, &rmesa->hw.mat[i]); 14722d1acf2ee25280c3294c2cfded232e612ffac2eFelix Kuehling for (i = 0; i < 8; ++i) 1485562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt insert_at_tail(&rmesa->hw.atomlist, &rmesa->hw.lit[i]); 14922d1acf2ee25280c3294c2cfded232e612ffac2eFelix Kuehling for (i = 0; i < 6; ++i) 1505562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt insert_at_tail(&rmesa->hw.atomlist, &rmesa->hw.ucp[i]); 1515562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt insert_at_tail(&rmesa->hw.atomlist, &rmesa->hw.eye); 1525562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt insert_at_tail(&rmesa->hw.atomlist, &rmesa->hw.grd); 1535562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt insert_at_tail(&rmesa->hw.atomlist, &rmesa->hw.fog); 1545562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt insert_at_tail(&rmesa->hw.atomlist, &rmesa->hw.glt); 1555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 1565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 15736d3f3e74a809ad346e981805a2f61710d3a380bDave Airliestatic INLINE void radeonEmitAtoms(r100ContextPtr r100, GLboolean dirty) 15836d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie{ 15936d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie BATCH_LOCALS(&r100->radeon); 16036d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie struct radeon_state_atom *atom; 16136d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie int dwords; 16236d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie 16336d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie /* Emit actual atoms */ 16436d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie foreach(atom, &r100->hw.atomlist) { 16536d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie if ((atom->dirty || r100->hw.all_dirty) == dirty) { 16636d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie dwords = (*atom->check) (r100->radeon.glCtx, atom); 16736d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie if (dwords) { 16836d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie if (DEBUG_CMDBUF && RADEON_DEBUG & DEBUG_STATE) { 16936d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie radeon_print_state_atom(atom); 17036d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie } 17136d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie if (atom->emit) { 17236d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie (*atom->emit)(r100->radeon.glCtx, atom); 17336d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie } else { 17436d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie BEGIN_BATCH_NO_AUTOSTATE(dwords); 17536d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie OUT_BATCH_TABLE(atom->cmd, dwords); 17636d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie END_BATCH(); 17736d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie } 17836d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie atom->dirty = GL_FALSE; 17936d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie } else { 18036d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie if (DEBUG_CMDBUF && RADEON_DEBUG & DEBUG_STATE) { 18136d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie fprintf(stderr, " skip state %s\n", 18236d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie atom->name); 18336d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie } 18436d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie } 18536d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie } 18636d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie } 18736d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie 18836d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie COMMIT_BATCH(); 18936d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie} 19036d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie 1914637235183b80963536f2364e4d50fcb894886ddDave Airlievoid radeonEmitState( r100ContextPtr rmesa ) 1925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 1935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (RADEON_DEBUG & (DEBUG_STATE|DEBUG_PRIMS)) 1945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fprintf(stderr, "%s\n", __FUNCTION__); 1955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1967a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt if (rmesa->save_on_next_emit) { 1977a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt radeonSaveHwState(rmesa); 1987a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt rmesa->save_on_next_emit = GL_FALSE; 1997a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt } 2007a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt 20172e3664996721263858f3096e4a618a406550402Dave Airlie /* this code used to return here but now it emits zbs */ 2025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2035562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt /* To avoid going across the entire set of states multiple times, just check 2045562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt * for enough space for the case of emitting all state, and inline the 2055562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt * radeonAllocCmdBuf code here without all the checks. 2065562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt */ 207b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rcommonEnsureCmdBufSpace(&rmesa->radeon, rmesa->hw.max_state_size, __FUNCTION__); 2085562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt 20972e3664996721263858f3096e4a618a406550402Dave Airlie /* We always always emit zbs, this is due to a bug found by keithw in 21072e3664996721263858f3096e4a618a406550402Dave Airlie the hardware and rediscovered after Erics changes by me. 21172e3664996721263858f3096e4a618a406550402Dave Airlie if you ever touch this code make sure you emit zbs otherwise 21272e3664996721263858f3096e4a618a406550402Dave Airlie you get tcl lockups on at least M7/7500 class of chips - airlied */ 21372e3664996721263858f3096e4a618a406550402Dave Airlie rmesa->hw.zbs.dirty=1; 21472e3664996721263858f3096e4a618a406550402Dave Airlie 21536d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie if (!rmesa->radeon.cmdbuf.cs->cdw) { 21636d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie if (RADEON_DEBUG & DEBUG_STATE) 21736d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie fprintf(stderr, "Begin reemit state\n"); 21836d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie 21936d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie radeonEmitAtoms(rmesa, GL_FALSE); 2205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 22236d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie if (RADEON_DEBUG & DEBUG_STATE) 22336d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie fprintf(stderr, "Begin dirty state\n"); 2245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 22536d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie radeonEmitAtoms(rmesa, GL_TRUE); 2265562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt rmesa->hw.is_dirty = GL_FALSE; 2275562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt rmesa->hw.all_dirty = GL_FALSE; 22836d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie 2295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 2305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Fire a section of the retained (indexed_verts) buffer as a regular 2325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * primtive. 2335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 2344637235183b80963536f2364e4d50fcb894886ddDave Airlieextern void radeonEmitVbufPrim( r100ContextPtr rmesa, 2355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint vertex_format, 2365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint primitive, 2375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint vertex_nr ) 2385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 239b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie BATCH_LOCALS(&rmesa->radeon); 2405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul assert(!(primitive & RADEON_CP_VC_CNTL_PRIM_WALK_IND)); 2425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonEmitState( rmesa ); 2445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2453fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie#if RADEON_OLD_PACKETS 2469df844b109a9d2cc1d3b16315c34ef84f147c5b6Dave Airlie BEGIN_BATCH(8); 2473fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie OUT_BATCH_PACKET3_CLIP(RADEON_CP_PACKET3_3D_RNDR_GEN_INDX_PRIM, 3); 2483fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie OUT_BATCH_RELOC(rmesa->ioctl.vertex_offset, rmesa->ioctl.bo, rmesa->ioctl.vertex_offset, RADEON_GEM_DOMAIN_GTT, 0, 0); 2493fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie OUT_BATCH(vertex_nr); 2503fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie OUT_BATCH(vertex_format); 2513fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie OUT_BATCH(primitive | RADEON_CP_VC_CNTL_PRIM_WALK_LIST | 2523fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie RADEON_CP_VC_CNTL_COLOR_ORDER_RGBA | 2533fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie RADEON_CP_VC_CNTL_VTX_FMT_RADEON_MODE | 2543fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie (vertex_nr << RADEON_CP_VC_CNTL_NUM_SHIFT)); 2553fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie END_BATCH(); 2565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2573fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie#else 2583fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie BEGIN_BATCH(4); 2593fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie OUT_BATCH_PACKET3_CLIP(RADEON_CP_PACKET3_3D_DRAW_VBUF, 1); 260b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie OUT_BATCH(vertex_format); 261b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie OUT_BATCH(primitive | 262b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie RADEON_CP_VC_CNTL_PRIM_WALK_LIST | 263b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie RADEON_CP_VC_CNTL_COLOR_ORDER_RGBA | 264b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie RADEON_CP_VC_CNTL_MAOS_ENABLE | 265b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie RADEON_CP_VC_CNTL_VTX_FMT_RADEON_MODE | 266b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie (vertex_nr << RADEON_CP_VC_CNTL_NUM_SHIFT)); 267b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie END_BATCH(); 2683fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie#endif 2695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 2705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2714637235183b80963536f2364e4d50fcb894886ddDave Airlievoid radeonFlushElts( GLcontext *ctx ) 2725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 273ccf7814a315f0be05cdc36ca358e2917a3d4ac19Dave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 274ccf7814a315f0be05cdc36ca358e2917a3d4ac19Dave Airlie BATCH_LOCALS(&rmesa->radeon); 275ccf7814a315f0be05cdc36ca358e2917a3d4ac19Dave Airlie int nr; 2763fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie uint32_t *cmd = (uint32_t *)(rmesa->radeon.cmdbuf.cs->packets + rmesa->tcl.elt_cmd_start); 277ccf7814a315f0be05cdc36ca358e2917a3d4ac19Dave Airlie int dwords = (rmesa->radeon.cmdbuf.cs->section_ndw - rmesa->radeon.cmdbuf.cs->section_cdw); 2783fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie 2795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (RADEON_DEBUG & DEBUG_IOCTL) 2805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fprintf(stderr, "%s\n", __FUNCTION__); 2815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2825ba92a5b0543b4ff2c7db6101029ba36cb9843faDave Airlie assert( rmesa->radeon.dma.flush == radeonFlushElts ); 2835ba92a5b0543b4ff2c7db6101029ba36cb9843faDave Airlie rmesa->radeon.dma.flush = NULL; 2845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 285ccf7814a315f0be05cdc36ca358e2917a3d4ac19Dave Airlie nr = rmesa->tcl.elt_used; 2863fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie 2873fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie rmesa->radeon.cmdbuf.cs->cdw += dwords; 2885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#if RADEON_OLD_PACKETS 2903fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie cmd[1] |= (dwords + 3) << 16; 2915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul cmd[5] |= nr << RADEON_CP_VC_CNTL_NUM_SHIFT; 2925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#else 293ccf7814a315f0be05cdc36ca358e2917a3d4ac19Dave Airlie cmd[1] |= (dwords + 2) << 16; 2945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul cmd[3] |= nr << RADEON_CP_VC_CNTL_NUM_SHIFT; 2955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#endif 296150ed2e43d5541556d282cae728cebeec692e07aDave Airlie 2973fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie rmesa->radeon.cmdbuf.cs->section_cdw += dwords; 2983fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie END_BATCH(); 2993fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie 300150ed2e43d5541556d282cae728cebeec692e07aDave Airlie if (RADEON_DEBUG & DEBUG_SYNC) { 301150ed2e43d5541556d282cae728cebeec692e07aDave Airlie fprintf(stderr, "%s: Syncing\n", __FUNCTION__); 3024637235183b80963536f2364e4d50fcb894886ddDave Airlie radeonFinish( rmesa->radeon.glCtx ); 303150ed2e43d5541556d282cae728cebeec692e07aDave Airlie } 3045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3053fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie} 3065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3074637235183b80963536f2364e4d50fcb894886ddDave AirlieGLushort *radeonAllocEltsOpenEnded( r100ContextPtr rmesa, 3085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint vertex_format, 3095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint primitive, 3105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint min_nr ) 3115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 3125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLushort *retval; 3139df844b109a9d2cc1d3b16315c34ef84f147c5b6Dave Airlie int align_min_nr; 3143fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie BATCH_LOCALS(&rmesa->radeon); 3155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (RADEON_DEBUG & DEBUG_IOCTL) 3165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul assert((primitive & RADEON_CP_VC_CNTL_PRIM_WALK_IND)); 3185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonEmitState( rmesa ); 3205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3213fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie rmesa->tcl.elt_cmd_start = rmesa->radeon.cmdbuf.cs->cdw; 3223fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie 3239df844b109a9d2cc1d3b16315c34ef84f147c5b6Dave Airlie /* round up min_nr to align the state */ 3249df844b109a9d2cc1d3b16315c34ef84f147c5b6Dave Airlie align_min_nr = (min_nr + 1) & ~1; 3259df844b109a9d2cc1d3b16315c34ef84f147c5b6Dave Airlie 3263fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie#if RADEON_OLD_PACKETS 3279df844b109a9d2cc1d3b16315c34ef84f147c5b6Dave Airlie BEGIN_BATCH_NO_AUTOSTATE(2+ELTS_BUFSZ(align_min_nr)/4); 3283fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie OUT_BATCH_PACKET3_CLIP(RADEON_CP_PACKET3_3D_RNDR_GEN_INDX_PRIM, 0); 3293fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie OUT_BATCH_RELOC(rmesa->ioctl.vertex_offset, rmesa->ioctl.bo, rmesa->ioctl.vertex_offset, RADEON_GEM_DOMAIN_GTT, 0, 0); 3303fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie OUT_BATCH(0xffff); 3313fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie OUT_BATCH(vertex_format); 3323fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie OUT_BATCH(primitive | 3333fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie RADEON_CP_VC_CNTL_PRIM_WALK_IND | 3343fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie RADEON_CP_VC_CNTL_COLOR_ORDER_RGBA | 3353fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie RADEON_CP_VC_CNTL_VTX_FMT_RADEON_MODE); 3363fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie 3373fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie#else 3389df844b109a9d2cc1d3b16315c34ef84f147c5b6Dave Airlie BEGIN_BATCH_NO_AUTOSTATE(ELTS_BUFSZ(align_min_nr)/4); 3393fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie OUT_BATCH_PACKET3_CLIP(RADEON_CP_PACKET3_DRAW_INDX, 0); 3403fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie OUT_BATCH(vertex_format); 3413fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie OUT_BATCH(primitive | 3423fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie RADEON_CP_VC_CNTL_PRIM_WALK_IND | 3433fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie RADEON_CP_VC_CNTL_COLOR_ORDER_RGBA | 3443fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie RADEON_CP_VC_CNTL_MAOS_ENABLE | 3453fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie RADEON_CP_VC_CNTL_VTX_FMT_RADEON_MODE); 3463fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie#endif 3473fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie 3483fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie 3493fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie rmesa->tcl.elt_cmd_offset = rmesa->radeon.cmdbuf.cs->cdw; 350ccf7814a315f0be05cdc36ca358e2917a3d4ac19Dave Airlie rmesa->tcl.elt_used = min_nr; 351b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie 3523fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie retval = (GLushort *)(rmesa->radeon.cmdbuf.cs->packets + rmesa->tcl.elt_cmd_offset); 3533fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie 3545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (RADEON_DEBUG & DEBUG_PRIMS) 3553fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie fprintf(stderr, "%s: header prim %x \n", 3563fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie __FUNCTION__, primitive); 3575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3585ba92a5b0543b4ff2c7db6101029ba36cb9843faDave Airlie assert(!rmesa->radeon.dma.flush); 3594637235183b80963536f2364e4d50fcb894886ddDave Airlie rmesa->radeon.glCtx->Driver.NeedFlush |= FLUSH_STORED_VERTICES; 3605ba92a5b0543b4ff2c7db6101029ba36cb9843faDave Airlie rmesa->radeon.dma.flush = radeonFlushElts; 3615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return retval; 3635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 3645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3654637235183b80963536f2364e4d50fcb894886ddDave Airlievoid radeonEmitVertexAOS( r100ContextPtr rmesa, 3665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint vertex_size, 3673fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie struct radeon_bo *bo, 3685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint offset ) 3695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 3705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#if RADEON_OLD_PACKETS 3715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->ioctl.vertex_offset = offset; 3723fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie rmesa->ioctl.bo = bo; 3735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#else 374b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie BATCH_LOCALS(&rmesa->radeon); 3755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (RADEON_DEBUG & (DEBUG_PRIMS|DEBUG_IOCTL)) 3775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fprintf(stderr, "%s: vertex_size 0x%x offset 0x%x \n", 3785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul __FUNCTION__, vertex_size, offset); 3795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3803fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie BEGIN_BATCH(7); 381b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie OUT_BATCH_PACKET3(RADEON_CP_PACKET3_3D_LOAD_VBPNTR, 2); 382b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie OUT_BATCH(1); 383b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie OUT_BATCH(vertex_size | (vertex_size << 8)); 384b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie OUT_BATCH_RELOC(offset, bo, offset, RADEON_GEM_DOMAIN_GTT, 0, 0); 385b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie END_BATCH(); 3863fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie 3875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#endif 3885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 3895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3914637235183b80963536f2364e4d50fcb894886ddDave Airlievoid radeonEmitAOS( r100ContextPtr rmesa, 3925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint nr, 3935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint offset ) 3945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 3955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#if RADEON_OLD_PACKETS 3965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul assert( nr == 1 ); 3973fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie rmesa->ioctl.bo = rmesa->tcl.aos[0].bo; 3985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->ioctl.vertex_offset = 3993fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie (rmesa->tcl.aos[0].offset + offset * rmesa->tcl.aos[0].stride * 4); 4005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#else 4013fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie BATCH_LOCALS(&rmesa->radeon); 4023fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie uint32_t voffset; 4033fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie // int sz = AOS_BUFSZ(nr); 4043fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie int sz = 1 + (nr >> 1) * 3 + (nr & 1) * 2; 4055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int i; 4065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (RADEON_DEBUG & DEBUG_IOCTL) 4085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fprintf(stderr, "%s\n", __FUNCTION__); 4095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4103fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie BEGIN_BATCH(sz+2+(nr * 2)); 4113fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie OUT_BATCH_PACKET3(RADEON_CP_PACKET3_3D_LOAD_VBPNTR, sz - 1); 4123fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie OUT_BATCH(nr); 4133fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie 4143fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie if (!rmesa->radeon.radeonScreen->kernel_mm) { 4153fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie for (i = 0; i + 1 < nr; i += 2) { 4163fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie OUT_BATCH((rmesa->tcl.aos[i].components << 0) | 4173fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie (rmesa->tcl.aos[i].stride << 8) | 4183fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie (rmesa->tcl.aos[i + 1].components << 16) | 4193fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie (rmesa->tcl.aos[i + 1].stride << 24)); 4203fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie 4213fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie voffset = rmesa->tcl.aos[i + 0].offset + 4223fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie offset * 4 * rmesa->tcl.aos[i + 0].stride; 4233fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie OUT_BATCH_RELOC(voffset, 4243fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie rmesa->tcl.aos[i].bo, 4253fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie voffset, 4263fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie RADEON_GEM_DOMAIN_GTT, 4273fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie 0, 0); 4283fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie voffset = rmesa->tcl.aos[i + 1].offset + 4293fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie offset * 4 * rmesa->tcl.aos[i + 1].stride; 4303fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie OUT_BATCH_RELOC(voffset, 4313fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie rmesa->tcl.aos[i+1].bo, 4323fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie voffset, 4333fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie RADEON_GEM_DOMAIN_GTT, 4343fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie 0, 0); 4353fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie } 4363fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie 4373fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie if (nr & 1) { 4383fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie OUT_BATCH((rmesa->tcl.aos[nr - 1].components << 0) | 4393fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie (rmesa->tcl.aos[nr - 1].stride << 8)); 4403fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie voffset = rmesa->tcl.aos[nr - 1].offset + 4413fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie offset * 4 * rmesa->tcl.aos[nr - 1].stride; 4423fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie OUT_BATCH_RELOC(voffset, 4433fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie rmesa->tcl.aos[nr - 1].bo, 4443fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie voffset, 4453fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie RADEON_GEM_DOMAIN_GTT, 4463fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie 0, 0); 4473fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie } 4483fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie } else { 4493fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie for (i = 0; i + 1 < nr; i += 2) { 4503fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie OUT_BATCH((rmesa->tcl.aos[i].components << 0) | 4513fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie (rmesa->tcl.aos[i].stride << 8) | 4523fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie (rmesa->tcl.aos[i + 1].components << 16) | 4533fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie (rmesa->tcl.aos[i + 1].stride << 24)); 4543fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie 4553fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie voffset = rmesa->tcl.aos[i + 0].offset + 4563fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie offset * 4 * rmesa->tcl.aos[i + 0].stride; 4573fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie OUT_BATCH(voffset); 4583fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie voffset = rmesa->tcl.aos[i + 1].offset + 4593fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie offset * 4 * rmesa->tcl.aos[i + 1].stride; 4603fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie OUT_BATCH(voffset); 4613fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie } 4623fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie 4633fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie if (nr & 1) { 4643fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie OUT_BATCH((rmesa->tcl.aos[nr - 1].components << 0) | 4653fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie (rmesa->tcl.aos[nr - 1].stride << 8)); 4663fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie voffset = rmesa->tcl.aos[nr - 1].offset + 4673fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie offset * 4 * rmesa->tcl.aos[nr - 1].stride; 4683fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie OUT_BATCH(voffset); 4695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4703fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie for (i = 0; i + 1 < nr; i += 2) { 4713fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie voffset = rmesa->tcl.aos[i + 0].offset + 4723fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie offset * 4 * rmesa->tcl.aos[i + 0].stride; 4733fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie radeon_cs_write_reloc(rmesa->radeon.cmdbuf.cs, 4743fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie rmesa->tcl.aos[i+0].bo, 4753fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie RADEON_GEM_DOMAIN_GTT, 4763fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie 0, 0); 4773fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie voffset = rmesa->tcl.aos[i + 1].offset + 4783fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie offset * 4 * rmesa->tcl.aos[i + 1].stride; 4793fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie radeon_cs_write_reloc(rmesa->radeon.cmdbuf.cs, 4803fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie rmesa->tcl.aos[i+1].bo, 4813fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie RADEON_GEM_DOMAIN_GTT, 4823fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie 0, 0); 4833fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie } 4843fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie if (nr & 1) { 4853fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie voffset = rmesa->tcl.aos[nr - 1].offset + 4863fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie offset * 4 * rmesa->tcl.aos[nr - 1].stride; 4873fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie radeon_cs_write_reloc(rmesa->radeon.cmdbuf.cs, 4883fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie rmesa->tcl.aos[nr-1].bo, 4893fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie RADEON_GEM_DOMAIN_GTT, 4903fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie 0, 0); 4915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4933fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie END_BATCH(); 4945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#endif 4965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 4975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* ================================================================ 4995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Buffer clear 5005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 5015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RADEON_MAX_CLEARS 256 5025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 503a5676795cfe2e24979b5da65c2f499049ab009d9Brian Paulstatic void radeonClear( GLcontext *ctx, GLbitfield mask ) 5045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 5054637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 5064637235183b80963536f2364e4d50fcb894886ddDave Airlie __DRIdrawablePrivate *dPriv = rmesa->radeon.dri.drawable; 5074637235183b80963536f2364e4d50fcb894886ddDave Airlie drm_radeon_sarea_t *sarea = rmesa->radeon.sarea; 5085a46e176715b0eae7b8a715e8aec42f5a27214fcKeith Whitwell uint32_t clear; 5095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint flags = 0; 5105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint color_mask = 0; 5115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint ret, i; 512446972bc2756cf9770a82f51aa0dc4f529c6cae5Brian Paul GLint cx, cy, cw, ch; 5135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( RADEON_DEBUG & DEBUG_IOCTL ) { 515446972bc2756cf9770a82f51aa0dc4f529c6cae5Brian Paul fprintf( stderr, "radeonClear\n"); 5165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 518ce055c26f08556a46ee8b4b88e5fd15eb4d2acd1Roland Scheidegger { 519d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie LOCK_HARDWARE( &rmesa->radeon ); 520d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie UNLOCK_HARDWARE( &rmesa->radeon ); 521ce055c26f08556a46ee8b4b88e5fd15eb4d2acd1Roland Scheidegger if ( dPriv->numClipRects == 0 ) 522ce055c26f08556a46ee8b4b88e5fd15eb4d2acd1Roland Scheidegger return; 523ce055c26f08556a46ee8b4b88e5fd15eb4d2acd1Roland Scheidegger } 524ce055c26f08556a46ee8b4b88e5fd15eb4d2acd1Roland Scheidegger 5258e3926575264d31b3caacb9cbb606f8f2914f57dRoland Scheidegger radeonFlush( ctx ); 5265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 527e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul if ( mask & BUFFER_BIT_FRONT_LEFT ) { 5285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul flags |= RADEON_FRONT; 5295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul color_mask = rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK]; 530e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul mask &= ~BUFFER_BIT_FRONT_LEFT; 5315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 533e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul if ( mask & BUFFER_BIT_BACK_LEFT ) { 5345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul flags |= RADEON_BACK; 5355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul color_mask = rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK]; 536e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul mask &= ~BUFFER_BIT_BACK_LEFT; 5375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 539e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul if ( mask & BUFFER_BIT_DEPTH ) { 540b31b7836d6e7abf80dd4feacce333d4b1fe6e4abRoland Scheidegger flags |= RADEON_DEPTH; 541e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul mask &= ~BUFFER_BIT_DEPTH; 5425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 544d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie if ( (mask & BUFFER_BIT_STENCIL) && rmesa->radeon.state.stencil.hwBuffer ) { 5455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul flags |= RADEON_STENCIL; 546e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul mask &= ~BUFFER_BIT_STENCIL; 5475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( mask ) { 5505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (RADEON_DEBUG & DEBUG_FALLBACKS) 5515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fprintf(stderr, "%s: swrast clear, mask: %x\n", __FUNCTION__, mask); 552a5676795cfe2e24979b5da65c2f499049ab009d9Brian Paul _swrast_Clear( ctx, mask ); 5535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( !flags ) 5565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 5575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 558b31b7836d6e7abf80dd4feacce333d4b1fe6e4abRoland Scheidegger if (rmesa->using_hyperz) { 559b31b7836d6e7abf80dd4feacce333d4b1fe6e4abRoland Scheidegger flags |= RADEON_USE_COMP_ZBUF; 5604637235183b80963536f2364e4d50fcb894886ddDave Airlie/* if (rmesa->radeon.radeonScreen->chipset & RADEON_CHIPSET_TCL) 561b31b7836d6e7abf80dd4feacce333d4b1fe6e4abRoland Scheidegger flags |= RADEON_USE_HIERZ; */ 562d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie if (!(rmesa->radeon.state.stencil.hwBuffer) || 563b31b7836d6e7abf80dd4feacce333d4b1fe6e4abRoland Scheidegger ((flags & RADEON_DEPTH) && (flags & RADEON_STENCIL) && 564d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie ((rmesa->radeon.state.stencil.clear & RADEON_STENCIL_WRITE_MASK) == RADEON_STENCIL_WRITE_MASK))) { 565b31b7836d6e7abf80dd4feacce333d4b1fe6e4abRoland Scheidegger flags |= RADEON_CLEAR_FASTZ; 566b31b7836d6e7abf80dd4feacce333d4b1fe6e4abRoland Scheidegger } 567b31b7836d6e7abf80dd4feacce333d4b1fe6e4abRoland Scheidegger } 5685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 569d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie LOCK_HARDWARE( &rmesa->radeon ); 5705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 571446972bc2756cf9770a82f51aa0dc4f529c6cae5Brian Paul /* compute region after locking: */ 572446972bc2756cf9770a82f51aa0dc4f529c6cae5Brian Paul cx = ctx->DrawBuffer->_Xmin; 573446972bc2756cf9770a82f51aa0dc4f529c6cae5Brian Paul cy = ctx->DrawBuffer->_Ymin; 574446972bc2756cf9770a82f51aa0dc4f529c6cae5Brian Paul cw = ctx->DrawBuffer->_Xmax - cx; 575446972bc2756cf9770a82f51aa0dc4f529c6cae5Brian Paul ch = ctx->DrawBuffer->_Ymax - cy; 576446972bc2756cf9770a82f51aa0dc4f529c6cae5Brian Paul 577a2104dc6e18879ed3ba2108a09b6779e461eaa17Roland Scheidegger /* Flip top to bottom */ 578a2104dc6e18879ed3ba2108a09b6779e461eaa17Roland Scheidegger cx += dPriv->x; 579a2104dc6e18879ed3ba2108a09b6779e461eaa17Roland Scheidegger cy = dPriv->y + dPriv->h - cy - ch; 580a2104dc6e18879ed3ba2108a09b6779e461eaa17Roland Scheidegger 5815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Throttle the number of clear ioctls we do. 5825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 5835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul while ( 1 ) { 5845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int ret; 585b302419abe96cdb81878913c164d7ae2209ddcdaRoland Scheidegger drm_radeon_getparam_t gp; 5865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 587b302419abe96cdb81878913c164d7ae2209ddcdaRoland Scheidegger gp.param = RADEON_PARAM_LAST_CLEAR; 588b302419abe96cdb81878913c164d7ae2209ddcdaRoland Scheidegger gp.value = (int *)&clear; 5894637235183b80963536f2364e4d50fcb894886ddDave Airlie ret = drmCommandWriteRead( rmesa->radeon.dri.fd, 590b302419abe96cdb81878913c164d7ae2209ddcdaRoland Scheidegger DRM_RADEON_GETPARAM, &gp, sizeof(gp) ); 5915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( ret ) { 593ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl fprintf( stderr, "%s: drm_radeon_getparam_t: %d\n", __FUNCTION__, ret ); 5945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul exit(1); 5955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( sarea->last_clear - clear <= RADEON_MAX_CLEARS ) { 5985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 5995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6014637235183b80963536f2364e4d50fcb894886ddDave Airlie if ( rmesa->radeon.do_usleeps ) { 602d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie UNLOCK_HARDWARE( &rmesa->radeon ); 6035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul DO_USLEEP( 1 ); 604d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie LOCK_HARDWARE( &rmesa->radeon ); 6055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 608626f825bcc91a3068e2e1c68e7467b42826c51eaEric Anholt /* Send current state to the hardware */ 6098fe61fc5ba70be29b9d7dbdfab45c5434be587fcDave Airlie rcommonFlushCmdBufLocked( &rmesa->radeon, __FUNCTION__ ); 610626f825bcc91a3068e2e1c68e7467b42826c51eaEric Anholt 6115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for ( i = 0 ; i < dPriv->numClipRects ; ) { 6125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint nr = MIN2( i + RADEON_NR_SAREA_CLIPRECTS, dPriv->numClipRects ); 613ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl drm_clip_rect_t *box = dPriv->pClipRects; 6144637235183b80963536f2364e4d50fcb894886ddDave Airlie drm_clip_rect_t *b = rmesa->radeon.sarea->boxes; 615ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl drm_radeon_clear_t clear; 616ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl drm_radeon_clear_rect_t depth_boxes[RADEON_NR_SAREA_CLIPRECTS]; 6175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint n = 0; 6185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 619446972bc2756cf9770a82f51aa0dc4f529c6cae5Brian Paul if (cw != dPriv->w || ch != dPriv->h) { 620446972bc2756cf9770a82f51aa0dc4f529c6cae5Brian Paul /* clear subregion */ 6215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for ( ; i < nr ; i++ ) { 6225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint x = box[i].x1; 6235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint y = box[i].y1; 6245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint w = box[i].x2 - x; 6255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint h = box[i].y2 - y; 6265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( x < cx ) w -= cx - x, x = cx; 6285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( y < cy ) h -= cy - y, y = cy; 6295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( x + w > cx + cw ) w = cx + cw - x; 6305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( y + h > cy + ch ) h = cy + ch - y; 6315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( w <= 0 ) continue; 6325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( h <= 0 ) continue; 6335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b->x1 = x; 6355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b->y1 = y; 6365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b->x2 = x + w; 6375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b->y2 = y + h; 6385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b++; 6395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul n++; 6405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 642446972bc2756cf9770a82f51aa0dc4f529c6cae5Brian Paul /* clear whole buffer */ 6435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for ( ; i < nr ; i++ ) { 6445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *b++ = box[i]; 6455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul n++; 6465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6494637235183b80963536f2364e4d50fcb894886ddDave Airlie rmesa->radeon.sarea->nbox = n; 6505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul clear.flags = flags; 652d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie clear.clear_color = rmesa->radeon.state.color.clear; 653d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie clear.clear_depth = rmesa->radeon.state.depth.clear; 6545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul clear.color_mask = rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK]; 655d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie clear.depth_mask = rmesa->radeon.state.stencil.clear; 6565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul clear.depth_boxes = depth_boxes; 6575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul n--; 6594637235183b80963536f2364e4d50fcb894886ddDave Airlie b = rmesa->radeon.sarea->boxes; 6605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for ( ; n >= 0 ; n-- ) { 661ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl depth_boxes[n].f[CLEAR_X1] = (float)b[n].x1; 662ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl depth_boxes[n].f[CLEAR_Y1] = (float)b[n].y1; 663ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl depth_boxes[n].f[CLEAR_X2] = (float)b[n].x2; 664ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl depth_boxes[n].f[CLEAR_Y2] = (float)b[n].y2; 665ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl depth_boxes[n].f[CLEAR_DEPTH] = 666d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie (float)rmesa->radeon.state.depth.clear; 6675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6694637235183b80963536f2364e4d50fcb894886ddDave Airlie ret = drmCommandWrite( rmesa->radeon.dri.fd, DRM_RADEON_CLEAR, 670ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl &clear, sizeof(drm_radeon_clear_t)); 6715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( ret ) { 673d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie UNLOCK_HARDWARE( &rmesa->radeon ); 6745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fprintf( stderr, "DRM_RADEON_CLEAR: return = %d\n", ret ); 6755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul exit( 1 ); 6765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 679d29e96bf33e91d071770b86d87ffc4ef4dfc2f70Dave Airlie UNLOCK_HARDWARE( &rmesa->radeon ); 6805562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt rmesa->hw.all_dirty = GL_TRUE; 6815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 6825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonFlush( GLcontext *ctx ) 6845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 6854637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT( ctx ); 6865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (RADEON_DEBUG & DEBUG_IOCTL) 6885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fprintf(stderr, "%s\n", __FUNCTION__); 6895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 69059b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie if (rmesa->radeon.dma.flush) 69136d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie rmesa->radeon.dma.flush( ctx ); 6925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6935562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt radeonEmitState( rmesa ); 6945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 69536d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie if (rmesa->radeon.cmdbuf.cs->cdw) 69636d3f3e74a809ad346e981805a2f61710d3a380bDave Airlie rcommonFlushCmdBuf( &rmesa->radeon, __FUNCTION__ ); 6975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 6985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Make sure all commands have been sent to the hardware and have 7005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * completed processing. 7015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 7025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonFinish( GLcontext *ctx ) 7035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 7045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonFlush( ctx ); 7057e5e327cea83d9f6d1485f9be440277540ace5c7Dave Airlie radeon_common_finish(ctx); 7065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 7075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonInitIoctlFuncs( GLcontext *ctx ) 7105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 7115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.Clear = radeonClear; 7125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.Finish = radeonFinish; 7135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Driver.Flush = radeonFlush; 7145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 7155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 716