/* $XFree86: xc/lib/GL/mesa/src/drv/r128/r128_tris.h,v 1.8 2002/10/30 12:51:43 alanh Exp $ */
/**************************************************************************

Copyright 2003 Eric Anholt
All Rights Reserved.

Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
on the rights to use, copy, modify, merge, publish, distribute, sub
license, and/or sell copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice (including the next
paragraph) shall be included in all copies or substantial portions of the
Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
ERIC ANHOLT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

**************************************************************************/

/*
 * Authors:
 *    Eric Anholt <anholt@FreeBSD.org>
 */

#ifndef __SIS_TRIS_H__
#define __SIS_TRIS_H__

#include "sis_lock.h"
#include "mtypes.h"

extern void sisInitTriFuncs( GLcontext *ctx );
extern void sisFlushPrims( sisContextPtr smesa );
extern void sisFlushPrimsLocked( sisContextPtr smesa );
extern void sisFallback( GLcontext *ctx, GLuint bit, GLboolean mode );

#define FALLBACK( smesa, bit, mode ) sisFallback( smesa->glCtx, bit, mode )

#define SIS_FIREVERTICES(smesa)				\
do {							\
   if (smesa->vb_cur != smesa->vb_last)			\
      sisFlushPrims(smesa);				\
} while (0)

static INLINE GLuint *sisAllocDmaLow(sisContextPtr smesa, int bytes)
{
   GLuint *start;

   if (smesa->vb_cur + bytes >= smesa->vb_end) {
      LOCK_HARDWARE();
      sisFlushPrimsLocked(smesa);
      if (smesa->using_agp) {
	 WaitEngIdle(smesa);
	 smesa->vb_cur = smesa->vb;
	 smesa->vb_last = smesa->vb_cur;
      }
      UNLOCK_HARDWARE();
   }

   start = (GLuint *)smesa->vb_cur;
   smesa->vb_cur += bytes;
   return start;
}

#endif /* __SIS_TRIS_H__ */
