radeon_swtcl.c revision bd13e6e5e2403ada2098e3a07c0af4b4ba989ab7
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 *   Keith Whitwell <keith@tungstengraphics.com>
335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
35ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/glheader.h"
36ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/mtypes.h"
37ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/colormac.h"
38ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/enums.h"
39ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/imports.h"
40ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/macros.h"
41bbf2b5c4ffcb6755d34a5b698445aecf604e45fbPauli Nieminen#include "main/simple_list.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"
544e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen#include "radeon_debug.h"
555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
578a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt/* R100: xyzw, c0, c1/fog, stq[0..2]  = 4+1+1+3*3 = 15  right? */
588a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt/* R200: xyzw, c0, c1/fog, strq[0..5] = 4+1+1+4*6 = 30 */
598a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define RADEON_MAX_TNL_VERTEX_SIZE (15 * sizeof(GLfloat))	/* for mesa _tnl stage */
605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/***********************************************************************
628a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt *                         Initialization
635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/
645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
658a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define EMIT_ATTR( ATTR, STYLE, F0 )					\
668a1df968627de01d04f3d692fd81108ba6492c18Eric Anholtdo {									\
67b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].attrib = (ATTR);	\
68b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].format = (STYLE);	\
69b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.vertex_attr_count++;					\
708a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   fmt_0 |= F0;								\
718a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt} while (0)
725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
738a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define EMIT_PAD( N )							\
748a1df968627de01d04f3d692fd81108ba6492c18Eric Anholtdo {									\
75b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].attrib = 0;		\
76b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].format = EMIT_PAD;	\
77b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].offset = (N);		\
78b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.vertex_attr_count++;					\
798a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt} while (0)
805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
818a1df968627de01d04f3d692fd81108ba6492c18Eric Anholtstatic GLuint radeon_cp_vc_frmts[3][2] =
828a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt{
838a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   { RADEON_CP_VC_FRMT_ST0, RADEON_CP_VC_FRMT_ST0 | RADEON_CP_VC_FRMT_Q0 },
848a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   { RADEON_CP_VC_FRMT_ST1, RADEON_CP_VC_FRMT_ST1 | RADEON_CP_VC_FRMT_Q1 },
858a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   { RADEON_CP_VC_FRMT_ST2, RADEON_CP_VC_FRMT_ST2 | RADEON_CP_VC_FRMT_Q2 },
868a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt};
875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
888a1df968627de01d04f3d692fd81108ba6492c18Eric Anholtstatic void radeonSetVertexFormat( GLcontext *ctx )
898a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt{
904637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT( ctx );
918a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   TNLcontext *tnl = TNL_CONTEXT(ctx);
928a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   struct vertex_buffer *VB = &tnl->vb;
93bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol   DECLARE_RENDERINPUTS(index_bitset);
948a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   int fmt_0 = 0;
958a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   int offset = 0;
965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
97bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol   RENDERINPUTS_COPY( index_bitset, tnl->render_inputs_bitset );
985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
998a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   /* Important:
1008a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt    */
1018a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   if ( VB->NdcPtr != NULL ) {
1028a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      VB->AttribPtr[VERT_ATTRIB_POS] = VB->NdcPtr;
1038a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
1048a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   else {
1058a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      VB->AttribPtr[VERT_ATTRIB_POS] = VB->ClipPtr;
1068a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
1075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1088a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   assert( VB->AttribPtr[VERT_ATTRIB_POS] != NULL );
109b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.vertex_attr_count = 0;
1108a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
1118a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   /* EMIT_ATTR's must be in order as they tell t_vertex.c how to
1128a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt    * build up a hardware vertex.
1138a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt    */
1148a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   if ( !rmesa->swtcl.needproj ||
115bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol        RENDERINPUTS_TEST_RANGE( index_bitset, _TNL_FIRST_TEX, _TNL_LAST_TEX )) {	/* for projtex */
1168a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_4F,
1178a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt		 RADEON_CP_VC_FRMT_XY |	RADEON_CP_VC_FRMT_Z | RADEON_CP_VC_FRMT_W0 );
1188a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      offset = 4;
1198a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
1208a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   else {
1218a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_3F,
1228a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt		 RADEON_CP_VC_FRMT_XY |	RADEON_CP_VC_FRMT_Z );
1238a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      offset = 3;
1248a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
1255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1268a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   rmesa->swtcl.coloroffset = offset;
1278a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#if MESA_LITTLE_ENDIAN
1288a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   EMIT_ATTR( _TNL_ATTRIB_COLOR0, EMIT_4UB_4F_RGBA,
1298a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	      RADEON_CP_VC_FRMT_PKCOLOR );
1308a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#else
1318a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   EMIT_ATTR( _TNL_ATTRIB_COLOR0, EMIT_4UB_4F_ABGR,
1328a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	      RADEON_CP_VC_FRMT_PKCOLOR );
1338a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#endif
1348a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   offset += 1;
1355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1368a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   rmesa->swtcl.specoffset = 0;
137bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol   if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_COLOR1 ) ||
138bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol       RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_FOG )) {
1395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1408a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#if MESA_LITTLE_ENDIAN
141bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol      if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_COLOR1 )) {
1428a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 rmesa->swtcl.specoffset = offset;
1438a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_ATTR( _TNL_ATTRIB_COLOR1, EMIT_3UB_3F_RGB,
1448a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 	    RADEON_CP_VC_FRMT_PKSPEC );
1458a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1468a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      else {
1478a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_PAD( 3 );
1488a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
150bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol      if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_FOG )) {
1518a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_ATTR( _TNL_ATTRIB_FOG, EMIT_1UB_1F,
1528a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 	    RADEON_CP_VC_FRMT_PKSPEC );
1538a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1548a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      else {
1558a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_PAD( 1 );
1568a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1578a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#else
158bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol      if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_FOG )) {
1598a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_ATTR( _TNL_ATTRIB_FOG, EMIT_1UB_1F,
1608a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 	    RADEON_CP_VC_FRMT_PKSPEC );
1618a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1628a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      else {
1638a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_PAD( 1 );
1648a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
166bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol      if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_COLOR1 )) {
1678a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 rmesa->swtcl.specoffset = offset;
1688a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_ATTR( _TNL_ATTRIB_COLOR1, EMIT_3UB_3F_BGR,
1698a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 	    RADEON_CP_VC_FRMT_PKSPEC );
1708a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1718a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      else {
1728a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_PAD( 3 );
1738a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1748a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#endif
1758a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
1765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
177bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol   if (RENDERINPUTS_TEST_RANGE( index_bitset, _TNL_FIRST_TEX, _TNL_LAST_TEX )) {
1788a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      int i;
1798a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
1808a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
181bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol	 if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX(i) )) {
182df582ca767a38f185f9b4c449e7ed4266c414ae2Eric Anholt	    GLuint sz = VB->AttribPtr[_TNL_ATTRIB_TEX0 + i]->size;
1838a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
1848a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    switch (sz) {
1858a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    case 1:
1868a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    case 2:
1878a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	       EMIT_ATTR( _TNL_ATTRIB_TEX0+i, EMIT_2F,
1888a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt			  radeon_cp_vc_frmts[i][0] );
1898a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	       break;
190247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	    case 3:
1918a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    case 4:
192247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	       if (ctx->Texture.Unit[i]._ReallyEnabled & (TEXTURE_CUBE_BIT) ) {
193247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger		  EMIT_ATTR( _TNL_ATTRIB_TEX0+i, EMIT_3F,
194247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger			     radeon_cp_vc_frmts[i][1] );
195247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	       } else {
196247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger		  EMIT_ATTR( _TNL_ATTRIB_TEX0+i, EMIT_3F_XYW,
197247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger			     radeon_cp_vc_frmts[i][1] );
198247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	       }
1998a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	       break;
2008a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    default:
2018a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	       continue;
2028a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    };
2038a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 }
2048a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
2058a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
2065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2074637235183b80963536f2364e4d50fcb894886ddDave Airlie   if (!RENDERINPUTS_EQUAL( rmesa->radeon.tnl_index_bitset, index_bitset ) ||
2088a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	fmt_0 != rmesa->swtcl.vertex_format) {
2098a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      RADEON_NEWPRIM(rmesa);
2108a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      rmesa->swtcl.vertex_format = fmt_0;
211b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie      rmesa->radeon.swtcl.vertex_size =
2128a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	  _tnl_install_attrs( ctx,
213b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie			      rmesa->radeon.swtcl.vertex_attrs,
214b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie			      rmesa->radeon.swtcl.vertex_attr_count,
2158a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt			      NULL, 0 );
216b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie      rmesa->radeon.swtcl.vertex_size /= 4;
2174637235183b80963536f2364e4d50fcb894886ddDave Airlie      RENDERINPUTS_COPY( rmesa->radeon.tnl_index_bitset, index_bitset );
2184e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen      radeon_print(RADEON_SWRENDER, RADEON_VERBOSE,
2194e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	  "%s: vertex_size= %d floats\n",  __FUNCTION__, rmesa->radeon.swtcl.vertex_size);
2208a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
2215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2230926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminenstatic void radeon_predict_emit_size( r100ContextPtr rmesa )
224570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen{
225570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen
226570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen    if (!rmesa->radeon.swtcl.emit_prediction) {
227570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen        const int state_size = radeonCountStateEmitSize( &rmesa->radeon );
228570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen        const int scissor_size = 8;
229570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen        const int prims_size = 8;
230570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen        const int vertex_size = 7;
231570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen
232570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen        if (rcommonEnsureCmdBufSpace(&rmesa->radeon,
233570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen                    state_size +
234570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen                    (scissor_size + prims_size + vertex_size),
235570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen                    __FUNCTION__))
236570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen            rmesa->radeon.swtcl.emit_prediction = radeonCountStateEmitSize( &rmesa->radeon );
237570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen        else
238570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen            rmesa->radeon.swtcl.emit_prediction = state_size;
239570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen        rmesa->radeon.swtcl.emit_prediction += scissor_size + prims_size + vertex_size
240570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen            + rmesa->radeon.cmdbuf.cs->cdw;
241570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen    }
242570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen}
2435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonRenderStart( GLcontext *ctx )
2455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
24697029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen    r100ContextPtr rmesa = R100_CONTEXT( ctx );
24797029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen
24897029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen    radeonSetVertexFormat( ctx );
24997029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen
25097029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen    if (rmesa->radeon.dma.flush != 0 &&
25197029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen            rmesa->radeon.dma.flush != rcommon_flush_last_swtcl_prim)
25297029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen        rmesa->radeon.dma.flush( ctx );
2535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2568a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt/**
2578a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt * Set vertex state for SW TCL.  The primary purpose of this function is to
2588a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt * determine in advance whether or not the hardware can / should do the
2598a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt * projection divide or Mesa should do it.
2608a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt */
2615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonChooseVertexState( GLcontext *ctx )
2625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
2634637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT( ctx );
2645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNLcontext *tnl = TNL_CONTEXT(ctx);
2655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
26625847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger   GLuint se_coord_fmt = rmesa->hw.set.cmd[SET_SE_COORDFMT];
26725847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger
26825847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger   se_coord_fmt &= ~(RADEON_VTX_XY_PRE_MULT_1_OVER_W0 |
26925847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger		     RADEON_VTX_Z_PRE_MULT_1_OVER_W0 |
27025847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger		     RADEON_VTX_W0_IS_NOT_1_OVER_W0);
2715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2723f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt   /* We must ensure that we don't do _tnl_need_projected_coords while in a
2733f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt    * rasterization fallback.  As this function will be called again when we
2743f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt    * leave a rasterization fallback, we can just skip it for now.
2753f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt    */
2764637235183b80963536f2364e4d50fcb894886ddDave Airlie   if (rmesa->radeon.Fallback != 0)
2773f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt      return;
2783f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt
2798a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   /* HW perspective divide is a win, but tiny vertex formats are a
2808a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt    * bigger one.
2818a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt    */
2825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
283bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol   if ((!RENDERINPUTS_TEST_RANGE( tnl->render_inputs_bitset, _TNL_FIRST_TEX, _TNL_LAST_TEX ) &&
284bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol       !RENDERINPUTS_TEST( tnl->render_inputs_bitset, _TNL_ATTRIB_COLOR1 ))
285bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol       || (ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED))) {
2868a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      rmesa->swtcl.needproj = GL_TRUE;
28725847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger      se_coord_fmt |= (RADEON_VTX_XY_PRE_MULT_1_OVER_W0 |
28825847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger		      RADEON_VTX_Z_PRE_MULT_1_OVER_W0);
2895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else {
2918a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      rmesa->swtcl.needproj = GL_FALSE;
29225847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger      se_coord_fmt |= (RADEON_VTX_W0_IS_NOT_1_OVER_W0);
2935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2958a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   _tnl_need_projected_coords( ctx, rmesa->swtcl.needproj );
2965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2978a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   if ( se_coord_fmt != rmesa->hw.set.cmd[SET_SE_COORDFMT] ) {
2988a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      RADEON_STATECHANGE( rmesa, set );
2998a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      rmesa->hw.set.cmd[SET_SE_COORDFMT] = se_coord_fmt;
3005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
303b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlievoid r100_swtcl_flush(GLcontext *ctx, uint32_t current_offset)
3045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
3054637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
3065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3091090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   radeonEmitState(&rmesa->radeon);
310b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   radeonEmitVertexAOS( rmesa,
311b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie			rmesa->radeon.swtcl.vertex_size,
312bd13e6e5e2403ada2098e3a07c0af4b4ba989ab7Dave Airlie			rmesa->radeon.swtcl.bo,
313b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie			current_offset);
3145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
315b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie
316b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   radeonEmitVbufPrim( rmesa,
317b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie		       rmesa->swtcl.vertex_format,
318b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie		       rmesa->radeon.swtcl.hw_primitive,
319b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie		       rmesa->radeon.swtcl.numverts);
320570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen   if ( rmesa->radeon.swtcl.emit_prediction < rmesa->radeon.cmdbuf.cs->cdw )
321570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen     WARN_ONCE("Rendering was %d commands larger than predicted size."
322570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen	 " We might overflow  command buffer.\n",
323570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen	 rmesa->radeon.cmdbuf.cs->cdw - rmesa->radeon.swtcl.emit_prediction );
3245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
32597029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen
326570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen   rmesa->radeon.swtcl.emit_prediction = 0;
32797029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen
3285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*
3315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Render unclipped vertex buffers by emitting vertices directly to
3325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * dma buffers.  Use strip/fan hardware primitives where possible.
3335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Try to simulate missing primitives with indexed vertices.
3345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
3355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_POINTS      1
3365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_LINES       1
3375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_LINE_STRIPS 1
3385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_TRIANGLES   1
3395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_TRI_STRIPS  1
3405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_TRI_STRIP_1 0
3415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_TRI_FANS    1
3425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_QUADS       0
3435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_QUAD_STRIPS 0
3445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_POLYGONS    0
3458a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt/* \todo: is it possible to make "ELTS" work with t_vertex code ? */
3468a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define HAVE_ELTS        0
3475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic const GLuint hw_prim[GL_POLYGON+1] = {
3495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_POINT,
3505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_LINE,
3515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   0,
3525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_LINE_STRIP,
3535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
3545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_STRIP,
3555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_FAN,
3565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   0,
3575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   0,
3585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   0
3595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
3605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3618e5479c7f806ffd57eed26c147e3ca227a39f0a7Brian Paulstatic INLINE void
3624637235183b80963536f2364e4d50fcb894886ddDave AirlieradeonDmaPrimitive( r100ContextPtr rmesa, GLenum prim )
3635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
3645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_NEWPRIM( rmesa );
365b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.hw_primitive = hw_prim[prim];
366b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   //   assert(rmesa->radeon.dma.current.ptr == rmesa->radeon.dma.current.start);
3675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3690926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminenstatic void* radeon_alloc_verts( r100ContextPtr rmesa , GLuint nr, GLuint size )
3700926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen{
3710926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen   void *rv;
3720926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen   do {
3730926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen     radeon_predict_emit_size( rmesa );
3740926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen     rv = rcommonAllocDmaLowVerts( &rmesa->radeon, nr, size );
3750926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen   } while (!rv);
3760926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen   return rv;
3770926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen}
3780926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen
3794637235183b80963536f2364e4d50fcb894886ddDave Airlie#define LOCAL_VARS r100ContextPtr rmesa = R100_CONTEXT(ctx)
3805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define INIT( prim ) radeonDmaPrimitive( rmesa, prim )
3812dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell#define FLUSH()  RADEON_NEWPRIM( rmesa )
382b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie#define GET_CURRENT_VB_MAX_VERTS()					10\
383b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie//  (((int)rmesa->radeon.dma.current.end - (int)rmesa->radeon.dma.current.ptr) / (rmesa->radeon.swtcl.vertex_size*4))
3845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define GET_SUBSEQUENT_VB_MAX_VERTS() \
385b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie  ((RADEON_BUFFER_SIZE) / (rmesa->radeon.swtcl.vertex_size*4))
3860926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen#define ALLOC_VERTS( nr ) radeon_alloc_verts( rmesa, nr, rmesa->radeon.swtcl.vertex_size * 4 )
3872dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell#define EMIT_VERTS( ctx, j, nr, buf ) \
3888a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt  _tnl_emit_vertices_to_buffer(ctx, j, (j)+(nr), buf)
3892dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell
3905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) radeon_dma_##x
3915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_dmatmp.h"
3925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
3955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*                          Render pipeline stage                     */
3965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
3975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic GLboolean radeon_run_render( GLcontext *ctx,
40057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell				    struct tnl_pipeline_stage *stage )
4015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4024637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
4035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNLcontext *tnl = TNL_CONTEXT(ctx);
4045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   struct vertex_buffer *VB = &tnl->vb;
4053d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_render_func *tab = TAG(render_tab_verts);
4068592ba94b85b3f0f93ae875eece259b4626a6759Keith Whitwell   GLuint i;
4075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
408b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   if (rmesa->radeon.swtcl.RenderIndex != 0 ||
4092dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell       !radeon_dma_validate_render( ctx, VB ))
4105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return GL_TRUE;
4115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.Start( ctx );
4135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
41457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   for (i = 0 ; i < VB->PrimitiveCount ; i++)
4155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
41657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      GLuint prim = VB->Primitive[i].mode;
41757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      GLuint start = VB->Primitive[i].start;
41857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      GLuint length = VB->Primitive[i].count;
41957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
42057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      if (!length)
42157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 continue;
4225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4234e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen      radeon_print(RADEON_SWRENDER, RADEON_NORMAL,
4244e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	  "radeon_render.c: prim %s %d..%d\n",
42557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell		 _mesa_lookup_enum_by_nr(prim & PRIM_MODE_MASK),
42657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell		 start, start+length);
4275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (length)
4298592ba94b85b3f0f93ae875eece259b4626a6759Keith Whitwell	 tab[prim & PRIM_MODE_MASK]( ctx, start, start + length, prim );
4305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.Finish( ctx );
4335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return GL_FALSE;		/* finished the pipe */
4355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
43957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwellconst struct tnl_pipeline_stage _radeon_render_stage =
4405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "radeon render",
442bf87f864934e174b3493592d5d107f012aac0842Keith Whitwell   NULL,
443bf87f864934e174b3493592d5d107f012aac0842Keith Whitwell   NULL,
444bf87f864934e174b3493592d5d107f012aac0842Keith Whitwell   NULL,
445bf87f864934e174b3493592d5d107f012aac0842Keith Whitwell   NULL,
4465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeon_run_render		/* run */
4475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
4485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**************************************************************************/
4515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic const GLuint reduced_hw_prim[GL_POLYGON+1] = {
4545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_POINT,
4555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_LINE,
4565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_LINE,
4575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_LINE,
4585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
4595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
4605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
4615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
4625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
4635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST
4645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
4655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonRasterPrimitive( GLcontext *ctx, GLuint hwprim );
4675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonRenderPrimitive( GLcontext *ctx, GLenum prim );
4685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonResetLineStipple( GLcontext *ctx );
4695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/***********************************************************************
4725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *                    Emit primitives as inline vertices               *
4735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/
4745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef LOCAL_VARS
4762dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell#undef ALLOC_VERTS
4774637235183b80963536f2364e4d50fcb894886ddDave Airlie#define CTX_ARG r100ContextPtr rmesa
478b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie#define GET_VERTEX_DWORDS() rmesa->radeon.swtcl.vertex_size
4790926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen#define ALLOC_VERTS( n, size ) radeon_alloc_verts( rmesa, n, (size) * 4 )
4805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef LOCAL_VARS
4815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define LOCAL_VARS						\
4824637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);		\
483b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   const char *radeonverts = (char *)rmesa->radeon.swtcl.verts;
4848a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define VERT(x) (radeonVertex *)(radeonverts + ((x) * (vertsize) * sizeof(int)))
4855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERTEX radeonVertex
4865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef TAG
4875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) radeon_##x
4885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_triemit.h"
4895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/***********************************************************************
4925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *          Macros for t_dd_tritmp.h to draw basic primitives          *
4935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/
4945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define QUAD( a, b, c, d ) radeon_quad( rmesa, a, b, c, d )
4965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TRI( a, b, c )     radeon_triangle( rmesa, a, b, c )
4975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define LINE( a, b )       radeon_line( rmesa, a, b )
4985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define POINT( a )         radeon_point( rmesa, a )
4995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/***********************************************************************
5015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *              Build render functions from dd templates               *
5025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/
5035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RADEON_TWOSIDE_BIT	0x01
5055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RADEON_UNFILLED_BIT	0x02
50630daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger#define RADEON_MAX_TRIFUNC	0x04
5075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic struct {
5103d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_points_func	        points;
5113d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_line_func		line;
5123d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_triangle_func	triangle;
5133d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_quad_func		quad;
5145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} rast_tab[RADEON_MAX_TRIFUNC];
5155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_FALLBACK  0
518bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl#define DO_OFFSET    0
5195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_UNFILLED (IND & RADEON_UNFILLED_BIT)
5205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_TWOSIDE  (IND & RADEON_TWOSIDE_BIT)
5215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_FLAT      0
5225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_TRI       1
5235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_QUAD      1
5245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_LINE      1
5255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_POINTS    1
5265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_FULL_QUAD 1
5275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_RGBA   1
5295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_SPEC   1
5305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_BACK_COLORS  0
5315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_HW_FLATSHADE 1
5325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAB rast_tab
5335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DEPTH_SCALE 1.0
5355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define UNFILLED_TRI unfilled_tri
5365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define UNFILLED_QUAD unfilled_quad
5375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERT_X(_v) _v->v.x
5385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERT_Y(_v) _v->v.y
5395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERT_Z(_v) _v->v.z
5405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define AREA_IS_CCW( a ) (a < 0)
541b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie#define GET_VERTEX(e) (rmesa->radeon.swtcl.verts + ((e) * rmesa->radeon.swtcl.vertex_size * sizeof(int)))
5425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
543c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell#define VERT_SET_RGBA( v, c )  					\
544c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwelldo {								\
545c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   radeon_color_t *color = (radeon_color_t *)&((v)->ui[coloroffset]);	\
546c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   UNCLAMPED_FLOAT_TO_UBYTE(color->red, (c)[0]);		\
547c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   UNCLAMPED_FLOAT_TO_UBYTE(color->green, (c)[1]);		\
548c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   UNCLAMPED_FLOAT_TO_UBYTE(color->blue, (c)[2]);		\
549c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   UNCLAMPED_FLOAT_TO_UBYTE(color->alpha, (c)[3]);		\
550c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell} while (0)
551c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell
5525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERT_COPY_RGBA( v0, v1 ) v0->ui[coloroffset] = v1->ui[coloroffset]
553c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell
5548a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define VERT_SET_SPEC( v, c )					\
555c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwelldo {								\
5568a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   if (specoffset) {						\
5578a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      radeon_color_t *spec = (radeon_color_t *)&((v)->ui[specoffset]);	\
5588a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      UNCLAMPED_FLOAT_TO_UBYTE(spec->red, (c)[0]);	\
5598a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      UNCLAMPED_FLOAT_TO_UBYTE(spec->green, (c)[1]);	\
5608a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      UNCLAMPED_FLOAT_TO_UBYTE(spec->blue, (c)[2]);	\
561c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   }								\
562c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell} while (0)
563c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell#define VERT_COPY_SPEC( v0, v1 )			\
564c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwelldo {							\
5658a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   if (specoffset) {					\
5668a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      radeon_color_t *spec0 = (radeon_color_t *)&((v0)->ui[specoffset]);	\
5678a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      radeon_color_t *spec1 = (radeon_color_t *)&((v1)->ui[specoffset]);	\
5688a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      spec0->red   = spec1->red;	\
5698a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      spec0->green = spec1->green;	\
5708a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      spec0->blue  = spec1->blue; 	\
571c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   }							\
572c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell} while (0)
573c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell
574c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell/* These don't need LE32_TO_CPU() as they used to save and restore
575c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell * colors which are already in the correct format.
576c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell */
577c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell#define VERT_SAVE_RGBA( idx )    color[idx] = v[idx]->ui[coloroffset]
578c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell#define VERT_RESTORE_RGBA( idx ) v[idx]->ui[coloroffset] = color[idx]
5798a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define VERT_SAVE_SPEC( idx )    if (specoffset) spec[idx] = v[idx]->ui[specoffset]
5808a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define VERT_RESTORE_SPEC( idx ) if (specoffset) v[idx]->ui[specoffset] = spec[idx]
5815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef LOCAL_VARS
5835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef TAG
5845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef INIT
5855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define LOCAL_VARS(n)							\
5874637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);			\
588c3374bf97ecd82b915fb29c7c04951e2b75d4dbcPauli Nieminen   GLuint color[n] = {0}, spec[n] = {0};						\
5898a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   GLuint coloroffset = rmesa->swtcl.coloroffset;	\
5908a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   GLuint specoffset = rmesa->swtcl.specoffset;			\
5918a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   (void) color; (void) spec; (void) coloroffset; (void) specoffset;
5925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/***********************************************************************
5945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *                Helpers for rendering unfilled primitives            *
5955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/
5965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RASTERIZE(x) radeonRasterPrimitive( ctx, reduced_hw_prim[x] )
598b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie#define RENDER_PRIMITIVE rmesa->radeon.swtcl.render_primitive
5995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef TAG
6005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x
6015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_unfilled.h"
6025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef IND
6035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/***********************************************************************
6065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *                      Generate GL render functions                   *
6075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/
6085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define IND (0)
6115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x
6125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_tritmp.h"
6135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define IND (RADEON_TWOSIDE_BIT)
6155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x##_twoside
6165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_tritmp.h"
6175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define IND (RADEON_UNFILLED_BIT)
6195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x##_unfilled
6205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_tritmp.h"
6215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define IND (RADEON_TWOSIDE_BIT|RADEON_UNFILLED_BIT)
6235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x##_twoside_unfilled
6245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_tritmp.h"
6255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void init_rast_tab( void )
6285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
6295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   init();
6305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   init_twoside();
6315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   init_unfilled();
6325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   init_twoside_unfilled();
6335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
6345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
6365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*               Render unclipped begin/end objects                   */
6375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
6385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RENDER_POINTS( start, count )		\
6405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   for ( ; start < count ; start++)		\
6415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeon_point( rmesa, VERT(start) )
6425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RENDER_LINE( v0, v1 ) \
6435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeon_line( rmesa, VERT(v0), VERT(v1) )
6445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RENDER_TRI( v0, v1, v2 )  \
6455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeon_triangle( rmesa, VERT(v0), VERT(v1), VERT(v2) )
6465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RENDER_QUAD( v0, v1, v2, v3 ) \
6475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeon_quad( rmesa, VERT(v0), VERT(v1), VERT(v2), VERT(v3) )
6485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef INIT
6495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define INIT(x) do {					\
6505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonRenderPrimitive( ctx, x );			\
6515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} while (0)
6525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef LOCAL_VARS
6535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define LOCAL_VARS						\
6544637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);		\
655b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   const GLuint vertsize = rmesa->radeon.swtcl.vertex_size;		\
656b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   const char *radeonverts = (char *)rmesa->radeon.swtcl.verts;		\
6575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   const GLuint * const elt = TNL_CONTEXT(ctx)->vb.Elts;	\
6585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   const GLboolean stipple = ctx->Line.StippleFlag;		\
6595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   (void) elt; (void) stipple;
6605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RESET_STIPPLE	if ( stipple ) radeonResetLineStipple( ctx );
6615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RESET_OCCLUSION
6625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define PRESERVE_VB_DEFS
6635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define ELT(x) (x)
6645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) radeon_##x##_verts
6655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/t_vb_rendertmp.h"
6665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef ELT
6675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef TAG
6685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) radeon_##x##_elts
6695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define ELT(x) elt[x]
6705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/t_vb_rendertmp.h"
6715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
6755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*                    Choose render functions                         */
6765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
6775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonChooseRenderState( GLcontext *ctx )
6795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
6805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNLcontext *tnl = TNL_CONTEXT(ctx);
6814637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
6825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint index = 0;
6835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint flags = ctx->_TriangleCaps;
6845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6854637235183b80963536f2364e4d50fcb894886ddDave Airlie   if (!rmesa->radeon.TclFallback || rmesa->radeon.Fallback)
6865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
6875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (flags & DD_TRI_LIGHT_TWOSIDE) index |= RADEON_TWOSIDE_BIT;
6895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (flags & DD_TRI_UNFILLED)      index |= RADEON_UNFILLED_BIT;
6905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
691b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   if (index != rmesa->radeon.swtcl.RenderIndex) {
6925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tnl->Driver.Render.Points = rast_tab[index].points;
6935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tnl->Driver.Render.Line = rast_tab[index].line;
6945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tnl->Driver.Render.ClippedLine = rast_tab[index].line;
6955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tnl->Driver.Render.Triangle = rast_tab[index].triangle;
6965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tnl->Driver.Render.Quad = rast_tab[index].quad;
6975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (index == 0) {
6995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.PrimTabVerts = radeon_render_tab_verts;
7005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.PrimTabElts = radeon_render_tab_elts;
7015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.ClippedPolygon = radeon_fast_clipped_poly;
7025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
7035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.PrimTabVerts = _tnl_render_tab_verts;
7045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.PrimTabElts = _tnl_render_tab_elts;
7055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.ClippedPolygon = _tnl_RenderClippedPolygon;
7065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
7075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
708b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie      rmesa->radeon.swtcl.RenderIndex = index;
7095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
7145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*                 High level hooks for t_vb_render.c                 */
7155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
7165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonRasterPrimitive( GLcontext *ctx, GLuint hwprim )
7195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7204637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
7215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
722b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   if (rmesa->radeon.swtcl.hw_primitive != hwprim) {
7235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_NEWPRIM( rmesa );
724b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie      rmesa->radeon.swtcl.hw_primitive = hwprim;
7255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonRenderPrimitive( GLcontext *ctx, GLenum prim )
7295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7304637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
731b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.render_primitive = prim;
7325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (prim < GL_TRIANGLES || !(ctx->_TriangleCaps & DD_TRI_UNFILLED))
7335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonRasterPrimitive( ctx, reduced_hw_prim[prim] );
7345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonRenderFinish( GLcontext *ctx )
7375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonResetLineStipple( GLcontext *ctx )
7415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7424637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
7435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, lin );
7445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
7485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*           Transition to/from hardware rasterization.               */
7495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
7505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic const char * const fallbackStrings[] = {
7525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "Texture mode",
7535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "glDrawBuffer(GL_FRONT_AND_BACK)",
7545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "glEnable(GL_STENCIL) without hw stencil buffer",
7555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "glRenderMode(selection or feedback)",
7565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "glBlendEquation",
7575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "glBlendFunc",
7585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "RADEON_NO_RAST",
7595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "Mixing GL_CLAMP_TO_BORDER and GL_CLAMP (or GL_MIRROR_CLAMP_ATI)"
7605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
7615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic const char *getFallbackString(GLuint bit)
7645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int i = 0;
7665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   while (bit > 1) {
7675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      i++;
7685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      bit >>= 1;
7695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return fallbackStrings[i];
7715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonFallback( GLcontext *ctx, GLuint bit, GLboolean mode )
7755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7764637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
7775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNLcontext *tnl = TNL_CONTEXT(ctx);
7784637235183b80963536f2364e4d50fcb894886ddDave Airlie   GLuint oldfallback = rmesa->radeon.Fallback;
7795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (mode) {
7814637235183b80963536f2364e4d50fcb894886ddDave Airlie      rmesa->radeon.Fallback |= bit;
7825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (oldfallback == 0) {
7831090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie	 radeon_firevertices(&rmesa->radeon);
7845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_RASTER, GL_TRUE );
7855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 _swsetup_Wakeup( ctx );
786b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie	 rmesa->radeon.swtcl.RenderIndex = ~0;
7874e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen         if (RADEON_DEBUG & RADEON_FALLBACKS) {
7885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul            fprintf(stderr, "Radeon begin rasterization fallback: 0x%x %s\n",
7895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                    bit, getFallbackString(bit));
7905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         }
7915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
7925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else {
7944637235183b80963536f2364e4d50fcb894886ddDave Airlie      rmesa->radeon.Fallback &= ~bit;
7955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (oldfallback == bit) {
7965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 _swrast_flush( ctx );
7975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.Start = radeonRenderStart;
7985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.PrimitiveNotify = radeonRenderPrimitive;
7995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.Finish = radeonRenderFinish;
8008a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
8018a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 tnl->Driver.Render.BuildVertices = _tnl_build_vertices;
8028a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 tnl->Driver.Render.CopyPV = _tnl_copy_pv;
8038a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 tnl->Driver.Render.Interp = _tnl_interp;
8048a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
8055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.ResetLineStipple = radeonResetLineStipple;
8065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_RASTER, GL_FALSE );
8074637235183b80963536f2364e4d50fcb894886ddDave Airlie	 if (rmesa->radeon.TclFallback) {
8084637235183b80963536f2364e4d50fcb894886ddDave Airlie	    /* These are already done if rmesa->radeon.TclFallback goes to
8095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	     * zero above. But not if it doesn't (RADEON_NO_TCL for
8105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	     * example?)
8115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	     */
812555b5fac4f47576f04d8e4159dc22f72a2b0a397Roland Scheidegger	    _tnl_invalidate_vertex_state( ctx, ~0 );
813555b5fac4f47576f04d8e4159dc22f72a2b0a397Roland Scheidegger	    _tnl_invalidate_vertices( ctx, ~0 );
8144637235183b80963536f2364e4d50fcb894886ddDave Airlie	    RENDERINPUTS_ZERO( rmesa->radeon.tnl_index_bitset );
8155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    radeonChooseVertexState( ctx );
8165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    radeonChooseRenderState( ctx );
8175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
8184e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen         if (RADEON_DEBUG & RADEON_FALLBACKS) {
8195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul            fprintf(stderr, "Radeon end rasterization fallback: 0x%x %s\n",
8205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                    bit, getFallbackString(bit));
8215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         }
8225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
8235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
8255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
8285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*                            Initialization.                         */
8295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
8305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonInitSwtcl( GLcontext *ctx )
8325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
8335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNLcontext *tnl = TNL_CONTEXT(ctx);
8344637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
8355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   static int firsttime = 1;
8365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (firsttime) {
8385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      init_rast_tab();
8395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      firsttime = 0;
8405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
841570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen   rmesa->radeon.swtcl.emit_prediction = 0;
8425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.Start = radeonRenderStart;
8445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.Finish = radeonRenderFinish;
8455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.PrimitiveNotify = radeonRenderPrimitive;
8465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.ResetLineStipple = radeonResetLineStipple;
8478a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   tnl->Driver.Render.BuildVertices = _tnl_build_vertices;
8488a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   tnl->Driver.Render.CopyPV = _tnl_copy_pv;
8498a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   tnl->Driver.Render.Interp = _tnl_interp;
8505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8518a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   _tnl_init_vertices( ctx, ctx->Const.MaxArrayLockSize + 12,
8528a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt		       RADEON_MAX_TNL_VERTEX_SIZE);
8538a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
854b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.verts = (GLubyte *)tnl->clipspace.vertex_buf;
855b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.RenderIndex = ~0;
856b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.render_primitive = GL_TRIANGLES;
857b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.hw_primitive = 0;
8585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
8595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
860