radeon_swtcl.c revision 97029c1860e8a99448ac157408e71bea3aa2559f
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"
545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
568a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt/* R100: xyzw, c0, c1/fog, stq[0..2]  = 4+1+1+3*3 = 15  right? */
578a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt/* R200: xyzw, c0, c1/fog, strq[0..5] = 4+1+1+4*6 = 30 */
588a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define RADEON_MAX_TNL_VERTEX_SIZE (15 * sizeof(GLfloat))	/* for mesa _tnl stage */
595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/***********************************************************************
618a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt *                         Initialization
625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/
635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
648a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define EMIT_ATTR( ATTR, STYLE, F0 )					\
658a1df968627de01d04f3d692fd81108ba6492c18Eric Anholtdo {									\
66b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].attrib = (ATTR);	\
67b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].format = (STYLE);	\
68b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.vertex_attr_count++;					\
698a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   fmt_0 |= F0;								\
708a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt} while (0)
715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
728a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define EMIT_PAD( N )							\
738a1df968627de01d04f3d692fd81108ba6492c18Eric Anholtdo {									\
74b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].attrib = 0;		\
75b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].format = EMIT_PAD;	\
76b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].offset = (N);		\
77b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.vertex_attr_count++;					\
788a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt} while (0)
795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
808a1df968627de01d04f3d692fd81108ba6492c18Eric Anholtstatic GLuint radeon_cp_vc_frmts[3][2] =
818a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt{
828a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   { RADEON_CP_VC_FRMT_ST0, RADEON_CP_VC_FRMT_ST0 | RADEON_CP_VC_FRMT_Q0 },
838a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   { RADEON_CP_VC_FRMT_ST1, RADEON_CP_VC_FRMT_ST1 | RADEON_CP_VC_FRMT_Q1 },
848a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   { RADEON_CP_VC_FRMT_ST2, RADEON_CP_VC_FRMT_ST2 | RADEON_CP_VC_FRMT_Q2 },
858a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt};
865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
878a1df968627de01d04f3d692fd81108ba6492c18Eric Anholtstatic void radeonSetVertexFormat( GLcontext *ctx )
888a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt{
894637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT( ctx );
908a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   TNLcontext *tnl = TNL_CONTEXT(ctx);
918a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   struct vertex_buffer *VB = &tnl->vb;
92bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol   DECLARE_RENDERINPUTS(index_bitset);
938a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   int fmt_0 = 0;
948a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   int offset = 0;
955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
96bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol   RENDERINPUTS_COPY( index_bitset, tnl->render_inputs_bitset );
975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
988a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   /* Important:
998a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt    */
1008a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   if ( VB->NdcPtr != NULL ) {
1018a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      VB->AttribPtr[VERT_ATTRIB_POS] = VB->NdcPtr;
1028a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
1038a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   else {
1048a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      VB->AttribPtr[VERT_ATTRIB_POS] = VB->ClipPtr;
1058a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
1065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1078a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   assert( VB->AttribPtr[VERT_ATTRIB_POS] != NULL );
108b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.vertex_attr_count = 0;
1098a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
1108a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   /* EMIT_ATTR's must be in order as they tell t_vertex.c how to
1118a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt    * build up a hardware vertex.
1128a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt    */
1138a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   if ( !rmesa->swtcl.needproj ||
114bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol        RENDERINPUTS_TEST_RANGE( index_bitset, _TNL_FIRST_TEX, _TNL_LAST_TEX )) {	/* for projtex */
1158a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_4F,
1168a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt		 RADEON_CP_VC_FRMT_XY |	RADEON_CP_VC_FRMT_Z | RADEON_CP_VC_FRMT_W0 );
1178a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      offset = 4;
1188a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
1198a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   else {
1208a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_3F,
1218a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt		 RADEON_CP_VC_FRMT_XY |	RADEON_CP_VC_FRMT_Z );
1228a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      offset = 3;
1238a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
1245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1258a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   rmesa->swtcl.coloroffset = offset;
1268a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#if MESA_LITTLE_ENDIAN
1278a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   EMIT_ATTR( _TNL_ATTRIB_COLOR0, EMIT_4UB_4F_RGBA,
1288a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	      RADEON_CP_VC_FRMT_PKCOLOR );
1298a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#else
1308a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   EMIT_ATTR( _TNL_ATTRIB_COLOR0, EMIT_4UB_4F_ABGR,
1318a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	      RADEON_CP_VC_FRMT_PKCOLOR );
1328a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#endif
1338a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   offset += 1;
1345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1358a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   rmesa->swtcl.specoffset = 0;
136bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol   if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_COLOR1 ) ||
137bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol       RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_FOG )) {
1385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1398a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#if MESA_LITTLE_ENDIAN
140bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol      if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_COLOR1 )) {
1418a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 rmesa->swtcl.specoffset = offset;
1428a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_ATTR( _TNL_ATTRIB_COLOR1, EMIT_3UB_3F_RGB,
1438a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 	    RADEON_CP_VC_FRMT_PKSPEC );
1448a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1458a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      else {
1468a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_PAD( 3 );
1478a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
149bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol      if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_FOG )) {
1508a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_ATTR( _TNL_ATTRIB_FOG, EMIT_1UB_1F,
1518a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 	    RADEON_CP_VC_FRMT_PKSPEC );
1528a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1538a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      else {
1548a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_PAD( 1 );
1558a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1568a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#else
157bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol      if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_FOG )) {
1588a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_ATTR( _TNL_ATTRIB_FOG, EMIT_1UB_1F,
1598a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 	    RADEON_CP_VC_FRMT_PKSPEC );
1608a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1618a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      else {
1628a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_PAD( 1 );
1638a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
165bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol      if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_COLOR1 )) {
1668a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 rmesa->swtcl.specoffset = offset;
1678a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_ATTR( _TNL_ATTRIB_COLOR1, EMIT_3UB_3F_BGR,
1688a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 	    RADEON_CP_VC_FRMT_PKSPEC );
1698a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1708a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      else {
1718a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_PAD( 3 );
1728a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1738a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#endif
1748a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
1755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
176bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol   if (RENDERINPUTS_TEST_RANGE( index_bitset, _TNL_FIRST_TEX, _TNL_LAST_TEX )) {
1778a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      int i;
1788a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
1798a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
180bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol	 if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX(i) )) {
1818a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    GLuint sz = VB->TexCoordPtr[i]->size;
1828a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
1838a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    switch (sz) {
1848a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    case 1:
1858a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    case 2:
1868a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	       EMIT_ATTR( _TNL_ATTRIB_TEX0+i, EMIT_2F,
1878a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt			  radeon_cp_vc_frmts[i][0] );
1888a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	       break;
189247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	    case 3:
1908a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    case 4:
191247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	       if (ctx->Texture.Unit[i]._ReallyEnabled & (TEXTURE_CUBE_BIT) ) {
192247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger		  EMIT_ATTR( _TNL_ATTRIB_TEX0+i, EMIT_3F,
193247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger			     radeon_cp_vc_frmts[i][1] );
194247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	       } else {
195247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger		  EMIT_ATTR( _TNL_ATTRIB_TEX0+i, EMIT_3F_XYW,
196247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger			     radeon_cp_vc_frmts[i][1] );
197247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	       }
1988a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	       break;
1998a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    default:
2008a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	       continue;
2018a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    };
2028a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 }
2038a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
2048a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
2055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2064637235183b80963536f2364e4d50fcb894886ddDave Airlie   if (!RENDERINPUTS_EQUAL( rmesa->radeon.tnl_index_bitset, index_bitset ) ||
2078a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	fmt_0 != rmesa->swtcl.vertex_format) {
2088a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      RADEON_NEWPRIM(rmesa);
2098a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      rmesa->swtcl.vertex_format = fmt_0;
210b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie      rmesa->radeon.swtcl.vertex_size =
2118a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	  _tnl_install_attrs( ctx,
212b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie			      rmesa->radeon.swtcl.vertex_attrs,
213b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie			      rmesa->radeon.swtcl.vertex_attr_count,
2148a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt			      NULL, 0 );
215b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie      rmesa->radeon.swtcl.vertex_size /= 4;
2164637235183b80963536f2364e4d50fcb894886ddDave Airlie      RENDERINPUTS_COPY( rmesa->radeon.tnl_index_bitset, index_bitset );
2178a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      if (RADEON_DEBUG & DEBUG_VERTS)
2188a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 fprintf( stderr, "%s: vertex_size= %d floats\n",
219b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie		  __FUNCTION__, rmesa->radeon.swtcl.vertex_size);
2208a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
2215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonRenderStart( GLcontext *ctx )
2255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
22697029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen    r100ContextPtr rmesa = R100_CONTEXT( ctx );
22797029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen
22897029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen    radeonSetVertexFormat( ctx );
22997029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen
23097029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen    if (rmesa->radeon.dma.flush != 0 &&
23197029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen            rmesa->radeon.dma.flush != rcommon_flush_last_swtcl_prim)
23297029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen        rmesa->radeon.dma.flush( ctx );
23397029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen
23497029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen    if (!rmesa->radeon.swtcl.primitive_counter) {
23597029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen        if (rcommonEnsureCmdBufSpace(&rmesa->radeon,
23697029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen                    radeonCountStateEmitSize( &rmesa->radeon ) +
23797029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen                    (8 + 8 + 7), /* scissor + primis + VertexAOS */
23897029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen                    __FUNCTION__))
23997029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen            rmesa->radeon.swtcl.primitive_counter = 0;
24097029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen        else
24197029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen            rmesa->radeon.swtcl.primitive_counter = 1;
24297029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen    }
2435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2468a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt/**
2478a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt * Set vertex state for SW TCL.  The primary purpose of this function is to
2488a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt * determine in advance whether or not the hardware can / should do the
2498a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt * projection divide or Mesa should do it.
2508a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt */
2515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonChooseVertexState( GLcontext *ctx )
2525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
2534637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT( ctx );
2545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNLcontext *tnl = TNL_CONTEXT(ctx);
2555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
25625847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger   GLuint se_coord_fmt = rmesa->hw.set.cmd[SET_SE_COORDFMT];
25725847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger
25825847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger   se_coord_fmt &= ~(RADEON_VTX_XY_PRE_MULT_1_OVER_W0 |
25925847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger		     RADEON_VTX_Z_PRE_MULT_1_OVER_W0 |
26025847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger		     RADEON_VTX_W0_IS_NOT_1_OVER_W0);
2615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2623f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt   /* We must ensure that we don't do _tnl_need_projected_coords while in a
2633f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt    * rasterization fallback.  As this function will be called again when we
2643f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt    * leave a rasterization fallback, we can just skip it for now.
2653f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt    */
2664637235183b80963536f2364e4d50fcb894886ddDave Airlie   if (rmesa->radeon.Fallback != 0)
2673f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt      return;
2683f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt
2698a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   /* HW perspective divide is a win, but tiny vertex formats are a
2708a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt    * bigger one.
2718a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt    */
2725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
273bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol   if ((!RENDERINPUTS_TEST_RANGE( tnl->render_inputs_bitset, _TNL_FIRST_TEX, _TNL_LAST_TEX ) &&
274bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol       !RENDERINPUTS_TEST( tnl->render_inputs_bitset, _TNL_ATTRIB_COLOR1 ))
275bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol       || (ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED))) {
2768a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      rmesa->swtcl.needproj = GL_TRUE;
27725847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger      se_coord_fmt |= (RADEON_VTX_XY_PRE_MULT_1_OVER_W0 |
27825847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger		      RADEON_VTX_Z_PRE_MULT_1_OVER_W0);
2795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else {
2818a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      rmesa->swtcl.needproj = GL_FALSE;
28225847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger      se_coord_fmt |= (RADEON_VTX_W0_IS_NOT_1_OVER_W0);
2835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2858a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   _tnl_need_projected_coords( ctx, rmesa->swtcl.needproj );
2865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2878a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   if ( se_coord_fmt != rmesa->hw.set.cmd[SET_SE_COORDFMT] ) {
2888a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      RADEON_STATECHANGE( rmesa, set );
2898a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      rmesa->hw.set.cmd[SET_SE_COORDFMT] = se_coord_fmt;
2905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
293b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlievoid r100_swtcl_flush(GLcontext *ctx, uint32_t current_offset)
2945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
2954637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
2965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2991090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   radeonEmitState(&rmesa->radeon);
300b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   radeonEmitVertexAOS( rmesa,
301b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie			rmesa->radeon.swtcl.vertex_size,
302bbf2b5c4ffcb6755d34a5b698445aecf604e45fbPauli Nieminen			first_elem(&rmesa->radeon.dma.reserved)->bo,
303b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie			current_offset);
3045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
305b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie
306b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   radeonEmitVbufPrim( rmesa,
307b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie		       rmesa->swtcl.vertex_format,
308b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie		       rmesa->radeon.swtcl.hw_primitive,
309b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie		       rmesa->radeon.swtcl.numverts);
3105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
31197029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen
31297029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen   rmesa->radeon.swtcl.primitive_counter = 0;
31397029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen
3145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*
3175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Render unclipped vertex buffers by emitting vertices directly to
3185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * dma buffers.  Use strip/fan hardware primitives where possible.
3195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Try to simulate missing primitives with indexed vertices.
3205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
3215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_POINTS      1
3225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_LINES       1
3235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_LINE_STRIPS 1
3245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_TRIANGLES   1
3255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_TRI_STRIPS  1
3265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_TRI_STRIP_1 0
3275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_TRI_FANS    1
3285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_QUADS       0
3295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_QUAD_STRIPS 0
3305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_POLYGONS    0
3318a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt/* \todo: is it possible to make "ELTS" work with t_vertex code ? */
3328a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define HAVE_ELTS        0
3335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic const GLuint hw_prim[GL_POLYGON+1] = {
3355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_POINT,
3365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_LINE,
3375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   0,
3385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_LINE_STRIP,
3395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
3405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_STRIP,
3415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_FAN,
3425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   0,
3435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   0,
3445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   0
3455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
3465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3478e5479c7f806ffd57eed26c147e3ca227a39f0a7Brian Paulstatic INLINE void
3484637235183b80963536f2364e4d50fcb894886ddDave AirlieradeonDmaPrimitive( r100ContextPtr rmesa, GLenum prim )
3495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
3505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_NEWPRIM( rmesa );
351b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.hw_primitive = hw_prim[prim];
352b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   //   assert(rmesa->radeon.dma.current.ptr == rmesa->radeon.dma.current.start);
3535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3554637235183b80963536f2364e4d50fcb894886ddDave Airlie#define LOCAL_VARS r100ContextPtr rmesa = R100_CONTEXT(ctx)
3565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define INIT( prim ) radeonDmaPrimitive( rmesa, prim )
3572dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell#define FLUSH()  RADEON_NEWPRIM( rmesa )
358b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie#define GET_CURRENT_VB_MAX_VERTS()					10\
359b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie//  (((int)rmesa->radeon.dma.current.end - (int)rmesa->radeon.dma.current.ptr) / (rmesa->radeon.swtcl.vertex_size*4))
3605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define GET_SUBSEQUENT_VB_MAX_VERTS() \
361b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie  ((RADEON_BUFFER_SIZE) / (rmesa->radeon.swtcl.vertex_size*4))
3622dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell#define ALLOC_VERTS( nr ) \
363b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie  rcommonAllocDmaLowVerts( &rmesa->radeon, nr, rmesa->radeon.swtcl.vertex_size * 4 )
3642dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell#define EMIT_VERTS( ctx, j, nr, buf ) \
3658a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt  _tnl_emit_vertices_to_buffer(ctx, j, (j)+(nr), buf)
3662dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell
3675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) radeon_dma_##x
3685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_dmatmp.h"
3695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
3725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*                          Render pipeline stage                     */
3735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
3745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic GLboolean radeon_run_render( GLcontext *ctx,
37757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell				    struct tnl_pipeline_stage *stage )
3785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
3794637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
3805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNLcontext *tnl = TNL_CONTEXT(ctx);
3815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   struct vertex_buffer *VB = &tnl->vb;
3823d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_render_func *tab = TAG(render_tab_verts);
3838592ba94b85b3f0f93ae875eece259b4626a6759Keith Whitwell   GLuint i;
3845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
385b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   if (rmesa->radeon.swtcl.RenderIndex != 0 ||
3862dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell       !radeon_dma_validate_render( ctx, VB ))
3875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return GL_TRUE;
3885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.Start( ctx );
3905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
39157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   for (i = 0 ; i < VB->PrimitiveCount ; i++)
3925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
39357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      GLuint prim = VB->Primitive[i].mode;
39457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      GLuint start = VB->Primitive[i].start;
39557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      GLuint length = VB->Primitive[i].count;
39657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
39757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      if (!length)
39857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 continue;
3995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (RADEON_DEBUG & DEBUG_PRIMS)
4012dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell	 fprintf(stderr, "radeon_render.c: prim %s %d..%d\n",
40257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell		 _mesa_lookup_enum_by_nr(prim & PRIM_MODE_MASK),
40357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell		 start, start+length);
4045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (length)
4068592ba94b85b3f0f93ae875eece259b4626a6759Keith Whitwell	 tab[prim & PRIM_MODE_MASK]( ctx, start, start + length, prim );
4075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.Finish( ctx );
4105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return GL_FALSE;		/* finished the pipe */
4125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
41657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwellconst struct tnl_pipeline_stage _radeon_render_stage =
4175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "radeon render",
419bf87f864934e174b3493592d5d107f012aac0842Keith Whitwell   NULL,
420bf87f864934e174b3493592d5d107f012aac0842Keith Whitwell   NULL,
421bf87f864934e174b3493592d5d107f012aac0842Keith Whitwell   NULL,
422bf87f864934e174b3493592d5d107f012aac0842Keith Whitwell   NULL,
4235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeon_run_render		/* run */
4245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
4255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**************************************************************************/
4285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic const GLuint reduced_hw_prim[GL_POLYGON+1] = {
4315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_POINT,
4325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_LINE,
4335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_LINE,
4345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_LINE,
4355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
4365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
4375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
4385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
4395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
4405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST
4415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
4425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonRasterPrimitive( GLcontext *ctx, GLuint hwprim );
4445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonRenderPrimitive( GLcontext *ctx, GLenum prim );
4455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonResetLineStipple( GLcontext *ctx );
4465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/***********************************************************************
4495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *                    Emit primitives as inline vertices               *
4505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/
4515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef LOCAL_VARS
4532dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell#undef ALLOC_VERTS
4544637235183b80963536f2364e4d50fcb894886ddDave Airlie#define CTX_ARG r100ContextPtr rmesa
455b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie#define GET_VERTEX_DWORDS() rmesa->radeon.swtcl.vertex_size
456b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie#define ALLOC_VERTS( n, size ) rcommonAllocDmaLowVerts( &rmesa->radeon, n, (size) * 4 )
4575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef LOCAL_VARS
4585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define LOCAL_VARS						\
4594637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);		\
460b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   const char *radeonverts = (char *)rmesa->radeon.swtcl.verts;
4618a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define VERT(x) (radeonVertex *)(radeonverts + ((x) * (vertsize) * sizeof(int)))
4625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERTEX radeonVertex
4635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef TAG
4645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) radeon_##x
4655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_triemit.h"
4665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/***********************************************************************
4695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *          Macros for t_dd_tritmp.h to draw basic primitives          *
4705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/
4715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define QUAD( a, b, c, d ) radeon_quad( rmesa, a, b, c, d )
4735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TRI( a, b, c )     radeon_triangle( rmesa, a, b, c )
4745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define LINE( a, b )       radeon_line( rmesa, a, b )
4755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define POINT( a )         radeon_point( rmesa, a )
4765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/***********************************************************************
4785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *              Build render functions from dd templates               *
4795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/
4805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RADEON_TWOSIDE_BIT	0x01
4825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RADEON_UNFILLED_BIT	0x02
48330daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger#define RADEON_MAX_TRIFUNC	0x04
4845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic struct {
4873d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_points_func	        points;
4883d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_line_func		line;
4893d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_triangle_func	triangle;
4903d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_quad_func		quad;
4915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} rast_tab[RADEON_MAX_TRIFUNC];
4925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_FALLBACK  0
495bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl#define DO_OFFSET    0
4965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_UNFILLED (IND & RADEON_UNFILLED_BIT)
4975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_TWOSIDE  (IND & RADEON_TWOSIDE_BIT)
4985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_FLAT      0
4995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_TRI       1
5005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_QUAD      1
5015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_LINE      1
5025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_POINTS    1
5035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_FULL_QUAD 1
5045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_RGBA   1
5065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_SPEC   1
5075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_BACK_COLORS  0
5085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_HW_FLATSHADE 1
5095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAB rast_tab
5105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DEPTH_SCALE 1.0
5125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define UNFILLED_TRI unfilled_tri
5135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define UNFILLED_QUAD unfilled_quad
5145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERT_X(_v) _v->v.x
5155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERT_Y(_v) _v->v.y
5165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERT_Z(_v) _v->v.z
5175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define AREA_IS_CCW( a ) (a < 0)
518b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie#define GET_VERTEX(e) (rmesa->radeon.swtcl.verts + ((e) * rmesa->radeon.swtcl.vertex_size * sizeof(int)))
5195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
520c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell#define VERT_SET_RGBA( v, c )  					\
521c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwelldo {								\
522c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   radeon_color_t *color = (radeon_color_t *)&((v)->ui[coloroffset]);	\
523c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   UNCLAMPED_FLOAT_TO_UBYTE(color->red, (c)[0]);		\
524c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   UNCLAMPED_FLOAT_TO_UBYTE(color->green, (c)[1]);		\
525c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   UNCLAMPED_FLOAT_TO_UBYTE(color->blue, (c)[2]);		\
526c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   UNCLAMPED_FLOAT_TO_UBYTE(color->alpha, (c)[3]);		\
527c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell} while (0)
528c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell
5295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERT_COPY_RGBA( v0, v1 ) v0->ui[coloroffset] = v1->ui[coloroffset]
530c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell
5318a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define VERT_SET_SPEC( v, c )					\
532c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwelldo {								\
5338a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   if (specoffset) {						\
5348a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      radeon_color_t *spec = (radeon_color_t *)&((v)->ui[specoffset]);	\
5358a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      UNCLAMPED_FLOAT_TO_UBYTE(spec->red, (c)[0]);	\
5368a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      UNCLAMPED_FLOAT_TO_UBYTE(spec->green, (c)[1]);	\
5378a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      UNCLAMPED_FLOAT_TO_UBYTE(spec->blue, (c)[2]);	\
538c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   }								\
539c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell} while (0)
540c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell#define VERT_COPY_SPEC( v0, v1 )			\
541c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwelldo {							\
5428a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   if (specoffset) {					\
5438a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      radeon_color_t *spec0 = (radeon_color_t *)&((v0)->ui[specoffset]);	\
5448a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      radeon_color_t *spec1 = (radeon_color_t *)&((v1)->ui[specoffset]);	\
5458a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      spec0->red   = spec1->red;	\
5468a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      spec0->green = spec1->green;	\
5478a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      spec0->blue  = spec1->blue; 	\
548c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   }							\
549c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell} while (0)
550c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell
551c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell/* These don't need LE32_TO_CPU() as they used to save and restore
552c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell * colors which are already in the correct format.
553c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell */
554c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell#define VERT_SAVE_RGBA( idx )    color[idx] = v[idx]->ui[coloroffset]
555c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell#define VERT_RESTORE_RGBA( idx ) v[idx]->ui[coloroffset] = color[idx]
5568a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define VERT_SAVE_SPEC( idx )    if (specoffset) spec[idx] = v[idx]->ui[specoffset]
5578a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define VERT_RESTORE_SPEC( idx ) if (specoffset) v[idx]->ui[specoffset] = spec[idx]
5585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef LOCAL_VARS
5605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef TAG
5615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef INIT
5625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define LOCAL_VARS(n)							\
5644637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);			\
565c3374bf97ecd82b915fb29c7c04951e2b75d4dbcPauli Nieminen   GLuint color[n] = {0}, spec[n] = {0};						\
5668a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   GLuint coloroffset = rmesa->swtcl.coloroffset;	\
5678a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   GLuint specoffset = rmesa->swtcl.specoffset;			\
5688a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   (void) color; (void) spec; (void) coloroffset; (void) specoffset;
5695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/***********************************************************************
5715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *                Helpers for rendering unfilled primitives            *
5725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/
5735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RASTERIZE(x) radeonRasterPrimitive( ctx, reduced_hw_prim[x] )
575b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie#define RENDER_PRIMITIVE rmesa->radeon.swtcl.render_primitive
5765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef TAG
5775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x
5785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_unfilled.h"
5795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef IND
5805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/***********************************************************************
5835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *                      Generate GL render functions                   *
5845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/
5855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define IND (0)
5885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x
5895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_tritmp.h"
5905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define IND (RADEON_TWOSIDE_BIT)
5925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x##_twoside
5935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_tritmp.h"
5945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define IND (RADEON_UNFILLED_BIT)
5965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x##_unfilled
5975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_tritmp.h"
5985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define IND (RADEON_TWOSIDE_BIT|RADEON_UNFILLED_BIT)
6005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x##_twoside_unfilled
6015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_tritmp.h"
6025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void init_rast_tab( void )
6055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
6065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   init();
6075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   init_twoside();
6085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   init_unfilled();
6095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   init_twoside_unfilled();
6105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
6115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
6135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*               Render unclipped begin/end objects                   */
6145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
6155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RENDER_POINTS( start, count )		\
6175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   for ( ; start < count ; start++)		\
6185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeon_point( rmesa, VERT(start) )
6195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RENDER_LINE( v0, v1 ) \
6205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeon_line( rmesa, VERT(v0), VERT(v1) )
6215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RENDER_TRI( v0, v1, v2 )  \
6225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeon_triangle( rmesa, VERT(v0), VERT(v1), VERT(v2) )
6235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RENDER_QUAD( v0, v1, v2, v3 ) \
6245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeon_quad( rmesa, VERT(v0), VERT(v1), VERT(v2), VERT(v3) )
6255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef INIT
6265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define INIT(x) do {					\
6275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonRenderPrimitive( ctx, x );			\
6285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} while (0)
6295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef LOCAL_VARS
6305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define LOCAL_VARS						\
6314637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);		\
632b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   const GLuint vertsize = rmesa->radeon.swtcl.vertex_size;		\
633b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   const char *radeonverts = (char *)rmesa->radeon.swtcl.verts;		\
6345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   const GLuint * const elt = TNL_CONTEXT(ctx)->vb.Elts;	\
6355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   const GLboolean stipple = ctx->Line.StippleFlag;		\
6365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   (void) elt; (void) stipple;
6375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RESET_STIPPLE	if ( stipple ) radeonResetLineStipple( ctx );
6385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RESET_OCCLUSION
6395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define PRESERVE_VB_DEFS
6405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define ELT(x) (x)
6415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) radeon_##x##_verts
6425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/t_vb_rendertmp.h"
6435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef ELT
6445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef TAG
6455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) radeon_##x##_elts
6465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define ELT(x) elt[x]
6475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/t_vb_rendertmp.h"
6485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
6525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*                    Choose render functions                         */
6535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
6545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonChooseRenderState( GLcontext *ctx )
6565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
6575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNLcontext *tnl = TNL_CONTEXT(ctx);
6584637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
6595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint index = 0;
6605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint flags = ctx->_TriangleCaps;
6615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6624637235183b80963536f2364e4d50fcb894886ddDave Airlie   if (!rmesa->radeon.TclFallback || rmesa->radeon.Fallback)
6635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
6645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (flags & DD_TRI_LIGHT_TWOSIDE) index |= RADEON_TWOSIDE_BIT;
6665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (flags & DD_TRI_UNFILLED)      index |= RADEON_UNFILLED_BIT;
6675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
668b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   if (index != rmesa->radeon.swtcl.RenderIndex) {
6695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tnl->Driver.Render.Points = rast_tab[index].points;
6705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tnl->Driver.Render.Line = rast_tab[index].line;
6715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tnl->Driver.Render.ClippedLine = rast_tab[index].line;
6725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tnl->Driver.Render.Triangle = rast_tab[index].triangle;
6735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tnl->Driver.Render.Quad = rast_tab[index].quad;
6745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (index == 0) {
6765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.PrimTabVerts = radeon_render_tab_verts;
6775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.PrimTabElts = radeon_render_tab_elts;
6785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.ClippedPolygon = radeon_fast_clipped_poly;
6795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
6805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.PrimTabVerts = _tnl_render_tab_verts;
6815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.PrimTabElts = _tnl_render_tab_elts;
6825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.ClippedPolygon = _tnl_RenderClippedPolygon;
6835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
6845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
685b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie      rmesa->radeon.swtcl.RenderIndex = index;
6865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
6875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
6885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
6915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*                 High level hooks for t_vb_render.c                 */
6925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
6935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonRasterPrimitive( GLcontext *ctx, GLuint hwprim )
6965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
6974637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
6985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
699b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   if (rmesa->radeon.swtcl.hw_primitive != hwprim) {
7005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_NEWPRIM( rmesa );
701b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie      rmesa->radeon.swtcl.hw_primitive = hwprim;
7025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonRenderPrimitive( GLcontext *ctx, GLenum prim )
7065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7074637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
708b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.render_primitive = prim;
7095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (prim < GL_TRIANGLES || !(ctx->_TriangleCaps & DD_TRI_UNFILLED))
7105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonRasterPrimitive( ctx, reduced_hw_prim[prim] );
7115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonRenderFinish( GLcontext *ctx )
7145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonResetLineStipple( GLcontext *ctx )
7185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7194637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
7205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, lin );
7215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
7255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*           Transition to/from hardware rasterization.               */
7265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
7275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic const char * const fallbackStrings[] = {
7295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "Texture mode",
7305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "glDrawBuffer(GL_FRONT_AND_BACK)",
7315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "glEnable(GL_STENCIL) without hw stencil buffer",
7325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "glRenderMode(selection or feedback)",
7335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "glBlendEquation",
7345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "glBlendFunc",
7355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "RADEON_NO_RAST",
7365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "Mixing GL_CLAMP_TO_BORDER and GL_CLAMP (or GL_MIRROR_CLAMP_ATI)"
7375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
7385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic const char *getFallbackString(GLuint bit)
7415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int i = 0;
7435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   while (bit > 1) {
7445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      i++;
7455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      bit >>= 1;
7465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return fallbackStrings[i];
7485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonFallback( GLcontext *ctx, GLuint bit, GLboolean mode )
7525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7534637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
7545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNLcontext *tnl = TNL_CONTEXT(ctx);
7554637235183b80963536f2364e4d50fcb894886ddDave Airlie   GLuint oldfallback = rmesa->radeon.Fallback;
7565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (mode) {
7584637235183b80963536f2364e4d50fcb894886ddDave Airlie      rmesa->radeon.Fallback |= bit;
7595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (oldfallback == 0) {
7601090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie	 radeon_firevertices(&rmesa->radeon);
7615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_RASTER, GL_TRUE );
7625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 _swsetup_Wakeup( ctx );
763b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie	 rmesa->radeon.swtcl.RenderIndex = ~0;
7645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         if (RADEON_DEBUG & DEBUG_FALLBACKS) {
7655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul            fprintf(stderr, "Radeon begin rasterization fallback: 0x%x %s\n",
7665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                    bit, getFallbackString(bit));
7675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         }
7685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
7695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else {
7714637235183b80963536f2364e4d50fcb894886ddDave Airlie      rmesa->radeon.Fallback &= ~bit;
7725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (oldfallback == bit) {
7735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 _swrast_flush( ctx );
7745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.Start = radeonRenderStart;
7755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.PrimitiveNotify = radeonRenderPrimitive;
7765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.Finish = radeonRenderFinish;
7778a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
7788a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 tnl->Driver.Render.BuildVertices = _tnl_build_vertices;
7798a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 tnl->Driver.Render.CopyPV = _tnl_copy_pv;
7808a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 tnl->Driver.Render.Interp = _tnl_interp;
7818a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
7825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.ResetLineStipple = radeonResetLineStipple;
7835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_RASTER, GL_FALSE );
7844637235183b80963536f2364e4d50fcb894886ddDave Airlie	 if (rmesa->radeon.TclFallback) {
7854637235183b80963536f2364e4d50fcb894886ddDave Airlie	    /* These are already done if rmesa->radeon.TclFallback goes to
7865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	     * zero above. But not if it doesn't (RADEON_NO_TCL for
7875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	     * example?)
7885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	     */
789555b5fac4f47576f04d8e4159dc22f72a2b0a397Roland Scheidegger	    _tnl_invalidate_vertex_state( ctx, ~0 );
790555b5fac4f47576f04d8e4159dc22f72a2b0a397Roland Scheidegger	    _tnl_invalidate_vertices( ctx, ~0 );
7914637235183b80963536f2364e4d50fcb894886ddDave Airlie	    RENDERINPUTS_ZERO( rmesa->radeon.tnl_index_bitset );
7925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    radeonChooseVertexState( ctx );
7935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    radeonChooseRenderState( ctx );
7945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
7955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         if (RADEON_DEBUG & DEBUG_FALLBACKS) {
7965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul            fprintf(stderr, "Radeon end rasterization fallback: 0x%x %s\n",
7975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                    bit, getFallbackString(bit));
7985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         }
7995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
8005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
8025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
8055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*                            Initialization.                         */
8065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
8075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonInitSwtcl( GLcontext *ctx )
8095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
8105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNLcontext *tnl = TNL_CONTEXT(ctx);
8114637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
8125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   static int firsttime = 1;
8135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (firsttime) {
8155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      init_rast_tab();
8165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      firsttime = 0;
81797029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen      rmesa->radeon.swtcl.primitive_counter = 0;
8185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.Start = radeonRenderStart;
8215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.Finish = radeonRenderFinish;
8225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.PrimitiveNotify = radeonRenderPrimitive;
8235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.ResetLineStipple = radeonResetLineStipple;
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;
8275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8288a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   _tnl_init_vertices( ctx, ctx->Const.MaxArrayLockSize + 12,
8298a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt		       RADEON_MAX_TNL_VERTEX_SIZE);
8308a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
831b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.verts = (GLubyte *)tnl->clipspace.vertex_buf;
832b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.RenderIndex = ~0;
833b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.render_primitive = GL_TRIANGLES;
834b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.hw_primitive = 0;
8355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
8365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
837