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;
9545cd15bfae2f6c66c9e4356fb8dd7cad1829f659Mathias Fröhlich   GLbitfield64 index_bitset = tnl->render_inputs_bitset;
968a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   int fmt_0 = 0;
978a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   int offset = 0;
985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
998a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   /* Important:
1008a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt    */
1018a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   if ( VB->NdcPtr != NULL ) {
1028a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      VB->AttribPtr[VERT_ATTRIB_POS] = VB->NdcPtr;
1038a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
1048a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   else {
1058a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      VB->AttribPtr[VERT_ATTRIB_POS] = VB->ClipPtr;
1068a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
1075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1088a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   assert( VB->AttribPtr[VERT_ATTRIB_POS] != NULL );
109b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.vertex_attr_count = 0;
1108a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
1118a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   /* EMIT_ATTR's must be in order as they tell t_vertex.c how to
1128a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt    * build up a hardware vertex.
1138a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt    */
1148a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   if ( !rmesa->swtcl.needproj ||
11545cd15bfae2f6c66c9e4356fb8dd7cad1829f659Mathias Fröhlich        (index_bitset & BITFIELD64_RANGE(_TNL_ATTRIB_TEX0, _TNL_NUM_TEX))) {
11645cd15bfae2f6c66c9e4356fb8dd7cad1829f659Mathias Fröhlich      /* for projtex */
1178a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_4F,
1188a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt		 RADEON_CP_VC_FRMT_XY |	RADEON_CP_VC_FRMT_Z | RADEON_CP_VC_FRMT_W0 );
1198a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      offset = 4;
1208a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
1218a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   else {
1228a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_3F,
1238a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt		 RADEON_CP_VC_FRMT_XY |	RADEON_CP_VC_FRMT_Z );
1248a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      offset = 3;
1258a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
1265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1278a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   rmesa->swtcl.coloroffset = offset;
1288a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#if MESA_LITTLE_ENDIAN
1298a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   EMIT_ATTR( _TNL_ATTRIB_COLOR0, EMIT_4UB_4F_RGBA,
1308a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	      RADEON_CP_VC_FRMT_PKCOLOR );
1318a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#else
1328a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   EMIT_ATTR( _TNL_ATTRIB_COLOR0, EMIT_4UB_4F_ABGR,
1338a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	      RADEON_CP_VC_FRMT_PKCOLOR );
1348a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#endif
1358a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   offset += 1;
1365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1378a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   rmesa->swtcl.specoffset = 0;
13845cd15bfae2f6c66c9e4356fb8dd7cad1829f659Mathias Fröhlich   if (index_bitset &
13945cd15bfae2f6c66c9e4356fb8dd7cad1829f659Mathias Fröhlich       (BITFIELD64_BIT(_TNL_ATTRIB_COLOR1) | BITFIELD64_BIT(_TNL_ATTRIB_FOG))) {
1405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1418a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#if MESA_LITTLE_ENDIAN
14245cd15bfae2f6c66c9e4356fb8dd7cad1829f659Mathias Fröhlich      if (index_bitset & BITFIELD64_BIT(_TNL_ATTRIB_COLOR1)) {
1438a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 rmesa->swtcl.specoffset = offset;
1448a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_ATTR( _TNL_ATTRIB_COLOR1, EMIT_3UB_3F_RGB,
1458a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 	    RADEON_CP_VC_FRMT_PKSPEC );
1468a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1478a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      else {
1488a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_PAD( 3 );
1498a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
15145cd15bfae2f6c66c9e4356fb8dd7cad1829f659Mathias Fröhlich      if (index_bitset & BITFIELD64_BIT(_TNL_ATTRIB_FOG)) {
1528a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_ATTR( _TNL_ATTRIB_FOG, EMIT_1UB_1F,
1538a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 	    RADEON_CP_VC_FRMT_PKSPEC );
1548a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1558a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      else {
1568a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_PAD( 1 );
1578a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1588a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#else
15945cd15bfae2f6c66c9e4356fb8dd7cad1829f659Mathias Fröhlich      if (index_bitset & BITFIELD64_BIT(_TNL_ATTRIB_FOG)) {
1608a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_ATTR( _TNL_ATTRIB_FOG, EMIT_1UB_1F,
1618a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 	    RADEON_CP_VC_FRMT_PKSPEC );
1628a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1638a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      else {
1648a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_PAD( 1 );
1658a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
16745cd15bfae2f6c66c9e4356fb8dd7cad1829f659Mathias Fröhlich      if (index_bitset & BITFIELD64_BIT(_TNL_ATTRIB_COLOR1)) {
1688a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 rmesa->swtcl.specoffset = offset;
1698a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_ATTR( _TNL_ATTRIB_COLOR1, EMIT_3UB_3F_BGR,
1708a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 	    RADEON_CP_VC_FRMT_PKSPEC );
1718a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1728a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      else {
1738a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 EMIT_PAD( 3 );
1748a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
1758a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#endif
1768a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
1775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
17845cd15bfae2f6c66c9e4356fb8dd7cad1829f659Mathias Fröhlich   if (index_bitset & BITFIELD64_RANGE(_TNL_ATTRIB_TEX0, _TNL_NUM_TEX)) {
1798a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      int i;
1808a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
1818a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
18245cd15bfae2f6c66c9e4356fb8dd7cad1829f659Mathias Fröhlich	 if (index_bitset & BITFIELD64_BIT(_TNL_ATTRIB_TEX(i))) {
183df582ca767a38f185f9b4c449e7ed4266c414ae2Eric Anholt	    GLuint sz = VB->AttribPtr[_TNL_ATTRIB_TEX0 + i]->size;
1848a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
1858a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    switch (sz) {
1868a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    case 1:
1878a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    case 2:
1888a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	       EMIT_ATTR( _TNL_ATTRIB_TEX0+i, EMIT_2F,
1898a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt			  radeon_cp_vc_frmts[i][0] );
1908a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	       break;
191247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	    case 3:
192c8fb700f2b01b577402910ecd09594ee2570872dDave Airlie	       if (ctx->Texture.Unit[i]._ReallyEnabled & (TEXTURE_CUBE_BIT) ) {
193c8fb700f2b01b577402910ecd09594ee2570872dDave Airlie	           EMIT_ATTR( _TNL_ATTRIB_TEX0+i, EMIT_3F,
194c8fb700f2b01b577402910ecd09594ee2570872dDave Airlie			      radeon_cp_vc_frmts[i][1] );
195c8fb700f2b01b577402910ecd09594ee2570872dDave Airlie               } else {
196c8fb700f2b01b577402910ecd09594ee2570872dDave Airlie	           EMIT_ATTR( _TNL_ATTRIB_TEX0+i, EMIT_2F,
197c8fb700f2b01b577402910ecd09594ee2570872dDave Airlie			      radeon_cp_vc_frmts[i][0] );
198c8fb700f2b01b577402910ecd09594ee2570872dDave Airlie               }
199c8fb700f2b01b577402910ecd09594ee2570872dDave Airlie               break;
2008a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    case 4:
201247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	       if (ctx->Texture.Unit[i]._ReallyEnabled & (TEXTURE_CUBE_BIT) ) {
202247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger		  EMIT_ATTR( _TNL_ATTRIB_TEX0+i, EMIT_3F,
203247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger			     radeon_cp_vc_frmts[i][1] );
204247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	       } else {
205247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger		  EMIT_ATTR( _TNL_ATTRIB_TEX0+i, EMIT_3F_XYW,
206247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger			     radeon_cp_vc_frmts[i][1] );
207247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	       }
2088a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	       break;
2098a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    default:
2108a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	       continue;
2118a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	    };
2128a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 }
2138a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      }
2148a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
2155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
21645cd15bfae2f6c66c9e4356fb8dd7cad1829f659Mathias Fröhlich   if (rmesa->radeon.tnl_index_bitset != index_bitset ||
21745cd15bfae2f6c66c9e4356fb8dd7cad1829f659Mathias Fröhlich       fmt_0 != rmesa->swtcl.vertex_format) {
2188a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      RADEON_NEWPRIM(rmesa);
2198a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      rmesa->swtcl.vertex_format = fmt_0;
220b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie      rmesa->radeon.swtcl.vertex_size =
2218a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	  _tnl_install_attrs( ctx,
222b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie			      rmesa->radeon.swtcl.vertex_attrs,
223b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie			      rmesa->radeon.swtcl.vertex_attr_count,
2248a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt			      NULL, 0 );
225b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie      rmesa->radeon.swtcl.vertex_size /= 4;
22645cd15bfae2f6c66c9e4356fb8dd7cad1829f659Mathias Fröhlich      rmesa->radeon.tnl_index_bitset = index_bitset;
2274e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen      radeon_print(RADEON_SWRENDER, RADEON_VERBOSE,
2284e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	  "%s: vertex_size= %d floats\n",  __FUNCTION__, rmesa->radeon.swtcl.vertex_size);
2298a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   }
2305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2320926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminenstatic void radeon_predict_emit_size( r100ContextPtr rmesa )
233570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen{
234570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen
235570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen    if (!rmesa->radeon.swtcl.emit_prediction) {
236570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen        const int state_size = radeonCountStateEmitSize( &rmesa->radeon );
237570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen        const int scissor_size = 8;
238570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen        const int prims_size = 8;
239570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen        const int vertex_size = 7;
240570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen
241570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen        if (rcommonEnsureCmdBufSpace(&rmesa->radeon,
242570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen                    state_size +
243570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen                    (scissor_size + prims_size + vertex_size),
244570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen                    __FUNCTION__))
245570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen            rmesa->radeon.swtcl.emit_prediction = radeonCountStateEmitSize( &rmesa->radeon );
246570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen        else
247570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen            rmesa->radeon.swtcl.emit_prediction = state_size;
248570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen        rmesa->radeon.swtcl.emit_prediction += scissor_size + prims_size + vertex_size
249570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen            + rmesa->radeon.cmdbuf.cs->cdw;
250570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen    }
251570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen}
2525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
253f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonRenderStart( struct gl_context *ctx )
2545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
25597029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen    r100ContextPtr rmesa = R100_CONTEXT( ctx );
25697029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen
25797029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen    radeonSetVertexFormat( ctx );
25897029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen
25997029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen    if (rmesa->radeon.dma.flush != 0 &&
26097029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen            rmesa->radeon.dma.flush != rcommon_flush_last_swtcl_prim)
26197029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen        rmesa->radeon.dma.flush( ctx );
2625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2658a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt/**
2668a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt * Set vertex state for SW TCL.  The primary purpose of this function is to
2678a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt * determine in advance whether or not the hardware can / should do the
2688a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt * projection divide or Mesa should do it.
2698a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt */
270f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid radeonChooseVertexState( struct gl_context *ctx )
2715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
2724637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT( ctx );
2735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNLcontext *tnl = TNL_CONTEXT(ctx);
2745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
27525847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger   GLuint se_coord_fmt = rmesa->hw.set.cmd[SET_SE_COORDFMT];
27625847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger
27725847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger   se_coord_fmt &= ~(RADEON_VTX_XY_PRE_MULT_1_OVER_W0 |
27825847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger		     RADEON_VTX_Z_PRE_MULT_1_OVER_W0 |
27925847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger		     RADEON_VTX_W0_IS_NOT_1_OVER_W0);
2805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2813f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt   /* We must ensure that we don't do _tnl_need_projected_coords while in a
2823f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt    * rasterization fallback.  As this function will be called again when we
2833f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt    * leave a rasterization fallback, we can just skip it for now.
2843f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt    */
2854637235183b80963536f2364e4d50fcb894886ddDave Airlie   if (rmesa->radeon.Fallback != 0)
2863f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt      return;
2873f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt
2888a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   /* HW perspective divide is a win, but tiny vertex formats are a
2898a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt    * bigger one.
2908a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt    */
2915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
29245cd15bfae2f6c66c9e4356fb8dd7cad1829f659Mathias Fröhlich   if ((0 == (tnl->render_inputs_bitset &
29345cd15bfae2f6c66c9e4356fb8dd7cad1829f659Mathias Fröhlich        (BITFIELD64_RANGE(_TNL_ATTRIB_TEX0, _TNL_NUM_TEX)
29445cd15bfae2f6c66c9e4356fb8dd7cad1829f659Mathias Fröhlich         | BITFIELD64_BIT(_TNL_ATTRIB_COLOR1))))
29545cd15bfae2f6c66c9e4356fb8dd7cad1829f659Mathias Fröhlich        || (ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED))) {
2968a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      rmesa->swtcl.needproj = GL_TRUE;
29725847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger      se_coord_fmt |= (RADEON_VTX_XY_PRE_MULT_1_OVER_W0 |
29825847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger		      RADEON_VTX_Z_PRE_MULT_1_OVER_W0);
2995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else {
3018a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      rmesa->swtcl.needproj = GL_FALSE;
30225847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger      se_coord_fmt |= (RADEON_VTX_W0_IS_NOT_1_OVER_W0);
3035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3058a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   _tnl_need_projected_coords( ctx, rmesa->swtcl.needproj );
3065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3078a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   if ( se_coord_fmt != rmesa->hw.set.cmd[SET_SE_COORDFMT] ) {
3088a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      RADEON_STATECHANGE( rmesa, set );
3098a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      rmesa->hw.set.cmd[SET_SE_COORDFMT] = se_coord_fmt;
3105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
313f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid r100_swtcl_flush(struct gl_context *ctx, uint32_t current_offset)
3145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
3154637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
3165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3191090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie   radeonEmitState(&rmesa->radeon);
320b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   radeonEmitVertexAOS( rmesa,
321b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie			rmesa->radeon.swtcl.vertex_size,
322bd13e6e5e2403ada2098e3a07c0af4b4ba989ab7Dave Airlie			rmesa->radeon.swtcl.bo,
323b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie			current_offset);
3245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
325b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie
326b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   radeonEmitVbufPrim( rmesa,
327b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie		       rmesa->swtcl.vertex_format,
328b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie		       rmesa->radeon.swtcl.hw_primitive,
329b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie		       rmesa->radeon.swtcl.numverts);
330570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen   if ( rmesa->radeon.swtcl.emit_prediction < rmesa->radeon.cmdbuf.cs->cdw )
331570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen     WARN_ONCE("Rendering was %d commands larger than predicted size."
332570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen	 " We might overflow  command buffer.\n",
333570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen	 rmesa->radeon.cmdbuf.cs->cdw - rmesa->radeon.swtcl.emit_prediction );
3345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
33597029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen
336570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen   rmesa->radeon.swtcl.emit_prediction = 0;
33797029c1860e8a99448ac157408e71bea3aa2559fPauli Nieminen
3385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*
3415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Render unclipped vertex buffers by emitting vertices directly to
3425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * dma buffers.  Use strip/fan hardware primitives where possible.
3435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Try to simulate missing primitives with indexed vertices.
3445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
3455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_POINTS      1
3465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_LINES       1
3475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_LINE_STRIPS 1
3485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_TRIANGLES   1
3495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_TRI_STRIPS  1
3505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_TRI_STRIP_1 0
3515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_TRI_FANS    1
3525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_QUADS       0
3535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_QUAD_STRIPS 0
3545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_POLYGONS    0
3558a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt/* \todo: is it possible to make "ELTS" work with t_vertex code ? */
3568a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define HAVE_ELTS        0
3575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic const GLuint hw_prim[GL_POLYGON+1] = {
3595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_POINT,
3605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_LINE,
3615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   0,
3625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_LINE_STRIP,
3635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
3645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_STRIP,
3655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_FAN,
3665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   0,
3675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   0,
3685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   0
3695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
3705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3718e5479c7f806ffd57eed26c147e3ca227a39f0a7Brian Paulstatic INLINE void
3724637235183b80963536f2364e4d50fcb894886ddDave AirlieradeonDmaPrimitive( r100ContextPtr rmesa, GLenum prim )
3735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
3745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_NEWPRIM( rmesa );
375b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.hw_primitive = hw_prim[prim];
376b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   //   assert(rmesa->radeon.dma.current.ptr == rmesa->radeon.dma.current.start);
3775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3790926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminenstatic void* radeon_alloc_verts( r100ContextPtr rmesa , GLuint nr, GLuint size )
3800926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen{
3810926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen   void *rv;
3820926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen   do {
3830926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen     radeon_predict_emit_size( rmesa );
3840926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen     rv = rcommonAllocDmaLowVerts( &rmesa->radeon, nr, size );
3850926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen   } while (!rv);
3860926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen   return rv;
3870926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen}
3880926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen
3894637235183b80963536f2364e4d50fcb894886ddDave Airlie#define LOCAL_VARS r100ContextPtr rmesa = R100_CONTEXT(ctx)
3905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define INIT( prim ) radeonDmaPrimitive( rmesa, prim )
3912dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell#define FLUSH()  RADEON_NEWPRIM( rmesa )
392b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie#define GET_CURRENT_VB_MAX_VERTS()					10\
393b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie//  (((int)rmesa->radeon.dma.current.end - (int)rmesa->radeon.dma.current.ptr) / (rmesa->radeon.swtcl.vertex_size*4))
3945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define GET_SUBSEQUENT_VB_MAX_VERTS() \
395b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie  ((RADEON_BUFFER_SIZE) / (rmesa->radeon.swtcl.vertex_size*4))
3960926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen#define ALLOC_VERTS( nr ) radeon_alloc_verts( rmesa, nr, rmesa->radeon.swtcl.vertex_size * 4 )
3972dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell#define EMIT_VERTS( ctx, j, nr, buf ) \
3988a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt  _tnl_emit_vertices_to_buffer(ctx, j, (j)+(nr), buf)
3992dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell
4005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) radeon_dma_##x
4015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_dmatmp.h"
4025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
4055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*                          Render pipeline stage                     */
4065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
4075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
409f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic GLboolean radeon_run_render( struct gl_context *ctx,
41057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell				    struct tnl_pipeline_stage *stage )
4115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4124637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
4135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNLcontext *tnl = TNL_CONTEXT(ctx);
4145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   struct vertex_buffer *VB = &tnl->vb;
4153d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_render_func *tab = TAG(render_tab_verts);
4168592ba94b85b3f0f93ae875eece259b4626a6759Keith Whitwell   GLuint i;
4175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
418b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   if (rmesa->radeon.swtcl.RenderIndex != 0 ||
4192dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell       !radeon_dma_validate_render( ctx, VB ))
4205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return GL_TRUE;
4215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
422646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner   radeon_prepare_render(&rmesa->radeon);
423b194b9b23801cd716244047b0b9b8bd9be518b78Alex Deucher   if (rmesa->radeon.NewGLState)
424b194b9b23801cd716244047b0b9b8bd9be518b78Alex Deucher      radeonValidateState( ctx );
425646d2e9fbc41bf49075013009e9583bec4a51168Mario Kleiner
4265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.Start( ctx );
4275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
42857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell   for (i = 0 ; i < VB->PrimitiveCount ; i++)
4295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
43057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      GLuint prim = VB->Primitive[i].mode;
43157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      GLuint start = VB->Primitive[i].start;
43257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      GLuint length = VB->Primitive[i].count;
43357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell
43457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell      if (!length)
43557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell	 continue;
4365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4374e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen      radeon_print(RADEON_SWRENDER, RADEON_NORMAL,
4384e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	  "radeon_render.c: prim %s %d..%d\n",
43957c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell		 _mesa_lookup_enum_by_nr(prim & PRIM_MODE_MASK),
44057c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell		 start, start+length);
4415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (length)
4438592ba94b85b3f0f93ae875eece259b4626a6759Keith Whitwell	 tab[prim & PRIM_MODE_MASK]( ctx, start, start + length, prim );
4445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.Finish( ctx );
4475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return GL_FALSE;		/* finished the pipe */
4495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
45357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwellconst struct tnl_pipeline_stage _radeon_render_stage =
4545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "radeon render",
456bf87f864934e174b3493592d5d107f012aac0842Keith Whitwell   NULL,
457bf87f864934e174b3493592d5d107f012aac0842Keith Whitwell   NULL,
458bf87f864934e174b3493592d5d107f012aac0842Keith Whitwell   NULL,
459bf87f864934e174b3493592d5d107f012aac0842Keith Whitwell   NULL,
4605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeon_run_render		/* run */
4615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
4625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**************************************************************************/
4655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic const GLuint reduced_hw_prim[GL_POLYGON+1] = {
4685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_POINT,
4695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_LINE,
4705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_LINE,
4715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_LINE,
4725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
4735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
4745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
4755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
4765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST,
4775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST
4785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
4795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
480f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonRasterPrimitive( struct gl_context *ctx, GLuint hwprim );
481f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonRenderPrimitive( struct gl_context *ctx, GLenum prim );
482f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonResetLineStipple( struct gl_context *ctx );
4835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/***********************************************************************
4865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *                    Emit primitives as inline vertices               *
4875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/
4885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef LOCAL_VARS
4902dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell#undef ALLOC_VERTS
4914637235183b80963536f2364e4d50fcb894886ddDave Airlie#define CTX_ARG r100ContextPtr rmesa
492b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie#define GET_VERTEX_DWORDS() rmesa->radeon.swtcl.vertex_size
4930926a5f4a110926711d0f8a4eb297dc772b09aa2Pauli Nieminen#define ALLOC_VERTS( n, size ) radeon_alloc_verts( rmesa, n, (size) * 4 )
4945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef LOCAL_VARS
4955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define LOCAL_VARS						\
4964637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);		\
497b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   const char *radeonverts = (char *)rmesa->radeon.swtcl.verts;
4988a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define VERT(x) (radeonVertex *)(radeonverts + ((x) * (vertsize) * sizeof(int)))
4995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERTEX radeonVertex
5005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef TAG
5015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) radeon_##x
5025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_triemit.h"
5035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/***********************************************************************
5065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *          Macros for t_dd_tritmp.h to draw basic primitives          *
5075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/
5085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define QUAD( a, b, c, d ) radeon_quad( rmesa, a, b, c, d )
5105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TRI( a, b, c )     radeon_triangle( rmesa, a, b, c )
5115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define LINE( a, b )       radeon_line( rmesa, a, b )
5125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define POINT( a )         radeon_point( rmesa, a )
5135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/***********************************************************************
5155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *              Build render functions from dd templates               *
5165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/
5175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RADEON_TWOSIDE_BIT	0x01
5195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RADEON_UNFILLED_BIT	0x02
52030daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger#define RADEON_MAX_TRIFUNC	0x04
5215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic struct {
5243d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_points_func	        points;
5253d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_line_func		line;
5263d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_triangle_func	triangle;
5273d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell   tnl_quad_func		quad;
5285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} rast_tab[RADEON_MAX_TRIFUNC];
5295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_FALLBACK  0
532bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl#define DO_OFFSET    0
5335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_UNFILLED (IND & RADEON_UNFILLED_BIT)
5345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_TWOSIDE  (IND & RADEON_TWOSIDE_BIT)
5355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_FLAT      0
5365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_TRI       1
5375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_QUAD      1
5385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_LINE      1
5395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_POINTS    1
5405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_FULL_QUAD 1
5415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_SPEC   1
5435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_BACK_COLORS  0
5445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_HW_FLATSHADE 1
5455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAB rast_tab
5465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DEPTH_SCALE 1.0
5485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define UNFILLED_TRI unfilled_tri
5495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define UNFILLED_QUAD unfilled_quad
5505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERT_X(_v) _v->v.x
5515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERT_Y(_v) _v->v.y
5525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERT_Z(_v) _v->v.z
5535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define AREA_IS_CCW( a ) (a < 0)
554b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie#define GET_VERTEX(e) (rmesa->radeon.swtcl.verts + ((e) * rmesa->radeon.swtcl.vertex_size * sizeof(int)))
5555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
556c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell#define VERT_SET_RGBA( v, c )  					\
557c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwelldo {								\
558c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   radeon_color_t *color = (radeon_color_t *)&((v)->ui[coloroffset]);	\
559c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   UNCLAMPED_FLOAT_TO_UBYTE(color->red, (c)[0]);		\
560c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   UNCLAMPED_FLOAT_TO_UBYTE(color->green, (c)[1]);		\
561c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   UNCLAMPED_FLOAT_TO_UBYTE(color->blue, (c)[2]);		\
562c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   UNCLAMPED_FLOAT_TO_UBYTE(color->alpha, (c)[3]);		\
563c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell} while (0)
564c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell
5655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERT_COPY_RGBA( v0, v1 ) v0->ui[coloroffset] = v1->ui[coloroffset]
566c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell
5678a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define VERT_SET_SPEC( v, c )					\
568c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwelldo {								\
5698a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   if (specoffset) {						\
5708a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      radeon_color_t *spec = (radeon_color_t *)&((v)->ui[specoffset]);	\
5718a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      UNCLAMPED_FLOAT_TO_UBYTE(spec->red, (c)[0]);	\
5728a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      UNCLAMPED_FLOAT_TO_UBYTE(spec->green, (c)[1]);	\
5738a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      UNCLAMPED_FLOAT_TO_UBYTE(spec->blue, (c)[2]);	\
574c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   }								\
575c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell} while (0)
576c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell#define VERT_COPY_SPEC( v0, v1 )			\
577c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwelldo {							\
5788a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   if (specoffset) {					\
5798a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      radeon_color_t *spec0 = (radeon_color_t *)&((v0)->ui[specoffset]);	\
5808a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      radeon_color_t *spec1 = (radeon_color_t *)&((v1)->ui[specoffset]);	\
5818a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      spec0->red   = spec1->red;	\
5828a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      spec0->green = spec1->green;	\
5838a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt      spec0->blue  = spec1->blue; 	\
584c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell   }							\
585c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell} while (0)
586c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell
587c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell/* These don't need LE32_TO_CPU() as they used to save and restore
588c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell * colors which are already in the correct format.
589c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell */
590c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell#define VERT_SAVE_RGBA( idx )    color[idx] = v[idx]->ui[coloroffset]
591c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell#define VERT_RESTORE_RGBA( idx ) v[idx]->ui[coloroffset] = color[idx]
5928a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define VERT_SAVE_SPEC( idx )    if (specoffset) spec[idx] = v[idx]->ui[specoffset]
5938a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define VERT_RESTORE_SPEC( idx ) if (specoffset) v[idx]->ui[specoffset] = spec[idx]
5945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef LOCAL_VARS
5965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef TAG
5975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef INIT
5985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define LOCAL_VARS(n)							\
6004637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);			\
601c3374bf97ecd82b915fb29c7c04951e2b75d4dbcPauli Nieminen   GLuint color[n] = {0}, spec[n] = {0};						\
6028a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   GLuint coloroffset = rmesa->swtcl.coloroffset;	\
6038a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   GLuint specoffset = rmesa->swtcl.specoffset;			\
6048a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   (void) color; (void) spec; (void) coloroffset; (void) specoffset;
6055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/***********************************************************************
6075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *                Helpers for rendering unfilled primitives            *
6085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/
6095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RASTERIZE(x) radeonRasterPrimitive( ctx, reduced_hw_prim[x] )
611b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie#define RENDER_PRIMITIVE rmesa->radeon.swtcl.render_primitive
6125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef TAG
6135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x
6145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_unfilled.h"
6155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef IND
6165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/***********************************************************************
6195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *                      Generate GL render functions                   *
6205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/
6215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define IND (0)
6245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x
6255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_tritmp.h"
6265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define IND (RADEON_TWOSIDE_BIT)
6285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x##_twoside
6295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_tritmp.h"
6305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define IND (RADEON_UNFILLED_BIT)
6325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x##_unfilled
6335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_tritmp.h"
6345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define IND (RADEON_TWOSIDE_BIT|RADEON_UNFILLED_BIT)
6365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x##_twoside_unfilled
6375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_tritmp.h"
6385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void init_rast_tab( void )
6415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
6425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   init();
6435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   init_twoside();
6445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   init_unfilled();
6455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   init_twoside_unfilled();
6465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
6475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
6495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*               Render unclipped begin/end objects                   */
6505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
6515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RENDER_POINTS( start, count )		\
6535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   for ( ; start < count ; start++)		\
6545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeon_point( rmesa, VERT(start) )
6555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RENDER_LINE( v0, v1 ) \
6565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeon_line( rmesa, VERT(v0), VERT(v1) )
6575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RENDER_TRI( v0, v1, v2 )  \
6585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeon_triangle( rmesa, VERT(v0), VERT(v1), VERT(v2) )
6595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RENDER_QUAD( v0, v1, v2, v3 ) \
6605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeon_quad( rmesa, VERT(v0), VERT(v1), VERT(v2), VERT(v3) )
6615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef INIT
6625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define INIT(x) do {					\
6635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonRenderPrimitive( ctx, x );			\
6645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} while (0)
6655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef LOCAL_VARS
6665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define LOCAL_VARS						\
6674637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);		\
668b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   const GLuint vertsize = rmesa->radeon.swtcl.vertex_size;		\
669b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   const char *radeonverts = (char *)rmesa->radeon.swtcl.verts;		\
6705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   const GLuint * const elt = TNL_CONTEXT(ctx)->vb.Elts;	\
6715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   const GLboolean stipple = ctx->Line.StippleFlag;		\
6725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   (void) elt; (void) stipple;
6735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RESET_STIPPLE	if ( stipple ) radeonResetLineStipple( ctx );
6745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RESET_OCCLUSION
6755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define PRESERVE_VB_DEFS
6765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define ELT(x) (x)
6775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) radeon_##x##_verts
6785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/t_vb_rendertmp.h"
6795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef ELT
6805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef TAG
6815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) radeon_##x##_elts
6825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define ELT(x) elt[x]
6835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/t_vb_rendertmp.h"
6845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
6885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*                    Choose render functions                         */
6895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
6905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
691f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid radeonChooseRenderState( struct gl_context *ctx )
6925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
6935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNLcontext *tnl = TNL_CONTEXT(ctx);
6944637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
6955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint index = 0;
6965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint flags = ctx->_TriangleCaps;
6975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6984637235183b80963536f2364e4d50fcb894886ddDave Airlie   if (!rmesa->radeon.TclFallback || rmesa->radeon.Fallback)
6995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
7005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (flags & DD_TRI_LIGHT_TWOSIDE) index |= RADEON_TWOSIDE_BIT;
7025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (flags & DD_TRI_UNFILLED)      index |= RADEON_UNFILLED_BIT;
7035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
704b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   if (index != rmesa->radeon.swtcl.RenderIndex) {
7055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tnl->Driver.Render.Points = rast_tab[index].points;
7065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tnl->Driver.Render.Line = rast_tab[index].line;
7075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tnl->Driver.Render.ClippedLine = rast_tab[index].line;
7085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tnl->Driver.Render.Triangle = rast_tab[index].triangle;
7095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      tnl->Driver.Render.Quad = rast_tab[index].quad;
7105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (index == 0) {
7125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.PrimTabVerts = radeon_render_tab_verts;
7135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.PrimTabElts = radeon_render_tab_elts;
7145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.ClippedPolygon = radeon_fast_clipped_poly;
7155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
7165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.PrimTabVerts = _tnl_render_tab_verts;
7175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.PrimTabElts = _tnl_render_tab_elts;
7185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.ClippedPolygon = _tnl_RenderClippedPolygon;
7195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
7205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
721b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie      rmesa->radeon.swtcl.RenderIndex = index;
7225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
7275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*                 High level hooks for t_vb_render.c                 */
7285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
7295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
731f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonRasterPrimitive( struct gl_context *ctx, GLuint hwprim )
7325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7334637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
7345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
735b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   if (rmesa->radeon.swtcl.hw_primitive != hwprim) {
7365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      RADEON_NEWPRIM( rmesa );
737b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie      rmesa->radeon.swtcl.hw_primitive = hwprim;
7385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
741f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonRenderPrimitive( struct gl_context *ctx, GLenum prim )
7425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7434637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
744b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.render_primitive = prim;
7455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (prim < GL_TRIANGLES || !(ctx->_TriangleCaps & DD_TRI_UNFILLED))
7465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonRasterPrimitive( ctx, reduced_hw_prim[prim] );
7475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
749f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonRenderFinish( struct gl_context *ctx )
7505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
753f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonResetLineStipple( struct gl_context *ctx )
7545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7554637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
7565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   RADEON_STATECHANGE( rmesa, lin );
7575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
7615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*           Transition to/from hardware rasterization.               */
7625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
7635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic const char * const fallbackStrings[] = {
7655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "Texture mode",
7665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "glDrawBuffer(GL_FRONT_AND_BACK)",
7675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "glEnable(GL_STENCIL) without hw stencil buffer",
7685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "glRenderMode(selection or feedback)",
7695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "glBlendEquation",
7705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "glBlendFunc",
7715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "RADEON_NO_RAST",
7725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "Mixing GL_CLAMP_TO_BORDER and GL_CLAMP (or GL_MIRROR_CLAMP_ATI)"
7735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
7745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic const char *getFallbackString(GLuint bit)
7775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int i = 0;
7795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   while (bit > 1) {
7805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      i++;
7815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      bit >>= 1;
7825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return fallbackStrings[i];
7845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
787f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid radeonFallback( struct gl_context *ctx, GLuint bit, GLboolean mode )
7885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7894637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
7905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNLcontext *tnl = TNL_CONTEXT(ctx);
7914637235183b80963536f2364e4d50fcb894886ddDave Airlie   GLuint oldfallback = rmesa->radeon.Fallback;
7925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (mode) {
7944637235183b80963536f2364e4d50fcb894886ddDave Airlie      rmesa->radeon.Fallback |= bit;
7955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (oldfallback == 0) {
7961090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie	 radeon_firevertices(&rmesa->radeon);
7975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_RASTER, GL_TRUE );
7985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 _swsetup_Wakeup( ctx );
799b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie	 rmesa->radeon.swtcl.RenderIndex = ~0;
8004e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen         if (RADEON_DEBUG & RADEON_FALLBACKS) {
8015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul            fprintf(stderr, "Radeon begin rasterization fallback: 0x%x %s\n",
8025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                    bit, getFallbackString(bit));
8035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         }
8045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
8055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else {
8074637235183b80963536f2364e4d50fcb894886ddDave Airlie      rmesa->radeon.Fallback &= ~bit;
8085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (oldfallback == bit) {
8095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 _swrast_flush( ctx );
8105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.Start = radeonRenderStart;
8115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.PrimitiveNotify = radeonRenderPrimitive;
8125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.Finish = radeonRenderFinish;
8138a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
8148a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 tnl->Driver.Render.BuildVertices = _tnl_build_vertices;
8158a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 tnl->Driver.Render.CopyPV = _tnl_copy_pv;
8168a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt	 tnl->Driver.Render.Interp = _tnl_interp;
8178a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
8185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tnl->Driver.Render.ResetLineStipple = radeonResetLineStipple;
8195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_RASTER, GL_FALSE );
8204637235183b80963536f2364e4d50fcb894886ddDave Airlie	 if (rmesa->radeon.TclFallback) {
8214637235183b80963536f2364e4d50fcb894886ddDave Airlie	    /* These are already done if rmesa->radeon.TclFallback goes to
8225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	     * zero above. But not if it doesn't (RADEON_NO_TCL for
8235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	     * example?)
8245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	     */
825555b5fac4f47576f04d8e4159dc22f72a2b0a397Roland Scheidegger	    _tnl_invalidate_vertex_state( ctx, ~0 );
826555b5fac4f47576f04d8e4159dc22f72a2b0a397Roland Scheidegger	    _tnl_invalidate_vertices( ctx, ~0 );
82745cd15bfae2f6c66c9e4356fb8dd7cad1829f659Mathias Fröhlich	    rmesa->radeon.tnl_index_bitset = 0;
8285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    radeonChooseVertexState( ctx );
8295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    radeonChooseRenderState( ctx );
8305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
8314e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen         if (RADEON_DEBUG & RADEON_FALLBACKS) {
8325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul            fprintf(stderr, "Radeon end rasterization fallback: 0x%x %s\n",
8335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                    bit, getFallbackString(bit));
8345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         }
8355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
8365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
8385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
8415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*                            Initialization.                         */
8425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/
8435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
844f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid radeonInitSwtcl( struct gl_context *ctx )
8455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
8465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   TNLcontext *tnl = TNL_CONTEXT(ctx);
8474637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
8485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   static int firsttime = 1;
8495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (firsttime) {
8515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      init_rast_tab();
8525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      firsttime = 0;
8535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
854570d4e375a327787441c2c7c4ae698e8993a5d6bPauli Nieminen   rmesa->radeon.swtcl.emit_prediction = 0;
8555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.Start = radeonRenderStart;
8575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.Finish = radeonRenderFinish;
8585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.PrimitiveNotify = radeonRenderPrimitive;
8595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   tnl->Driver.Render.ResetLineStipple = radeonResetLineStipple;
8608a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   tnl->Driver.Render.BuildVertices = _tnl_build_vertices;
8618a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   tnl->Driver.Render.CopyPV = _tnl_copy_pv;
8628a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   tnl->Driver.Render.Interp = _tnl_interp;
8635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8648a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt   _tnl_init_vertices( ctx, ctx->Const.MaxArrayLockSize + 12,
8658a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt		       RADEON_MAX_TNL_VERTEX_SIZE);
8668a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt
867b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.verts = (GLubyte *)tnl->clipspace.vertex_buf;
868b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.RenderIndex = ~0;
869b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.render_primitive = GL_TRIANGLES;
870b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie   rmesa->radeon.swtcl.hw_primitive = 0;
8715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
8725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
873