radeon_swtcl.c revision ecadb51bbcb972a79f3ed79e65a7986b9396e757
1bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl/* $XFree86: xc/lib/GL/mesa/src/drv/radeon/radeon_swtcl.c,v 1.6 2003/05/06 23:52:08 daenzer Exp $ */
25df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**************************************************************************
35df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
45df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulCopyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and
55df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                     VA Linux Systems Inc., Fremont, California.
65df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
75df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulAll Rights Reserved.
85df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
95df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulPermission is hereby granted, free of charge, to any person obtaining
105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paula copy of this software and associated documentation files (the
115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul"Software"), to deal in the Software without restriction, including
125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulwithout limitation the rights to use, copy, modify, merge, publish,
135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Pauldistribute, sublicense, and/or sell copies of the Software, and to
145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulpermit persons to whom the Software is furnished to do so, subject to
155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulthe following conditions:
165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulThe above copyright notice and this permission notice (including the
185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulnext paragraph) shall be included in all copies or substantial
195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulportions of the Software.
205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulIN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul**************************************************************************/
305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*
325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Authors:
335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *   Keith Whitwell <keith@tungstengraphics.com>
345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
36ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/glheader.h"
37ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/mtypes.h"
38ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/colormac.h"
39ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/enums.h"
40ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/imports.h"
41ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/macros.h"
425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "swrast_setup/swrast_setup.h"
445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "math/m_translate.h"
455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/tnl.h"
465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/t_context.h"
475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/t_pipeline.h"
485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_context.h"
505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_ioctl.h"
515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_state.h"
525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_swtcl.h"
535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_tcl.h"
545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void flush_last_swtcl_prim( radeonContextPtr rmesa  );
575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
588a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt/* R100: xyzw, c0, c1/fog, stq[0..2]  = 4+1+1+3*3 = 15  right? */
598a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt/* R200: xyzw, c0, c1/fog, strq[0..5] = 4+1+1+4*6 = 30 */
608a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define RADEON_MAX_TNL_VERTEX_SIZE (15 * sizeof(GLfloat))	/* for mesa _tnl stage */
615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/***********************************************************************
638a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt *                         Initialization
645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/
655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
668a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define EMIT_ATTR( ATTR, STYLE, F0 )					\
678a1df968627de01d04f3d692fd81108ba6492c18Eric Anholtdo {									\
688a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   rmesa->swtcl.vertex_attrs[rmesa->swtcl.vertex_attr_count].attrib = (ATTR);	\
698a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   rmesa->swtcl.vertex_attrs[rmesa->swtcl.vertex_attr_count].format = (STYLE);	\
708a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   rmesa->swtcl.vertex_attr_count++;					\
718a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   fmt_0 |= F0;								\
728a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt} while (0)
735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
748a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define EMIT_PAD( N )							\
758a1df968627de01d04f3d692fd81108ba6492c18Eric Anholtdo {									\
768a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   rmesa->swtcl.vertex_attrs[rmesa->swtcl.vertex_attr_count].attrib = 0;		\
778a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   rmesa->swtcl.vertex_attrs[rmesa->swtcl.vertex_attr_count].format = EMIT_PAD;	\
788a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   rmesa->swtcl.vertex_attrs[rmesa->swtcl.vertex_attr_count].offset = (N);		\
798a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   rmesa->swtcl.vertex_attr_count++;					\
808a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt} while (0)
815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
828a1df968627de01d04f3d692fd81108ba6492c18Eric Anholtstatic GLuint radeon_cp_vc_frmts[3][2] =
838a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt{
848a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   { RADEON_CP_VC_FRMT_ST0, RADEON_CP_VC_FRMT_ST0 | RADEON_CP_VC_FRMT_Q0 },
858a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   { RADEON_CP_VC_FRMT_ST1, RADEON_CP_VC_FRMT_ST1 | RADEON_CP_VC_FRMT_Q1 },
868a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   { RADEON_CP_VC_FRMT_ST2, RADEON_CP_VC_FRMT_ST2 | RADEON_CP_VC_FRMT_Q2 },
878a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt};
885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
898a1df968627de01d04f3d692fd81108ba6492c18Eric Anholtstatic void radeonSetVertexFormat( GLcontext *ctx )
908a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt{
918a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   radeonContextPtr rmesa = RADEON_CONTEXT( ctx );
928a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   TNLcontext *tnl = TNL_CONTEXT(ctx);
938a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   struct vertex_buffer *VB = &tnl->vb;
94bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol   DECLARE_RENDERINPUTS(index_bitset);
958a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   int fmt_0 = 0;
968a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   int offset = 0;
975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
98bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol   RENDERINPUTS_COPY( index_bitset, tnl->render_inputs_bitset );
995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1008a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   /* Important:
1018a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt    */
1028a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   if ( VB->NdcPtr != NULL ) {
1038a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      VB->AttribPtr[VERT_ATTRIB_POS] = VB->NdcPtr;
1048a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
1058a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   else {
1068a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      VB->AttribPtr[VERT_ATTRIB_POS] = VB->ClipPtr;
1078a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
1085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1098a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   assert( VB->AttribPtr[VERT_ATTRIB_POS] != NULL );
1108a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   rmesa->swtcl.vertex_attr_count = 0;
1118a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
1128a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   /* EMIT_ATTR's must be in order as they tell t_vertex.c how to
1138a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt    * build up a hardware vertex.
1148a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt    */
1158a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   if ( !rmesa->swtcl.needproj ||
116bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol        RENDERINPUTS_TEST_RANGE( index_bitset, _TNL_FIRST_TEX, _TNL_LAST_TEX )) {	/* for projtex */
1178a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_4F,
1188a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt		 RADEON_CP_VC_FRMT_XY |	RADEON_CP_VC_FRMT_Z | RADEON_CP_VC_FRMT_W0 );
1198a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      offset = 4;
1208a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
1218a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   else {
1228a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_3F,
1238a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt		 RADEON_CP_VC_FRMT_XY |	RADEON_CP_VC_FRMT_Z );
1248a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      offset = 3;
1258a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
1265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1278a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   rmesa->swtcl.coloroffset = offset;
1288a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#if MESA_LITTLE_ENDIAN
1298a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   EMIT_ATTR( _TNL_ATTRIB_COLOR0, EMIT_4UB_4F_RGBA,
1308a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	      RADEON_CP_VC_FRMT_PKCOLOR );
1318a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#else
1328a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   EMIT_ATTR( _TNL_ATTRIB_COLOR0, EMIT_4UB_4F_ABGR,
1338a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	      RADEON_CP_VC_FRMT_PKCOLOR );
1348a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#endif
1358a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   offset += 1;
1365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1378a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   rmesa->swtcl.specoffset = 0;
138bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol   if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_COLOR1 ) ||
139bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol       RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_FOG )) {
1405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1418a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#if MESA_LITTLE_ENDIAN
142bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol      if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_COLOR1 )) {
1438a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 rmesa->swtcl.specoffset = offset;
1448a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_ATTR( _TNL_ATTRIB_COLOR1, EMIT_3UB_3F_RGB,
1458a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 	    RADEON_CP_VC_FRMT_PKSPEC );
1468a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1478a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      else {
1488a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_PAD( 3 );
1498a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
151bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol      if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_FOG )) {
1528a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_ATTR( _TNL_ATTRIB_FOG, EMIT_1UB_1F,
1538a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 	    RADEON_CP_VC_FRMT_PKSPEC );
1548a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1558a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      else {
1568a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_PAD( 1 );
1578a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1588a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#else
159bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol      if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_FOG )) {
1608a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_ATTR( _TNL_ATTRIB_FOG, EMIT_1UB_1F,
1618a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 	    RADEON_CP_VC_FRMT_PKSPEC );
1628a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1638a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      else {
1648a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_PAD( 1 );
1658a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
167bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol      if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_COLOR1 )) {
1688a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 rmesa->swtcl.specoffset = offset;
1698a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_ATTR( _TNL_ATTRIB_COLOR1, EMIT_3UB_3F_BGR,
1708a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 	    RADEON_CP_VC_FRMT_PKSPEC );
1718a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1728a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      else {
1738a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_PAD( 3 );
1748a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1758a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#endif
1768a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
1775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
178bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol   if (RENDERINPUTS_TEST_RANGE( index_bitset, _TNL_FIRST_TEX, _TNL_LAST_TEX )) {
1798a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      int i;
1808a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
1818a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
182bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol	 if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX(i) )) {
1838a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    GLuint sz = VB->TexCoordPtr[i]->size;
1848a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
1858a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    switch (sz) {
1868a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    case 1:
1878a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    case 2:
1888a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	       EMIT_ATTR( _TNL_ATTRIB_TEX0+i, EMIT_2F,
1898a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt			  radeon_cp_vc_frmts[i][0] );
1908a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	       break;
191247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	    case 3:
1928a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    case 4:
193247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	       if (ctx->Texture.Unit[i]._ReallyEnabled & (TEXTURE_CUBE_BIT) ) {
194247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger		  EMIT_ATTR( _TNL_ATTRIB_TEX0+i, EMIT_3F,
195247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger			     radeon_cp_vc_frmts[i][1] );
196247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	       } else {
197247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger		  EMIT_ATTR( _TNL_ATTRIB_TEX0+i, EMIT_3F_XYW,
198247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger			     radeon_cp_vc_frmts[i][1] );
199247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	       }
2008a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	       break;
2018a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    default:
2028a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	       continue;
2038a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    };
2048a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 }
2058a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
2068a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
2075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
208bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol   if (!RENDERINPUTS_EQUAL( rmesa->tnl_index_bitset, index_bitset ) ||
2098a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	fmt_0 != rmesa->swtcl.vertex_format) {
2108a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      RADEON_NEWPRIM(rmesa);
2118a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      rmesa->swtcl.vertex_format = fmt_0;
2128a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      rmesa->swtcl.vertex_size =
2138a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	  _tnl_install_attrs( ctx,
2148a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt			      rmesa->swtcl.vertex_attrs,
2158a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt			      rmesa->swtcl.vertex_attr_count,
2168a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt			      NULL, 0 );
2178a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      rmesa->swtcl.vertex_size /= 4;
218bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol      RENDERINPUTS_COPY( rmesa->tnl_index_bitset, index_bitset );
2198a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      if (RADEON_DEBUG & DEBUG_VERTS)
2208a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 fprintf( stderr, "%s: vertex_size= %d floats\n",
2218a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt		  __FUNCTION__, rmesa->swtcl.vertex_size);
2228a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
2235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonRenderStart( GLcontext *ctx )
2275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
2285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT( ctx );
2295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2308a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   radeonSetVertexFormat( ctx );
2315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (rmesa->dma.flush != 0 &&
2335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       rmesa->dma.flush != flush_last_swtcl_prim)
2345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->dma.flush( rmesa );
2355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2388a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt/**
2398a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt * Set vertex state for SW TCL.  The primary purpose of this function is to
2408a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt * determine in advance whether or not the hardware can / should do the
2418a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt * projection divide or Mesa should do it.
2428a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt */
2435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonChooseVertexState( GLcontext *ctx )
2445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
2455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT( ctx );
2465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNLcontext *tnl = TNL_CONTEXT(ctx);
2475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
24825847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger   GLuint se_coord_fmt = rmesa->hw.set.cmd[SET_SE_COORDFMT];
24925847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger
25025847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger   se_coord_fmt &= ~(RADEON_VTX_XY_PRE_MULT_1_OVER_W0 |
25125847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger		     RADEON_VTX_Z_PRE_MULT_1_OVER_W0 |
25225847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger		     RADEON_VTX_W0_IS_NOT_1_OVER_W0);
2535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2543f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt   /* We must ensure that we don't do _tnl_need_projected_coords while in a
2553f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt    * rasterization fallback.  As this function will be called again when we
2563f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt    * leave a rasterization fallback, we can just skip it for now.
2573f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt    */
2583f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt   if (rmesa->Fallback != 0)
2593f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt      return;
2603f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt
2618a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   /* HW perspective divide is a win, but tiny vertex formats are a
2628a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt    * bigger one.
2638a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt    */
2645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
265bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol   if ((!RENDERINPUTS_TEST_RANGE( tnl->render_inputs_bitset, _TNL_FIRST_TEX, _TNL_LAST_TEX ) &&
266bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol       !RENDERINPUTS_TEST( tnl->render_inputs_bitset, _TNL_ATTRIB_COLOR1 ))
267bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol       || (ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED))) {
2688a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      rmesa->swtcl.needproj = GL_TRUE;
26925847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger      se_coord_fmt |= (RADEON_VTX_XY_PRE_MULT_1_OVER_W0 |
27025847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger		      RADEON_VTX_Z_PRE_MULT_1_OVER_W0);
2715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else {
2738a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      rmesa->swtcl.needproj = GL_FALSE;
27425847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger      se_coord_fmt |= (RADEON_VTX_W0_IS_NOT_1_OVER_W0);
2755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2778a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   _tnl_need_projected_coords( ctx, rmesa->swtcl.needproj );
2785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2798a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   if ( se_coord_fmt != rmesa->hw.set.cmd[SET_SE_COORDFMT] ) {
2808a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      RADEON_STATECHANGE( rmesa, set );
2818a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      rmesa->hw.set.cmd[SET_SE_COORDFMT] = se_coord_fmt;
2825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Flush vertices in the current dma region.
2875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
2885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void flush_last_swtcl_prim( radeonContextPtr rmesa  )
2895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
2905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (RADEON_DEBUG & DEBUG_IOCTL)
2915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "%s\n", __FUNCTION__);
2925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2932c28dd892cfb43445d7e54df8b6a8331192f4e99Brian Paul   rmesa->dma.flush = NULL;
2945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (rmesa->dma.current.buf) {
2965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      struct radeon_dma_region *current = &rmesa->dma.current;
297bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl      GLuint current_offset = (rmesa->radeonScreen->gart_buffer_offset +
2985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			       current->buf->buf->idx * RADEON_BUFFER_SIZE +
2995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			       current->start);
3005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      assert (!(rmesa->swtcl.hw_primitive & RADEON_CP_VC_CNTL_PRIM_WALK_IND));
3025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      assert (current->start +
3045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      rmesa->swtcl.numverts * rmesa->swtcl.vertex_size * 4 ==
3055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      current->ptr);
3065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (rmesa->dma.current.start != rmesa->dma.current.ptr) {
3086f3cc6a5226fd4b5d44cca91e2f76216ecaff831Eric Anholt	 radeonEnsureCmdBufSpace( rmesa, VERT_AOS_BUFSZ +
3096f3cc6a5226fd4b5d44cca91e2f76216ecaff831Eric Anholt			          rmesa->hw.max_state_size + VBUF_BUFSZ );
3102962f88189c46e0bfe3fc33a1d46be9409cb9c10Eric Anholt
3115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 radeonEmitVertexAOS( rmesa,
3125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			      rmesa->swtcl.vertex_size,
3135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			      current_offset);
3145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 radeonEmitVbufPrim( rmesa,
3165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     rmesa->swtcl.vertex_format,
3175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     rmesa->swtcl.hw_primitive,
3185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     rmesa->swtcl.numverts);
3195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
3205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->swtcl.numverts = 0;
3225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      current->start = current->ptr;
3235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Alloc space in the current dma region.
3285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
3298e5479c7f806ffd57eed26c147e3ca227a39f0a7Brian Paulstatic INLINE void *
3308e5479c7f806ffd57eed26c147e3ca227a39f0a7Brian PaulradeonAllocDmaLowVerts( radeonContextPtr rmesa, int nverts, int vsize )
3315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
3325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint bytes = vsize * nverts;
3335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( rmesa->dma.current.ptr + bytes > rmesa->dma.current.end )
3355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonRefillCurrentDmaRegion( rmesa );
3365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (!rmesa->dma.flush) {
3385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->glCtx->Driver.NeedFlush |= FLUSH_STORED_VERTICES;
339bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl      rmesa->dma.flush = flush_last_swtcl_prim;
3405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   assert( vsize == rmesa->swtcl.vertex_size * 4 );
343bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl   assert( rmesa->dma.flush == flush_last_swtcl_prim );
3445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   assert (rmesa->dma.current.start +
3455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	   rmesa->swtcl.numverts * rmesa->swtcl.vertex_size * 4 ==
3465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	   rmesa->dma.current.ptr);
3475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
350bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl      GLubyte *head = (GLubyte *)(rmesa->dma.current.address + rmesa->dma.current.ptr);
3515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->dma.current.ptr += bytes;
3525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->swtcl.numverts += nverts;
3535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return head;
3545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*
3605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Render unclipped vertex buffers by emitting vertices directly to
3615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * dma buffers.  Use strip/fan hardware primitives where possible.
3625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Try to simulate missing primitives with indexed vertices.
3635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
3645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_POINTS      1
3655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_LINES       1
3665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_LINE_STRIPS 1
3675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_TRIANGLES   1
3685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_TRI_STRIPS  1
3695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_TRI_STRIP_1 0
3705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_TRI_FANS    1
3715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_QUADS       0
3725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_QUAD_STRIPS 0
3735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_POLYGONS    0
3748a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt/* \todo: is it possible to make "ELTS" work with t_vertex code ? */
3758a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define HAVE_ELTS        0
3765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic const GLuint hw_prim[GL_POLYGON+1] = {
3785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_POINT,
3795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_LINE,
3805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   0,
3815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_LINE_STRIP,
3825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
3835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_STRIP,
3845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_FAN,
3855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   0,
3865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   0,
3875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   0
3885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
3895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3908e5479c7f806ffd57eed26c147e3ca227a39f0a7Brian Paulstatic INLINE void
3918e5479c7f806ffd57eed26c147e3ca227a39f0a7Brian PaulradeonDmaPrimitive( radeonContextPtr rmesa, GLenum prim )
3925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
3935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_NEWPRIM( rmesa );
3945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->swtcl.hw_primitive = hw_prim[prim];
3955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   assert(rmesa->dma.current.ptr == rmesa->dma.current.start);
3965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
398ffec105109f5b16bfe8282bd477d4aa32b550015Brian Paul#define LOCAL_VARS radeonContextPtr rmesa = RADEON_CONTEXT(ctx)
3995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define INIT( prim ) radeonDmaPrimitive( rmesa, prim )
4002dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell#define FLUSH()  RADEON_NEWPRIM( rmesa )
4015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define GET_CURRENT_VB_MAX_VERTS() \
4025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  (((int)rmesa->dma.current.end - (int)rmesa->dma.current.ptr) / (rmesa->swtcl.vertex_size*4))
4035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define GET_SUBSEQUENT_VB_MAX_VERTS() \
4045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  ((RADEON_BUFFER_SIZE) / (rmesa->swtcl.vertex_size*4))
4052dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell#define ALLOC_VERTS( nr ) \
4062dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell  radeonAllocDmaLowVerts( rmesa, nr, rmesa->swtcl.vertex_size * 4 )
4072dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell#define EMIT_VERTS( ctx, j, nr, buf ) \
4088a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt  _tnl_emit_vertices_to_buffer(ctx, j, (j)+(nr), buf)
4092dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell
4105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) radeon_dma_##x
4115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_dmatmp.h"
4125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
4155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*                          Render pipeline stage                     */
4165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
4175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic GLboolean radeon_run_render( GLcontext *ctx,
42057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell				    struct tnl_pipeline_stage *stage )
4215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
4235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNLcontext *tnl = TNL_CONTEXT(ctx);
4245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   struct vertex_buffer *VB = &tnl->vb;
4253d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_render_func *tab = TAG(render_tab_verts);
4268592ba94b85b3f0f93ae875eece259b4626a6759Keith Whitwell   GLuint i;
4275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
428bf87f864934e174b3493592d5d107f012aac0842Keith Whitwell   if (rmesa->swtcl.indexed_verts.buf)
4295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RELEASE_ELT_VERTS();
4305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4312dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell   if (rmesa->swtcl.RenderIndex != 0 ||
4322dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell       !radeon_dma_validate_render( ctx, VB ))
4335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return GL_TRUE;
4345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.Start( ctx );
4365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
43757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   for (i = 0 ; i < VB->PrimitiveCount ; i++)
4385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
43957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      GLuint prim = VB->Primitive[i].mode;
44057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      GLuint start = VB->Primitive[i].start;
44157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      GLuint length = VB->Primitive[i].count;
44257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
44357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      if (!length)
44457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 continue;
4455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (RADEON_DEBUG & DEBUG_PRIMS)
4472dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell	 fprintf(stderr, "radeon_render.c: prim %s %d..%d\n",
44857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell		 _mesa_lookup_enum_by_nr(prim & PRIM_MODE_MASK),
44957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell		 start, start+length);
4505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (length)
4528592ba94b85b3f0f93ae875eece259b4626a6759Keith Whitwell	 tab[prim & PRIM_MODE_MASK]( ctx, start, start + length, prim );
4535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.Finish( ctx );
4565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return GL_FALSE;		/* finished the pipe */
4585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
46257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwellconst struct tnl_pipeline_stage _radeon_render_stage =
4635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "radeon render",
465bf87f864934e174b3493592d5d107f012aac0842Keith Whitwell   NULL,
466bf87f864934e174b3493592d5d107f012aac0842Keith Whitwell   NULL,
467bf87f864934e174b3493592d5d107f012aac0842Keith Whitwell   NULL,
468bf87f864934e174b3493592d5d107f012aac0842Keith Whitwell   NULL,
4695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeon_run_render		/* run */
4705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
4715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**************************************************************************/
4745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic const GLuint reduced_hw_prim[GL_POLYGON+1] = {
4775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_POINT,
4785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_LINE,
4795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_LINE,
4805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_LINE,
4815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
4825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
4835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
4845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
4855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
4865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST
4875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
4885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonRasterPrimitive( GLcontext *ctx, GLuint hwprim );
4905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonRenderPrimitive( GLcontext *ctx, GLenum prim );
4915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonResetLineStipple( GLcontext *ctx );
4925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/***********************************************************************
4955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *                    Emit primitives as inline vertices               *
4965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/
4975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef LOCAL_VARS
4992dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell#undef ALLOC_VERTS
5005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define CTX_ARG radeonContextPtr rmesa
5015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define GET_VERTEX_DWORDS() rmesa->swtcl.vertex_size
5028a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define ALLOC_VERTS( n, size ) radeonAllocDmaLowVerts( rmesa, n, (size) * 4 )
5035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef LOCAL_VARS
5045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define LOCAL_VARS						\
5055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);		\
5065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   const char *radeonverts = (char *)rmesa->swtcl.verts;
5078a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define VERT(x) (radeonVertex *)(radeonverts + ((x) * (vertsize) * sizeof(int)))
5085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERTEX radeonVertex
5095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef TAG
5105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) radeon_##x
5115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_triemit.h"
5125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/***********************************************************************
5155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *          Macros for t_dd_tritmp.h to draw basic primitives          *
5165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/
5175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define QUAD( a, b, c, d ) radeon_quad( rmesa, a, b, c, d )
5195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TRI( a, b, c )     radeon_triangle( rmesa, a, b, c )
5205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define LINE( a, b )       radeon_line( rmesa, a, b )
5215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define POINT( a )         radeon_point( rmesa, a )
5225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/***********************************************************************
5245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *              Build render functions from dd templates               *
5255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/
5265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RADEON_TWOSIDE_BIT	0x01
5285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RADEON_UNFILLED_BIT	0x02
52930daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger#define RADEON_MAX_TRIFUNC	0x04
5305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic struct {
5333d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_points_func	        points;
5343d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_line_func		line;
5353d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_triangle_func	triangle;
5363d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_quad_func		quad;
5375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} rast_tab[RADEON_MAX_TRIFUNC];
5385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_FALLBACK  0
541bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl#define DO_OFFSET    0
5425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_UNFILLED (IND & RADEON_UNFILLED_BIT)
5435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_TWOSIDE  (IND & RADEON_TWOSIDE_BIT)
5445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_FLAT      0
5455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_TRI       1
5465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_QUAD      1
5475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_LINE      1
5485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_POINTS    1
5495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_FULL_QUAD 1
5505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_RGBA   1
5525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_SPEC   1
5535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_BACK_COLORS  0
5545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_HW_FLATSHADE 1
5555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAB rast_tab
5565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DEPTH_SCALE 1.0
5585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define UNFILLED_TRI unfilled_tri
5595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define UNFILLED_QUAD unfilled_quad
5605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERT_X(_v) _v->v.x
5615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERT_Y(_v) _v->v.y
5625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERT_Z(_v) _v->v.z
5635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define AREA_IS_CCW( a ) (a < 0)
5648a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define GET_VERTEX(e) (rmesa->swtcl.verts + ((e) * rmesa->swtcl.vertex_size * sizeof(int)))
5655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
566c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell#define VERT_SET_RGBA( v, c )  					\
567c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwelldo {								\
568c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   radeon_color_t *color = (radeon_color_t *)&((v)->ui[coloroffset]);	\
569c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   UNCLAMPED_FLOAT_TO_UBYTE(color->red, (c)[0]);		\
570c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   UNCLAMPED_FLOAT_TO_UBYTE(color->green, (c)[1]);		\
571c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   UNCLAMPED_FLOAT_TO_UBYTE(color->blue, (c)[2]);		\
572c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   UNCLAMPED_FLOAT_TO_UBYTE(color->alpha, (c)[3]);		\
573c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell} while (0)
574c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell
5755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERT_COPY_RGBA( v0, v1 ) v0->ui[coloroffset] = v1->ui[coloroffset]
576c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell
5778a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define VERT_SET_SPEC( v, c )					\
578c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwelldo {								\
5798a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   if (specoffset) {						\
5808a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      radeon_color_t *spec = (radeon_color_t *)&((v)->ui[specoffset]);	\
5818a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      UNCLAMPED_FLOAT_TO_UBYTE(spec->red, (c)[0]);	\
5828a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      UNCLAMPED_FLOAT_TO_UBYTE(spec->green, (c)[1]);	\
5838a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      UNCLAMPED_FLOAT_TO_UBYTE(spec->blue, (c)[2]);	\
584c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   }								\
585c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell} while (0)
586c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell#define VERT_COPY_SPEC( v0, v1 )			\
587c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwelldo {							\
5888a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   if (specoffset) {					\
5898a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      radeon_color_t *spec0 = (radeon_color_t *)&((v0)->ui[specoffset]);	\
5908a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      radeon_color_t *spec1 = (radeon_color_t *)&((v1)->ui[specoffset]);	\
5918a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      spec0->red   = spec1->red;	\
5928a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      spec0->green = spec1->green;	\
5938a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      spec0->blue  = spec1->blue; 	\
594c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   }							\
595c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell} while (0)
596c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell
597c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell/* These don't need LE32_TO_CPU() as they used to save and restore
598c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell * colors which are already in the correct format.
599c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell */
600c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell#define VERT_SAVE_RGBA( idx )    color[idx] = v[idx]->ui[coloroffset]
601c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell#define VERT_RESTORE_RGBA( idx ) v[idx]->ui[coloroffset] = color[idx]
6028a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define VERT_SAVE_SPEC( idx )    if (specoffset) spec[idx] = v[idx]->ui[specoffset]
6038a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define VERT_RESTORE_SPEC( idx ) if (specoffset) v[idx]->ui[specoffset] = spec[idx]
6045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef LOCAL_VARS
6065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef TAG
6075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef INIT
6085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define LOCAL_VARS(n)							\
6105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);			\
6115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint color[n], spec[n];						\
6128a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   GLuint coloroffset = rmesa->swtcl.coloroffset;	\
6138a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   GLuint specoffset = rmesa->swtcl.specoffset;			\
6148a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   (void) color; (void) spec; (void) coloroffset; (void) specoffset;
6155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/***********************************************************************
6175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *                Helpers for rendering unfilled primitives            *
6185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/
6195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RASTERIZE(x) radeonRasterPrimitive( ctx, reduced_hw_prim[x] )
6215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RENDER_PRIMITIVE rmesa->swtcl.render_primitive
6225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef TAG
6235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x
6245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_unfilled.h"
6255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef IND
6265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/***********************************************************************
6295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *                      Generate GL render functions                   *
6305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/
6315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define IND (0)
6345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x
6355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_tritmp.h"
6365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define IND (RADEON_TWOSIDE_BIT)
6385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x##_twoside
6395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_tritmp.h"
6405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define IND (RADEON_UNFILLED_BIT)
6425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x##_unfilled
6435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_tritmp.h"
6445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define IND (RADEON_TWOSIDE_BIT|RADEON_UNFILLED_BIT)
6465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x##_twoside_unfilled
6475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_tritmp.h"
6485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void init_rast_tab( void )
6515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
6525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   init();
6535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   init_twoside();
6545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   init_unfilled();
6555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   init_twoside_unfilled();
6565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
6575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
6595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*               Render unclipped begin/end objects                   */
6605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
6615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RENDER_POINTS( start, count )		\
6635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   for ( ; start < count ; start++)		\
6645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeon_point( rmesa, VERT(start) )
6655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RENDER_LINE( v0, v1 ) \
6665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeon_line( rmesa, VERT(v0), VERT(v1) )
6675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RENDER_TRI( v0, v1, v2 )  \
6685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeon_triangle( rmesa, VERT(v0), VERT(v1), VERT(v2) )
6695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RENDER_QUAD( v0, v1, v2, v3 ) \
6705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeon_quad( rmesa, VERT(v0), VERT(v1), VERT(v2), VERT(v3) )
6715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef INIT
6725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define INIT(x) do {					\
6735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonRenderPrimitive( ctx, x );			\
6745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} while (0)
6755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef LOCAL_VARS
6765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define LOCAL_VARS						\
6775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);		\
6782dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell   const GLuint vertsize = rmesa->swtcl.vertex_size;		\
6795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   const char *radeonverts = (char *)rmesa->swtcl.verts;		\
6805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   const GLuint * const elt = TNL_CONTEXT(ctx)->vb.Elts;	\
6815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   const GLboolean stipple = ctx->Line.StippleFlag;		\
6825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   (void) elt; (void) stipple;
6835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RESET_STIPPLE	if ( stipple ) radeonResetLineStipple( ctx );
6845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RESET_OCCLUSION
6855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define PRESERVE_VB_DEFS
6865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define ELT(x) (x)
6875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) radeon_##x##_verts
6885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/t_vb_rendertmp.h"
6895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef ELT
6905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef TAG
6915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) radeon_##x##_elts
6925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define ELT(x) elt[x]
6935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/t_vb_rendertmp.h"
6945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
6985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*                    Choose render functions                         */
6995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
7005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonChooseRenderState( GLcontext *ctx )
7025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNLcontext *tnl = TNL_CONTEXT(ctx);
7045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
7055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint index = 0;
7065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint flags = ctx->_TriangleCaps;
7075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (!rmesa->TclFallback || rmesa->Fallback)
7095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
7105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (flags & DD_TRI_LIGHT_TWOSIDE) index |= RADEON_TWOSIDE_BIT;
7125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (flags & DD_TRI_UNFILLED)      index |= RADEON_UNFILLED_BIT;
7135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (index != rmesa->swtcl.RenderIndex) {
7155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tnl->Driver.Render.Points = rast_tab[index].points;
7165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tnl->Driver.Render.Line = rast_tab[index].line;
7175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tnl->Driver.Render.ClippedLine = rast_tab[index].line;
7185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tnl->Driver.Render.Triangle = rast_tab[index].triangle;
7195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tnl->Driver.Render.Quad = rast_tab[index].quad;
7205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (index == 0) {
7225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.PrimTabVerts = radeon_render_tab_verts;
7235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.PrimTabElts = radeon_render_tab_elts;
7245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.ClippedPolygon = radeon_fast_clipped_poly;
7255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
7265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.PrimTabVerts = _tnl_render_tab_verts;
7275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.PrimTabElts = _tnl_render_tab_elts;
7285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.ClippedPolygon = _tnl_RenderClippedPolygon;
7295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
7305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->swtcl.RenderIndex = index;
7325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
7375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*                 High level hooks for t_vb_render.c                 */
7385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
7395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonRasterPrimitive( GLcontext *ctx, GLuint hwprim )
7425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
7445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (rmesa->swtcl.hw_primitive != hwprim) {
7465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_NEWPRIM( rmesa );
7475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->swtcl.hw_primitive = hwprim;
7485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonRenderPrimitive( GLcontext *ctx, GLenum prim )
7525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
7545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->swtcl.render_primitive = prim;
7555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (prim < GL_TRIANGLES || !(ctx->_TriangleCaps & DD_TRI_UNFILLED))
7565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonRasterPrimitive( ctx, reduced_hw_prim[prim] );
7575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonRenderFinish( GLcontext *ctx )
7605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonResetLineStipple( GLcontext *ctx )
7645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
7665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, lin );
7675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
7715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*           Transition to/from hardware rasterization.               */
7725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
7735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic const char * const fallbackStrings[] = {
7755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "Texture mode",
7765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "glDrawBuffer(GL_FRONT_AND_BACK)",
7775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "glEnable(GL_STENCIL) without hw stencil buffer",
7785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "glRenderMode(selection or feedback)",
7795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "glBlendEquation",
7805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "glBlendFunc",
7815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "RADEON_NO_RAST",
7825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "Mixing GL_CLAMP_TO_BORDER and GL_CLAMP (or GL_MIRROR_CLAMP_ATI)"
7835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
7845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic const char *getFallbackString(GLuint bit)
7875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int i = 0;
7895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   while (bit > 1) {
7905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      i++;
7915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      bit >>= 1;
7925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return fallbackStrings[i];
7945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonFallback( GLcontext *ctx, GLuint bit, GLboolean mode )
7985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
8005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNLcontext *tnl = TNL_CONTEXT(ctx);
8015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint oldfallback = rmesa->Fallback;
8025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (mode) {
8045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->Fallback |= bit;
8055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (oldfallback == 0) {
8065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_FIREVERTICES( rmesa );
8075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_RASTER, GL_TRUE );
8085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 _swsetup_Wakeup( ctx );
8095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->swtcl.RenderIndex = ~0;
8105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         if (RADEON_DEBUG & DEBUG_FALLBACKS) {
8115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul            fprintf(stderr, "Radeon begin rasterization fallback: 0x%x %s\n",
8125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                    bit, getFallbackString(bit));
8135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         }
8145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
8155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else {
8175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      rmesa->Fallback &= ~bit;
8185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (oldfallback == bit) {
8195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 _swrast_flush( ctx );
8205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.Start = radeonRenderStart;
8215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.PrimitiveNotify = radeonRenderPrimitive;
8225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.Finish = radeonRenderFinish;
8238a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
8248a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 tnl->Driver.Render.BuildVertices = _tnl_build_vertices;
8258a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 tnl->Driver.Render.CopyPV = _tnl_copy_pv;
8268a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 tnl->Driver.Render.Interp = _tnl_interp;
8278a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
8285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.ResetLineStipple = radeonResetLineStipple;
8295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_RASTER, GL_FALSE );
8305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (rmesa->TclFallback) {
8315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    /* These are already done if rmesa->TclFallback goes to
8325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	     * zero above. But not if it doesn't (RADEON_NO_TCL for
8335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	     * example?)
8345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	     */
835555b5fac4f47576f04d8e4159dc22f72a2b0a397Roland Scheidegger	    _tnl_invalidate_vertex_state( ctx, ~0 );
836555b5fac4f47576f04d8e4159dc22f72a2b0a397Roland Scheidegger	    _tnl_invalidate_vertices( ctx, ~0 );
837bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol	    RENDERINPUTS_ZERO( rmesa->tnl_index_bitset );
8385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    radeonChooseVertexState( ctx );
8395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    radeonChooseRenderState( ctx );
8405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
8415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         if (RADEON_DEBUG & DEBUG_FALLBACKS) {
8425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul            fprintf(stderr, "Radeon end rasterization fallback: 0x%x %s\n",
8435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                    bit, getFallbackString(bit));
8445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         }
8455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
8465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
8485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
8515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*                            Initialization.                         */
8525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
8535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonInitSwtcl( GLcontext *ctx )
8555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
8565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNLcontext *tnl = TNL_CONTEXT(ctx);
8575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
8585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   static int firsttime = 1;
8595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (firsttime) {
8615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      init_rast_tab();
8625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      firsttime = 0;
8635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.Start = radeonRenderStart;
8665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.Finish = radeonRenderFinish;
8675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.PrimitiveNotify = radeonRenderPrimitive;
8685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.ResetLineStipple = radeonResetLineStipple;
8698a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   tnl->Driver.Render.BuildVertices = _tnl_build_vertices;
8708a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   tnl->Driver.Render.CopyPV = _tnl_copy_pv;
8718a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   tnl->Driver.Render.Interp = _tnl_interp;
8725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8738a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   _tnl_init_vertices( ctx, ctx->Const.MaxArrayLockSize + 12,
8748a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt		       RADEON_MAX_TNL_VERTEX_SIZE);
8758a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
8768a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   rmesa->swtcl.verts = (GLubyte *)tnl->clipspace.vertex_buf;
8775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->swtcl.RenderIndex = ~0;
8785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->swtcl.render_primitive = GL_TRIANGLES;
8795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->swtcl.hw_primitive = 0;
8805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
8815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonDestroySwtcl( GLcontext *ctx )
8845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
8855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
8865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (rmesa->swtcl.indexed_verts.buf)
8885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonReleaseDmaRegion( rmesa, &rmesa->swtcl.indexed_verts,
8895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			      __FUNCTION__ );
8905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
891