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