radeon_swtcl.c revision b194b9b23801cd716244047b0b9b8bd9be518b78
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
43facf368df29b6889e9566aaa642aa1937e6dfc56Vinson Lee#include "math/m_xform.h"
44facf368df29b6889e9566aaa642aa1937e6dfc56Vinson Lee
455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "swrast_setup/swrast_setup.h"
46facf368df29b6889e9566aaa642aa1937e6dfc56Vinson Lee
475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/tnl.h"
485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/t_context.h"
495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/t_pipeline.h"
505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_context.h"
525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_ioctl.h"
535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_state.h"
545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_swtcl.h"
555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_tcl.h"
564e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen#include "radeon_debug.h"
575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
598a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt/* R100: xyzw, c0, c1/fog, stq[0..2]  = 4+1+1+3*3 = 15  right? */
608a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt/* R200: xyzw, c0, c1/fog, strq[0..5] = 4+1+1+4*6 = 30 */
618a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define RADEON_MAX_TNL_VERTEX_SIZE (15 * sizeof(GLfloat))	/* for mesa _tnl stage */
625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/***********************************************************************
648a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt *                         Initialization
655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/
665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
678a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define EMIT_ATTR( ATTR, STYLE, F0 )					\
688a1df968627de01d04f3d692fd81108ba6492c18Eric Anholtdo {									\
69b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].attrib = (ATTR);	\
70b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].format = (STYLE);	\
71b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.vertex_attr_count++;					\
728a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   fmt_0 |= F0;								\
738a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt} while (0)
745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
758a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define EMIT_PAD( N )							\
768a1df968627de01d04f3d692fd81108ba6492c18Eric Anholtdo {									\
77b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].attrib = 0;		\
78b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].format = EMIT_PAD;	\
79b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].offset = (N);		\
80b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.vertex_attr_count++;					\
818a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt} while (0)
825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
838a1df968627de01d04f3d692fd81108ba6492c18Eric Anholtstatic GLuint radeon_cp_vc_frmts[3][2] =
848a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt{
858a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   { RADEON_CP_VC_FRMT_ST0, RADEON_CP_VC_FRMT_ST0 | RADEON_CP_VC_FRMT_Q0 },
868a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   { RADEON_CP_VC_FRMT_ST1, RADEON_CP_VC_FRMT_ST1 | RADEON_CP_VC_FRMT_Q1 },
878a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   { RADEON_CP_VC_FRMT_ST2, RADEON_CP_VC_FRMT_ST2 | RADEON_CP_VC_FRMT_Q2 },
888a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt};
895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
90f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonSetVertexFormat( struct gl_context *ctx )
918a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt{
924637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT( ctx );
938a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   TNLcontext *tnl = TNL_CONTEXT(ctx);
948a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   struct vertex_buffer *VB = &tnl->vb;
95bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol   DECLARE_RENDERINPUTS(index_bitset);
968a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   int fmt_0 = 0;
978a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   int offset = 0;
985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
99bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol   RENDERINPUTS_COPY( index_bitset, tnl->render_inputs_bitset );
1005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1018a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   /* Important:
1028a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt    */
1038a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   if ( VB->NdcPtr != NULL ) {
1048a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      VB->AttribPtr[VERT_ATTRIB_POS] = VB->NdcPtr;
1058a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
1068a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   else {
1078a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      VB->AttribPtr[VERT_ATTRIB_POS] = VB->ClipPtr;
1088a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
1095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1108a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   assert( VB->AttribPtr[VERT_ATTRIB_POS] != NULL );
111b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.vertex_attr_count = 0;
1128a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
1138a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   /* EMIT_ATTR's must be in order as they tell t_vertex.c how to
1148a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt    * build up a hardware vertex.
1158a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt    */
1168a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   if ( !rmesa->swtcl.needproj ||
117bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol        RENDERINPUTS_TEST_RANGE( index_bitset, _TNL_FIRST_TEX, _TNL_LAST_TEX )) {	/* for projtex */
1188a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_4F,
1198a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt		 RADEON_CP_VC_FRMT_XY |	RADEON_CP_VC_FRMT_Z | RADEON_CP_VC_FRMT_W0 );
1208a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      offset = 4;
1218a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
1228a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   else {
1238a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_3F,
1248a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt		 RADEON_CP_VC_FRMT_XY |	RADEON_CP_VC_FRMT_Z );
1258a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      offset = 3;
1268a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
1275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1288a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   rmesa->swtcl.coloroffset = offset;
1298a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#if MESA_LITTLE_ENDIAN
1308a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   EMIT_ATTR( _TNL_ATTRIB_COLOR0, EMIT_4UB_4F_RGBA,
1318a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	      RADEON_CP_VC_FRMT_PKCOLOR );
1328a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#else
1338a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   EMIT_ATTR( _TNL_ATTRIB_COLOR0, EMIT_4UB_4F_ABGR,
1348a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	      RADEON_CP_VC_FRMT_PKCOLOR );
1358a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#endif
1368a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   offset += 1;
1375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1388a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   rmesa->swtcl.specoffset = 0;
139bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol   if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_COLOR1 ) ||
140bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol       RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_FOG )) {
1415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1428a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#if MESA_LITTLE_ENDIAN
143bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol      if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_COLOR1 )) {
1448a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 rmesa->swtcl.specoffset = offset;
1458a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_ATTR( _TNL_ATTRIB_COLOR1, EMIT_3UB_3F_RGB,
1468a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 	    RADEON_CP_VC_FRMT_PKSPEC );
1478a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1488a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      else {
1498a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_PAD( 3 );
1508a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
152bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol      if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_FOG )) {
1538a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_ATTR( _TNL_ATTRIB_FOG, EMIT_1UB_1F,
1548a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 	    RADEON_CP_VC_FRMT_PKSPEC );
1558a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1568a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      else {
1578a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_PAD( 1 );
1588a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1598a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#else
160bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol      if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_FOG )) {
1618a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_ATTR( _TNL_ATTRIB_FOG, EMIT_1UB_1F,
1628a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 	    RADEON_CP_VC_FRMT_PKSPEC );
1638a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1648a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      else {
1658a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_PAD( 1 );
1668a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
168bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol      if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_COLOR1 )) {
1698a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 rmesa->swtcl.specoffset = offset;
1708a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_ATTR( _TNL_ATTRIB_COLOR1, EMIT_3UB_3F_BGR,
1718a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 	    RADEON_CP_VC_FRMT_PKSPEC );
1728a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1738a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      else {
1748a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_PAD( 3 );
1758a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1768a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#endif
1778a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
1785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
179bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol   if (RENDERINPUTS_TEST_RANGE( index_bitset, _TNL_FIRST_TEX, _TNL_LAST_TEX )) {
1808a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      int i;
1818a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
1828a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
183bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol	 if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX(i) )) {
184df582ca767a38f185f9b4c449e7ed4266c414ae2Eric Anholt	    GLuint sz = VB->AttribPtr[_TNL_ATTRIB_TEX0 + i]->size;
1858a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
1868a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    switch (sz) {
1878a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    case 1:
1888a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    case 2:
1898a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	       EMIT_ATTR( _TNL_ATTRIB_TEX0+i, EMIT_2F,
1908a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt			  radeon_cp_vc_frmts[i][0] );
1918a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	       break;
192247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	    case 3:
1938a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    case 4:
194247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	       if (ctx->Texture.Unit[i]._ReallyEnabled & (TEXTURE_CUBE_BIT) ) {
195247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger		  EMIT_ATTR( _TNL_ATTRIB_TEX0+i, EMIT_3F,
196247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger			     radeon_cp_vc_frmts[i][1] );
197247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	       } else {
198247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger		  EMIT_ATTR( _TNL_ATTRIB_TEX0+i, EMIT_3F_XYW,
199247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger			     radeon_cp_vc_frmts[i][1] );
200247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	       }
2018a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	       break;
2028a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    default:
2038a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	       continue;
2048a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    };
2058a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 }
2068a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
2078a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
2085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2094637235183b80963536f2364e4d50fcb894886ddDave Airlie   if (!RENDERINPUTS_EQUAL( rmesa->radeon.tnl_index_bitset, index_bitset ) ||
2108a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	fmt_0 != rmesa->swtcl.vertex_format) {
2118a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      RADEON_NEWPRIM(rmesa);
2128a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      rmesa->swtcl.vertex_format = fmt_0;
213b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie      rmesa->radeon.swtcl.vertex_size =
2148a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	  _tnl_install_attrs( ctx,
215b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie			      rmesa->radeon.swtcl.vertex_attrs,
216b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie			      rmesa->radeon.swtcl.vertex_attr_count,
2178a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt			      NULL, 0 );
218b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie      rmesa->radeon.swtcl.vertex_size /= 4;
2194637235183b80963536f2364e4d50fcb894886ddDave Airlie      RENDERINPUTS_COPY( rmesa->radeon.tnl_index_bitset, index_bitset );
2204e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen      radeon_print(RADEON_SWRENDER, RADEON_VERBOSE,
2214e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	  "%s: vertex_size= %d floats\n",  __FUNCTION__, rmesa->radeon.swtcl.vertex_size);
2228a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
2235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2250926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminenstatic void radeon_predict_emit_size( r100ContextPtr rmesa )
226570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen{
227570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen
228570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen    if (!rmesa->radeon.swtcl.emit_prediction) {
229570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen        const int state_size = radeonCountStateEmitSize( &rmesa->radeon );
230570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen        const int scissor_size = 8;
231570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen        const int prims_size = 8;
232570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen        const int vertex_size = 7;
233570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen
234570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen        if (rcommonEnsureCmdBufSpace(&rmesa->radeon,
235570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen                    state_size +
236570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen                    (scissor_size + prims_size + vertex_size),
237570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen                    __FUNCTION__))
238570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen            rmesa->radeon.swtcl.emit_prediction = radeonCountStateEmitSize( &rmesa->radeon );
239570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen        else
240570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen            rmesa->radeon.swtcl.emit_prediction = state_size;
241570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen        rmesa->radeon.swtcl.emit_prediction += scissor_size + prims_size + vertex_size
242570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen            + rmesa->radeon.cmdbuf.cs->cdw;
243570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen    }
244570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen}
2455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
246f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonRenderStart( struct gl_context *ctx )
2475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
24897029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen    r100ContextPtr rmesa = R100_CONTEXT( ctx );
24997029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen
25097029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen    radeonSetVertexFormat( ctx );
25197029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen
25297029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen    if (rmesa->radeon.dma.flush != 0 &&
25397029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen            rmesa->radeon.dma.flush != rcommon_flush_last_swtcl_prim)
25497029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen        rmesa->radeon.dma.flush( ctx );
2555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2588a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt/**
2598a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt * Set vertex state for SW TCL.  The primary purpose of this function is to
2608a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt * determine in advance whether or not the hardware can / should do the
2618a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt * projection divide or Mesa should do it.
2628a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt */
263f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid radeonChooseVertexState( struct gl_context *ctx )
2645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
2654637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT( ctx );
2665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNLcontext *tnl = TNL_CONTEXT(ctx);
2675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
26825847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger   GLuint se_coord_fmt = rmesa->hw.set.cmd[SET_SE_COORDFMT];
26925847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger
27025847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger   se_coord_fmt &= ~(RADEON_VTX_XY_PRE_MULT_1_OVER_W0 |
27125847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger		     RADEON_VTX_Z_PRE_MULT_1_OVER_W0 |
27225847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger		     RADEON_VTX_W0_IS_NOT_1_OVER_W0);
2735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2743f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt   /* We must ensure that we don't do _tnl_need_projected_coords while in a
2753f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt    * rasterization fallback.  As this function will be called again when we
2763f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt    * leave a rasterization fallback, we can just skip it for now.
2773f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt    */
2784637235183b80963536f2364e4d50fcb894886ddDave Airlie   if (rmesa->radeon.Fallback != 0)
2793f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt      return;
2803f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt
2818a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   /* HW perspective divide is a win, but tiny vertex formats are a
2828a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt    * bigger one.
2838a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt    */
2845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
285bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol   if ((!RENDERINPUTS_TEST_RANGE( tnl->render_inputs_bitset, _TNL_FIRST_TEX, _TNL_LAST_TEX ) &&
286bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol       !RENDERINPUTS_TEST( tnl->render_inputs_bitset, _TNL_ATTRIB_COLOR1 ))
287bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol       || (ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED))) {
2888a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      rmesa->swtcl.needproj = GL_TRUE;
28925847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger      se_coord_fmt |= (RADEON_VTX_XY_PRE_MULT_1_OVER_W0 |
29025847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger		      RADEON_VTX_Z_PRE_MULT_1_OVER_W0);
2915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else {
2938a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      rmesa->swtcl.needproj = GL_FALSE;
29425847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger      se_coord_fmt |= (RADEON_VTX_W0_IS_NOT_1_OVER_W0);
2955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2978a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   _tnl_need_projected_coords( ctx, rmesa->swtcl.needproj );
2985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2998a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   if ( se_coord_fmt != rmesa->hw.set.cmd[SET_SE_COORDFMT] ) {
3008a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      RADEON_STATECHANGE( rmesa, set );
3018a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      rmesa->hw.set.cmd[SET_SE_COORDFMT] = se_coord_fmt;
3025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
305f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid r100_swtcl_flush(struct gl_context *ctx, uint32_t current_offset)
3065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
3074637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
3085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3111090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   radeonEmitState(&rmesa->radeon);
312b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   radeonEmitVertexAOS( rmesa,
313b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie			rmesa->radeon.swtcl.vertex_size,
314bd13e6e5e2403ada2098e3a07c0af4b4ba989ab7Dave Airlie			rmesa->radeon.swtcl.bo,
315b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie			current_offset);
3165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
317b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie
318b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   radeonEmitVbufPrim( rmesa,
319b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie		       rmesa->swtcl.vertex_format,
320b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie		       rmesa->radeon.swtcl.hw_primitive,
321b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie		       rmesa->radeon.swtcl.numverts);
322570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen   if ( rmesa->radeon.swtcl.emit_prediction < rmesa->radeon.cmdbuf.cs->cdw )
323570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen     WARN_ONCE("Rendering was %d commands larger than predicted size."
324570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen	 " We might overflow  command buffer.\n",
325570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen	 rmesa->radeon.cmdbuf.cs->cdw - rmesa->radeon.swtcl.emit_prediction );
3265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
32797029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen
328570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen   rmesa->radeon.swtcl.emit_prediction = 0;
32997029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen
3305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*
3335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Render unclipped vertex buffers by emitting vertices directly to
3345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * dma buffers.  Use strip/fan hardware primitives where possible.
3355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Try to simulate missing primitives with indexed vertices.
3365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
3375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_POINTS      1
3385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_LINES       1
3395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_LINE_STRIPS 1
3405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_TRIANGLES   1
3415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_TRI_STRIPS  1
3425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_TRI_STRIP_1 0
3435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_TRI_FANS    1
3445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_QUADS       0
3455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_QUAD_STRIPS 0
3465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_POLYGONS    0
3478a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt/* \todo: is it possible to make "ELTS" work with t_vertex code ? */
3488a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define HAVE_ELTS        0
3495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic const GLuint hw_prim[GL_POLYGON+1] = {
3515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_POINT,
3525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_LINE,
3535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   0,
3545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_LINE_STRIP,
3555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
3565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_STRIP,
3575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_FAN,
3585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   0,
3595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   0,
3605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   0
3615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
3625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3638e5479c7f806ffd57eed26c147e3ca227a39f0a7Brian Paulstatic INLINE void
3644637235183b80963536f2364e4d50fcb894886ddDave AirlieradeonDmaPrimitive( r100ContextPtr rmesa, GLenum prim )
3655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
3665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_NEWPRIM( rmesa );
367b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.hw_primitive = hw_prim[prim];
368b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   //   assert(rmesa->radeon.dma.current.ptr == rmesa->radeon.dma.current.start);
3695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3710926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminenstatic void* radeon_alloc_verts( r100ContextPtr rmesa , GLuint nr, GLuint size )
3720926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen{
3730926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen   void *rv;
3740926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen   do {
3750926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen     radeon_predict_emit_size( rmesa );
3760926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen     rv = rcommonAllocDmaLowVerts( &rmesa->radeon, nr, size );
3770926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen   } while (!rv);
3780926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen   return rv;
3790926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen}
3800926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen
3814637235183b80963536f2364e4d50fcb894886ddDave Airlie#define LOCAL_VARS r100ContextPtr rmesa = R100_CONTEXT(ctx)
3825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define INIT( prim ) radeonDmaPrimitive( rmesa, prim )
3832dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell#define FLUSH()  RADEON_NEWPRIM( rmesa )
384b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie#define GET_CURRENT_VB_MAX_VERTS()					10\
385b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie//  (((int)rmesa->radeon.dma.current.end - (int)rmesa->radeon.dma.current.ptr) / (rmesa->radeon.swtcl.vertex_size*4))
3865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define GET_SUBSEQUENT_VB_MAX_VERTS() \
387b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie  ((RADEON_BUFFER_SIZE) / (rmesa->radeon.swtcl.vertex_size*4))
3880926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen#define ALLOC_VERTS( nr ) radeon_alloc_verts( rmesa, nr, rmesa->radeon.swtcl.vertex_size * 4 )
3892dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell#define EMIT_VERTS( ctx, j, nr, buf ) \
3908a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt  _tnl_emit_vertices_to_buffer(ctx, j, (j)+(nr), buf)
3912dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell
3925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) radeon_dma_##x
3935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_dmatmp.h"
3945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
3975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*                          Render pipeline stage                     */
3985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
3995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
401f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic GLboolean radeon_run_render( struct gl_context *ctx,
40257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell				    struct tnl_pipeline_stage *stage )
4035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4044637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
4055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNLcontext *tnl = TNL_CONTEXT(ctx);
4065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   struct vertex_buffer *VB = &tnl->vb;
4073d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_render_func *tab = TAG(render_tab_verts);
4088592ba94b85b3f0f93ae875eece259b4626a6759Keith Whitwell   GLuint i;
4095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
410b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   if (rmesa->radeon.swtcl.RenderIndex != 0 ||
4112dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell       !radeon_dma_validate_render( ctx, VB ))
4125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return GL_TRUE;
4135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
414646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner   radeon_prepare_render(&rmesa->radeon);
415b194b9b23801cd716244047b0b9b8bd9be518b78Alex Deucher   if (rmesa->radeon.NewGLState)
416b194b9b23801cd716244047b0b9b8bd9be518b78Alex Deucher      radeonValidateState( ctx );
417646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner
4185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.Start( ctx );
4195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
42057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   for (i = 0 ; i < VB->PrimitiveCount ; i++)
4215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
42257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      GLuint prim = VB->Primitive[i].mode;
42357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      GLuint start = VB->Primitive[i].start;
42457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      GLuint length = VB->Primitive[i].count;
42557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
42657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      if (!length)
42757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 continue;
4285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4294e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen      radeon_print(RADEON_SWRENDER, RADEON_NORMAL,
4304e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	  "radeon_render.c: prim %s %d..%d\n",
43157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell		 _mesa_lookup_enum_by_nr(prim & PRIM_MODE_MASK),
43257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell		 start, start+length);
4335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (length)
4358592ba94b85b3f0f93ae875eece259b4626a6759Keith Whitwell	 tab[prim & PRIM_MODE_MASK]( ctx, start, start + length, prim );
4365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.Finish( ctx );
4395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return GL_FALSE;		/* finished the pipe */
4415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
44557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwellconst struct tnl_pipeline_stage _radeon_render_stage =
4465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "radeon render",
448bf87f864934e174b3493592d5d107f012aac0842Keith Whitwell   NULL,
449bf87f864934e174b3493592d5d107f012aac0842Keith Whitwell   NULL,
450bf87f864934e174b3493592d5d107f012aac0842Keith Whitwell   NULL,
451bf87f864934e174b3493592d5d107f012aac0842Keith Whitwell   NULL,
4525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeon_run_render		/* run */
4535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
4545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**************************************************************************/
4575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic const GLuint reduced_hw_prim[GL_POLYGON+1] = {
4605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_POINT,
4615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_LINE,
4625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_LINE,
4635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_LINE,
4645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
4655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
4665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
4675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
4685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
4695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST
4705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
4715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
472f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonRasterPrimitive( struct gl_context *ctx, GLuint hwprim );
473f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonRenderPrimitive( struct gl_context *ctx, GLenum prim );
474f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonResetLineStipple( struct gl_context *ctx );
4755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/***********************************************************************
4785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *                    Emit primitives as inline vertices               *
4795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/
4805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef LOCAL_VARS
4822dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell#undef ALLOC_VERTS
4834637235183b80963536f2364e4d50fcb894886ddDave Airlie#define CTX_ARG r100ContextPtr rmesa
484b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie#define GET_VERTEX_DWORDS() rmesa->radeon.swtcl.vertex_size
4850926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen#define ALLOC_VERTS( n, size ) radeon_alloc_verts( rmesa, n, (size) * 4 )
4865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef LOCAL_VARS
4875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define LOCAL_VARS						\
4884637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);		\
489b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   const char *radeonverts = (char *)rmesa->radeon.swtcl.verts;
4908a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define VERT(x) (radeonVertex *)(radeonverts + ((x) * (vertsize) * sizeof(int)))
4915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERTEX radeonVertex
4925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef TAG
4935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) radeon_##x
4945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_triemit.h"
4955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/***********************************************************************
4985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *          Macros for t_dd_tritmp.h to draw basic primitives          *
4995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/
5005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define QUAD( a, b, c, d ) radeon_quad( rmesa, a, b, c, d )
5025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TRI( a, b, c )     radeon_triangle( rmesa, a, b, c )
5035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define LINE( a, b )       radeon_line( rmesa, a, b )
5045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define POINT( a )         radeon_point( rmesa, a )
5055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/***********************************************************************
5075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *              Build render functions from dd templates               *
5085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/
5095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RADEON_TWOSIDE_BIT	0x01
5115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RADEON_UNFILLED_BIT	0x02
51230daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger#define RADEON_MAX_TRIFUNC	0x04
5135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic struct {
5163d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_points_func	        points;
5173d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_line_func		line;
5183d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_triangle_func	triangle;
5193d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_quad_func		quad;
5205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} rast_tab[RADEON_MAX_TRIFUNC];
5215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_FALLBACK  0
524bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl#define DO_OFFSET    0
5255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_UNFILLED (IND & RADEON_UNFILLED_BIT)
5265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_TWOSIDE  (IND & RADEON_TWOSIDE_BIT)
5275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_FLAT      0
5285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_TRI       1
5295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_QUAD      1
5305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_LINE      1
5315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_POINTS    1
5325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_FULL_QUAD 1
5335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_SPEC   1
5355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_BACK_COLORS  0
5365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_HW_FLATSHADE 1
5375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAB rast_tab
5385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DEPTH_SCALE 1.0
5405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define UNFILLED_TRI unfilled_tri
5415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define UNFILLED_QUAD unfilled_quad
5425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERT_X(_v) _v->v.x
5435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERT_Y(_v) _v->v.y
5445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERT_Z(_v) _v->v.z
5455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define AREA_IS_CCW( a ) (a < 0)
546b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie#define GET_VERTEX(e) (rmesa->radeon.swtcl.verts + ((e) * rmesa->radeon.swtcl.vertex_size * sizeof(int)))
5475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
548c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell#define VERT_SET_RGBA( v, c )  					\
549c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwelldo {								\
550c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   radeon_color_t *color = (radeon_color_t *)&((v)->ui[coloroffset]);	\
551c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   UNCLAMPED_FLOAT_TO_UBYTE(color->red, (c)[0]);		\
552c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   UNCLAMPED_FLOAT_TO_UBYTE(color->green, (c)[1]);		\
553c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   UNCLAMPED_FLOAT_TO_UBYTE(color->blue, (c)[2]);		\
554c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   UNCLAMPED_FLOAT_TO_UBYTE(color->alpha, (c)[3]);		\
555c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell} while (0)
556c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell
5575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERT_COPY_RGBA( v0, v1 ) v0->ui[coloroffset] = v1->ui[coloroffset]
558c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell
5598a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define VERT_SET_SPEC( v, c )					\
560c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwelldo {								\
5618a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   if (specoffset) {						\
5628a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      radeon_color_t *spec = (radeon_color_t *)&((v)->ui[specoffset]);	\
5638a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      UNCLAMPED_FLOAT_TO_UBYTE(spec->red, (c)[0]);	\
5648a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      UNCLAMPED_FLOAT_TO_UBYTE(spec->green, (c)[1]);	\
5658a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      UNCLAMPED_FLOAT_TO_UBYTE(spec->blue, (c)[2]);	\
566c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   }								\
567c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell} while (0)
568c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell#define VERT_COPY_SPEC( v0, v1 )			\
569c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwelldo {							\
5708a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   if (specoffset) {					\
5718a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      radeon_color_t *spec0 = (radeon_color_t *)&((v0)->ui[specoffset]);	\
5728a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      radeon_color_t *spec1 = (radeon_color_t *)&((v1)->ui[specoffset]);	\
5738a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      spec0->red   = spec1->red;	\
5748a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      spec0->green = spec1->green;	\
5758a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      spec0->blue  = spec1->blue; 	\
576c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   }							\
577c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell} while (0)
578c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell
579c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell/* These don't need LE32_TO_CPU() as they used to save and restore
580c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell * colors which are already in the correct format.
581c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell */
582c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell#define VERT_SAVE_RGBA( idx )    color[idx] = v[idx]->ui[coloroffset]
583c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell#define VERT_RESTORE_RGBA( idx ) v[idx]->ui[coloroffset] = color[idx]
5848a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define VERT_SAVE_SPEC( idx )    if (specoffset) spec[idx] = v[idx]->ui[specoffset]
5858a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define VERT_RESTORE_SPEC( idx ) if (specoffset) v[idx]->ui[specoffset] = spec[idx]
5865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef LOCAL_VARS
5885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef TAG
5895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef INIT
5905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define LOCAL_VARS(n)							\
5924637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);			\
593c3374bf97ecd82b915fb29c7c04951e2b75d4dbcPauli Nieminen   GLuint color[n] = {0}, spec[n] = {0};						\
5948a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   GLuint coloroffset = rmesa->swtcl.coloroffset;	\
5958a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   GLuint specoffset = rmesa->swtcl.specoffset;			\
5968a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   (void) color; (void) spec; (void) coloroffset; (void) specoffset;
5975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/***********************************************************************
5995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *                Helpers for rendering unfilled primitives            *
6005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/
6015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RASTERIZE(x) radeonRasterPrimitive( ctx, reduced_hw_prim[x] )
603b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie#define RENDER_PRIMITIVE rmesa->radeon.swtcl.render_primitive
6045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef TAG
6055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x
6065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_unfilled.h"
6075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef IND
6085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/***********************************************************************
6115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *                      Generate GL render functions                   *
6125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/
6135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define IND (0)
6165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x
6175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_tritmp.h"
6185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define IND (RADEON_TWOSIDE_BIT)
6205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x##_twoside
6215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_tritmp.h"
6225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define IND (RADEON_UNFILLED_BIT)
6245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x##_unfilled
6255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_tritmp.h"
6265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define IND (RADEON_TWOSIDE_BIT|RADEON_UNFILLED_BIT)
6285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x##_twoside_unfilled
6295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_tritmp.h"
6305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void init_rast_tab( void )
6335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
6345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   init();
6355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   init_twoside();
6365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   init_unfilled();
6375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   init_twoside_unfilled();
6385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
6395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
6415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*               Render unclipped begin/end objects                   */
6425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
6435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RENDER_POINTS( start, count )		\
6455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   for ( ; start < count ; start++)		\
6465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeon_point( rmesa, VERT(start) )
6475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RENDER_LINE( v0, v1 ) \
6485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeon_line( rmesa, VERT(v0), VERT(v1) )
6495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RENDER_TRI( v0, v1, v2 )  \
6505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeon_triangle( rmesa, VERT(v0), VERT(v1), VERT(v2) )
6515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RENDER_QUAD( v0, v1, v2, v3 ) \
6525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeon_quad( rmesa, VERT(v0), VERT(v1), VERT(v2), VERT(v3) )
6535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef INIT
6545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define INIT(x) do {					\
6555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonRenderPrimitive( ctx, x );			\
6565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} while (0)
6575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef LOCAL_VARS
6585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define LOCAL_VARS						\
6594637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);		\
660b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   const GLuint vertsize = rmesa->radeon.swtcl.vertex_size;		\
661b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   const char *radeonverts = (char *)rmesa->radeon.swtcl.verts;		\
6625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   const GLuint * const elt = TNL_CONTEXT(ctx)->vb.Elts;	\
6635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   const GLboolean stipple = ctx->Line.StippleFlag;		\
6645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   (void) elt; (void) stipple;
6655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RESET_STIPPLE	if ( stipple ) radeonResetLineStipple( ctx );
6665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RESET_OCCLUSION
6675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define PRESERVE_VB_DEFS
6685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define ELT(x) (x)
6695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) radeon_##x##_verts
6705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/t_vb_rendertmp.h"
6715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef ELT
6725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef TAG
6735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) radeon_##x##_elts
6745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define ELT(x) elt[x]
6755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/t_vb_rendertmp.h"
6765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
6805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*                    Choose render functions                         */
6815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
6825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
683f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid radeonChooseRenderState( struct gl_context *ctx )
6845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
6855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNLcontext *tnl = TNL_CONTEXT(ctx);
6864637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
6875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint index = 0;
6885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint flags = ctx->_TriangleCaps;
6895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6904637235183b80963536f2364e4d50fcb894886ddDave Airlie   if (!rmesa->radeon.TclFallback || rmesa->radeon.Fallback)
6915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
6925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (flags & DD_TRI_LIGHT_TWOSIDE) index |= RADEON_TWOSIDE_BIT;
6945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (flags & DD_TRI_UNFILLED)      index |= RADEON_UNFILLED_BIT;
6955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
696b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   if (index != rmesa->radeon.swtcl.RenderIndex) {
6975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tnl->Driver.Render.Points = rast_tab[index].points;
6985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tnl->Driver.Render.Line = rast_tab[index].line;
6995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tnl->Driver.Render.ClippedLine = rast_tab[index].line;
7005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tnl->Driver.Render.Triangle = rast_tab[index].triangle;
7015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tnl->Driver.Render.Quad = rast_tab[index].quad;
7025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (index == 0) {
7045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.PrimTabVerts = radeon_render_tab_verts;
7055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.PrimTabElts = radeon_render_tab_elts;
7065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.ClippedPolygon = radeon_fast_clipped_poly;
7075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
7085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.PrimTabVerts = _tnl_render_tab_verts;
7095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.PrimTabElts = _tnl_render_tab_elts;
7105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.ClippedPolygon = _tnl_RenderClippedPolygon;
7115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
7125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
713b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie      rmesa->radeon.swtcl.RenderIndex = index;
7145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
7195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*                 High level hooks for t_vb_render.c                 */
7205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
7215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
723f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonRasterPrimitive( struct gl_context *ctx, GLuint hwprim )
7245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7254637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
7265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
727b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   if (rmesa->radeon.swtcl.hw_primitive != hwprim) {
7285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_NEWPRIM( rmesa );
729b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie      rmesa->radeon.swtcl.hw_primitive = hwprim;
7305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
733f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonRenderPrimitive( struct gl_context *ctx, GLenum prim )
7345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7354637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
736b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.render_primitive = prim;
7375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (prim < GL_TRIANGLES || !(ctx->_TriangleCaps & DD_TRI_UNFILLED))
7385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonRasterPrimitive( ctx, reduced_hw_prim[prim] );
7395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
741f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonRenderFinish( struct gl_context *ctx )
7425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
745f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonResetLineStipple( struct gl_context *ctx )
7465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7474637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
7485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, lin );
7495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
7535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*           Transition to/from hardware rasterization.               */
7545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
7555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic const char * const fallbackStrings[] = {
7575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "Texture mode",
7585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "glDrawBuffer(GL_FRONT_AND_BACK)",
7595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "glEnable(GL_STENCIL) without hw stencil buffer",
7605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "glRenderMode(selection or feedback)",
7615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "glBlendEquation",
7625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "glBlendFunc",
7635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "RADEON_NO_RAST",
7645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "Mixing GL_CLAMP_TO_BORDER and GL_CLAMP (or GL_MIRROR_CLAMP_ATI)"
7655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
7665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic const char *getFallbackString(GLuint bit)
7695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int i = 0;
7715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   while (bit > 1) {
7725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      i++;
7735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      bit >>= 1;
7745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return fallbackStrings[i];
7765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
779f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid radeonFallback( struct gl_context *ctx, GLuint bit, GLboolean mode )
7805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7814637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
7825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNLcontext *tnl = TNL_CONTEXT(ctx);
7834637235183b80963536f2364e4d50fcb894886ddDave Airlie   GLuint oldfallback = rmesa->radeon.Fallback;
7845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (mode) {
7864637235183b80963536f2364e4d50fcb894886ddDave Airlie      rmesa->radeon.Fallback |= bit;
7875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (oldfallback == 0) {
7881090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie	 radeon_firevertices(&rmesa->radeon);
7895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_RASTER, GL_TRUE );
7905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 _swsetup_Wakeup( ctx );
791b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie	 rmesa->radeon.swtcl.RenderIndex = ~0;
7924e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen         if (RADEON_DEBUG & RADEON_FALLBACKS) {
7935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul            fprintf(stderr, "Radeon begin rasterization fallback: 0x%x %s\n",
7945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                    bit, getFallbackString(bit));
7955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         }
7965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
7975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else {
7994637235183b80963536f2364e4d50fcb894886ddDave Airlie      rmesa->radeon.Fallback &= ~bit;
8005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (oldfallback == bit) {
8015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 _swrast_flush( ctx );
8025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.Start = radeonRenderStart;
8035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.PrimitiveNotify = radeonRenderPrimitive;
8045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.Finish = radeonRenderFinish;
8058a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
8068a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 tnl->Driver.Render.BuildVertices = _tnl_build_vertices;
8078a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 tnl->Driver.Render.CopyPV = _tnl_copy_pv;
8088a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 tnl->Driver.Render.Interp = _tnl_interp;
8098a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
8105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.ResetLineStipple = radeonResetLineStipple;
8115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_RASTER, GL_FALSE );
8124637235183b80963536f2364e4d50fcb894886ddDave Airlie	 if (rmesa->radeon.TclFallback) {
8134637235183b80963536f2364e4d50fcb894886ddDave Airlie	    /* These are already done if rmesa->radeon.TclFallback goes to
8145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	     * zero above. But not if it doesn't (RADEON_NO_TCL for
8155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	     * example?)
8165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	     */
817555b5fac4f47576f04d8e4159dc22f72a2b0a397Roland Scheidegger	    _tnl_invalidate_vertex_state( ctx, ~0 );
818555b5fac4f47576f04d8e4159dc22f72a2b0a397Roland Scheidegger	    _tnl_invalidate_vertices( ctx, ~0 );
8194637235183b80963536f2364e4d50fcb894886ddDave Airlie	    RENDERINPUTS_ZERO( rmesa->radeon.tnl_index_bitset );
8205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    radeonChooseVertexState( ctx );
8215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    radeonChooseRenderState( ctx );
8225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
8234e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen         if (RADEON_DEBUG & RADEON_FALLBACKS) {
8245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul            fprintf(stderr, "Radeon end rasterization fallback: 0x%x %s\n",
8255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                    bit, getFallbackString(bit));
8265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         }
8275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
8285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
8305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
8335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*                            Initialization.                         */
8345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
8355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
836f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid radeonInitSwtcl( struct gl_context *ctx )
8375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
8385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNLcontext *tnl = TNL_CONTEXT(ctx);
8394637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
8405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   static int firsttime = 1;
8415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (firsttime) {
8435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      init_rast_tab();
8445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      firsttime = 0;
8455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
846570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen   rmesa->radeon.swtcl.emit_prediction = 0;
8475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.Start = radeonRenderStart;
8495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.Finish = radeonRenderFinish;
8505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.PrimitiveNotify = radeonRenderPrimitive;
8515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.ResetLineStipple = radeonResetLineStipple;
8528a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   tnl->Driver.Render.BuildVertices = _tnl_build_vertices;
8538a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   tnl->Driver.Render.CopyPV = _tnl_copy_pv;
8548a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   tnl->Driver.Render.Interp = _tnl_interp;
8555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8568a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   _tnl_init_vertices( ctx, ctx->Const.MaxArrayLockSize + 12,
8578a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt		       RADEON_MAX_TNL_VERTEX_SIZE);
8588a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
859b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.verts = (GLubyte *)tnl->clipspace.vertex_buf;
860b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.RenderIndex = ~0;
861b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.render_primitive = GL_TRIANGLES;
862b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.hw_primitive = 0;
8635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
8645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
865