radeon_swtcl.c revision bbf2b5c4ffcb6755d34a5b698445aecf604e45fb
15df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/************************************************************************** 25df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 35df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulCopyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and 45df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul VA Linux Systems Inc., Fremont, California. 55df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 65df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulAll Rights Reserved. 75df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 85df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulPermission is hereby granted, free of charge, to any person obtaining 95df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paula copy of this software and associated documentation files (the 105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul"Software"), to deal in the Software without restriction, including 115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulwithout limitation the rights to use, copy, modify, merge, publish, 125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Pauldistribute, sublicense, and/or sell copies of the Software, and to 135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulpermit persons to whom the Software is furnished to do so, subject to 145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulthe following conditions: 155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulThe above copyright notice and this permission notice (including the 175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulnext paragraph) shall be included in all copies or substantial 185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulportions of the Software. 195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulIN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul**************************************************************************/ 295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* 315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Authors: 325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Keith Whitwell <keith@tungstengraphics.com> 335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 35ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/glheader.h" 36ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/mtypes.h" 37ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/colormac.h" 38ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/enums.h" 39ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/imports.h" 40ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/macros.h" 41bbf2b5c4ffcb6755d34a5b698445aecf604e45fbPauli Nieminen#include "main/simple_list.h" 425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "swrast_setup/swrast_setup.h" 445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "math/m_translate.h" 455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/tnl.h" 465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/t_context.h" 475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/t_pipeline.h" 485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_context.h" 505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_ioctl.h" 515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_state.h" 525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_swtcl.h" 535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_tcl.h" 545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 568a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt/* R100: xyzw, c0, c1/fog, stq[0..2] = 4+1+1+3*3 = 15 right? */ 578a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt/* R200: xyzw, c0, c1/fog, strq[0..5] = 4+1+1+4*6 = 30 */ 588a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define RADEON_MAX_TNL_VERTEX_SIZE (15 * sizeof(GLfloat)) /* for mesa _tnl stage */ 595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*********************************************************************** 618a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt * Initialization 625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/ 635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 648a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define EMIT_ATTR( ATTR, STYLE, F0 ) \ 658a1df968627de01d04f3d692fd81108ba6492c18Eric Anholtdo { \ 66b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].attrib = (ATTR); \ 67b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].format = (STYLE); \ 68b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rmesa->radeon.swtcl.vertex_attr_count++; \ 698a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt fmt_0 |= F0; \ 708a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt} while (0) 715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 728a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define EMIT_PAD( N ) \ 738a1df968627de01d04f3d692fd81108ba6492c18Eric Anholtdo { \ 74b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].attrib = 0; \ 75b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].format = EMIT_PAD; \ 76b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].offset = (N); \ 77b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rmesa->radeon.swtcl.vertex_attr_count++; \ 788a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt} while (0) 795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 808a1df968627de01d04f3d692fd81108ba6492c18Eric Anholtstatic GLuint radeon_cp_vc_frmts[3][2] = 818a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt{ 828a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt { RADEON_CP_VC_FRMT_ST0, RADEON_CP_VC_FRMT_ST0 | RADEON_CP_VC_FRMT_Q0 }, 838a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt { RADEON_CP_VC_FRMT_ST1, RADEON_CP_VC_FRMT_ST1 | RADEON_CP_VC_FRMT_Q1 }, 848a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt { RADEON_CP_VC_FRMT_ST2, RADEON_CP_VC_FRMT_ST2 | RADEON_CP_VC_FRMT_Q2 }, 858a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt}; 865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 878a1df968627de01d04f3d692fd81108ba6492c18Eric Anholtstatic void radeonSetVertexFormat( GLcontext *ctx ) 888a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt{ 894637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT( ctx ); 908a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt TNLcontext *tnl = TNL_CONTEXT(ctx); 918a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt struct vertex_buffer *VB = &tnl->vb; 92bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol DECLARE_RENDERINPUTS(index_bitset); 938a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt int fmt_0 = 0; 948a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt int offset = 0; 955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 96bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol RENDERINPUTS_COPY( index_bitset, tnl->render_inputs_bitset ); 975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 988a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt /* Important: 998a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt */ 1008a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt if ( VB->NdcPtr != NULL ) { 1018a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt VB->AttribPtr[VERT_ATTRIB_POS] = VB->NdcPtr; 1028a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt } 1038a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt else { 1048a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt VB->AttribPtr[VERT_ATTRIB_POS] = VB->ClipPtr; 1058a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt } 1065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1078a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt assert( VB->AttribPtr[VERT_ATTRIB_POS] != NULL ); 108b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rmesa->radeon.swtcl.vertex_attr_count = 0; 1098a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt 1108a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt /* EMIT_ATTR's must be in order as they tell t_vertex.c how to 1118a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt * build up a hardware vertex. 1128a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt */ 1138a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt if ( !rmesa->swtcl.needproj || 114bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol RENDERINPUTS_TEST_RANGE( index_bitset, _TNL_FIRST_TEX, _TNL_LAST_TEX )) { /* for projtex */ 1158a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_4F, 1168a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt RADEON_CP_VC_FRMT_XY | RADEON_CP_VC_FRMT_Z | RADEON_CP_VC_FRMT_W0 ); 1178a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt offset = 4; 1188a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt } 1198a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt else { 1208a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_3F, 1218a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt RADEON_CP_VC_FRMT_XY | RADEON_CP_VC_FRMT_Z ); 1228a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt offset = 3; 1238a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt } 1245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1258a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt rmesa->swtcl.coloroffset = offset; 1268a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#if MESA_LITTLE_ENDIAN 1278a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt EMIT_ATTR( _TNL_ATTRIB_COLOR0, EMIT_4UB_4F_RGBA, 1288a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt RADEON_CP_VC_FRMT_PKCOLOR ); 1298a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#else 1308a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt EMIT_ATTR( _TNL_ATTRIB_COLOR0, EMIT_4UB_4F_ABGR, 1318a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt RADEON_CP_VC_FRMT_PKCOLOR ); 1328a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#endif 1338a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt offset += 1; 1345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1358a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt rmesa->swtcl.specoffset = 0; 136bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_COLOR1 ) || 137bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_FOG )) { 1385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1398a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#if MESA_LITTLE_ENDIAN 140bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_COLOR1 )) { 1418a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt rmesa->swtcl.specoffset = offset; 1428a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt EMIT_ATTR( _TNL_ATTRIB_COLOR1, EMIT_3UB_3F_RGB, 1438a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt RADEON_CP_VC_FRMT_PKSPEC ); 1448a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt } 1458a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt else { 1468a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt EMIT_PAD( 3 ); 1478a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt } 1485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 149bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_FOG )) { 1508a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt EMIT_ATTR( _TNL_ATTRIB_FOG, EMIT_1UB_1F, 1518a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt RADEON_CP_VC_FRMT_PKSPEC ); 1528a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt } 1538a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt else { 1548a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt EMIT_PAD( 1 ); 1558a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt } 1568a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#else 157bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_FOG )) { 1588a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt EMIT_ATTR( _TNL_ATTRIB_FOG, EMIT_1UB_1F, 1598a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt RADEON_CP_VC_FRMT_PKSPEC ); 1608a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt } 1618a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt else { 1628a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt EMIT_PAD( 1 ); 1638a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt } 1645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 165bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_COLOR1 )) { 1668a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt rmesa->swtcl.specoffset = offset; 1678a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt EMIT_ATTR( _TNL_ATTRIB_COLOR1, EMIT_3UB_3F_BGR, 1688a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt RADEON_CP_VC_FRMT_PKSPEC ); 1698a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt } 1708a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt else { 1718a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt EMIT_PAD( 3 ); 1728a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt } 1738a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#endif 1748a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt } 1755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 176bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol if (RENDERINPUTS_TEST_RANGE( index_bitset, _TNL_FIRST_TEX, _TNL_LAST_TEX )) { 1778a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt int i; 1788a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt 1798a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt for (i = 0; i < ctx->Const.MaxTextureUnits; i++) { 180bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX(i) )) { 1818a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt GLuint sz = VB->TexCoordPtr[i]->size; 1828a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt 1838a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt switch (sz) { 1848a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt case 1: 1858a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt case 2: 1868a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt EMIT_ATTR( _TNL_ATTRIB_TEX0+i, EMIT_2F, 1878a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt radeon_cp_vc_frmts[i][0] ); 1888a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt break; 189247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger case 3: 1908a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt case 4: 191247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger if (ctx->Texture.Unit[i]._ReallyEnabled & (TEXTURE_CUBE_BIT) ) { 192247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger EMIT_ATTR( _TNL_ATTRIB_TEX0+i, EMIT_3F, 193247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger radeon_cp_vc_frmts[i][1] ); 194247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger } else { 195247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger EMIT_ATTR( _TNL_ATTRIB_TEX0+i, EMIT_3F_XYW, 196247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger radeon_cp_vc_frmts[i][1] ); 197247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger } 1988a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt break; 1998a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt default: 2008a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt continue; 2018a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt }; 2028a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt } 2038a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt } 2048a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt } 2055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2064637235183b80963536f2364e4d50fcb894886ddDave Airlie if (!RENDERINPUTS_EQUAL( rmesa->radeon.tnl_index_bitset, index_bitset ) || 2078a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt fmt_0 != rmesa->swtcl.vertex_format) { 2088a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt RADEON_NEWPRIM(rmesa); 2098a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt rmesa->swtcl.vertex_format = fmt_0; 210b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rmesa->radeon.swtcl.vertex_size = 2118a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt _tnl_install_attrs( ctx, 212b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rmesa->radeon.swtcl.vertex_attrs, 213b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rmesa->radeon.swtcl.vertex_attr_count, 2148a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt NULL, 0 ); 215b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rmesa->radeon.swtcl.vertex_size /= 4; 2164637235183b80963536f2364e4d50fcb894886ddDave Airlie RENDERINPUTS_COPY( rmesa->radeon.tnl_index_bitset, index_bitset ); 2178a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt if (RADEON_DEBUG & DEBUG_VERTS) 2188a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt fprintf( stderr, "%s: vertex_size= %d floats\n", 219b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie __FUNCTION__, rmesa->radeon.swtcl.vertex_size); 2208a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt } 2215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 2225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonRenderStart( GLcontext *ctx ) 2255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 2264637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT( ctx ); 2275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2288a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt radeonSetVertexFormat( ctx ); 2295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 230b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie if (rmesa->radeon.dma.flush != 0 && 231b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rmesa->radeon.dma.flush != rcommon_flush_last_swtcl_prim) 232b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rmesa->radeon.dma.flush( ctx ); 2335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 2345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2368a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt/** 2378a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt * Set vertex state for SW TCL. The primary purpose of this function is to 2388a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt * determine in advance whether or not the hardware can / should do the 2398a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt * projection divide or Mesa should do it. 2408a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt */ 2415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonChooseVertexState( GLcontext *ctx ) 2425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 2434637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT( ctx ); 2445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TNLcontext *tnl = TNL_CONTEXT(ctx); 2455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 24625847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger GLuint se_coord_fmt = rmesa->hw.set.cmd[SET_SE_COORDFMT]; 24725847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger 24825847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger se_coord_fmt &= ~(RADEON_VTX_XY_PRE_MULT_1_OVER_W0 | 24925847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger RADEON_VTX_Z_PRE_MULT_1_OVER_W0 | 25025847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger RADEON_VTX_W0_IS_NOT_1_OVER_W0); 2515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2523f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt /* We must ensure that we don't do _tnl_need_projected_coords while in a 2533f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt * rasterization fallback. As this function will be called again when we 2543f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt * leave a rasterization fallback, we can just skip it for now. 2553f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt */ 2564637235183b80963536f2364e4d50fcb894886ddDave Airlie if (rmesa->radeon.Fallback != 0) 2573f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt return; 2583f9839a52b6152d349b5c6279cd7a3d3106b3999Eric Anholt 2598a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt /* HW perspective divide is a win, but tiny vertex formats are a 2608a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt * bigger one. 2618a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt */ 2625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 263bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol if ((!RENDERINPUTS_TEST_RANGE( tnl->render_inputs_bitset, _TNL_FIRST_TEX, _TNL_LAST_TEX ) && 264bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol !RENDERINPUTS_TEST( tnl->render_inputs_bitset, _TNL_ATTRIB_COLOR1 )) 265bb38cadb1c5f2dc13096a091bdaf61dc3e3cfa4dMichal Krol || (ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED))) { 2668a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt rmesa->swtcl.needproj = GL_TRUE; 26725847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger se_coord_fmt |= (RADEON_VTX_XY_PRE_MULT_1_OVER_W0 | 26825847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger RADEON_VTX_Z_PRE_MULT_1_OVER_W0); 2695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else { 2718a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt rmesa->swtcl.needproj = GL_FALSE; 27225847f2b5b50d9bbd58729e28e4a3032972e6c0cRoland Scheidegger se_coord_fmt |= (RADEON_VTX_W0_IS_NOT_1_OVER_W0); 2735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2758a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt _tnl_need_projected_coords( ctx, rmesa->swtcl.needproj ); 2765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2778a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt if ( se_coord_fmt != rmesa->hw.set.cmd[SET_SE_COORDFMT] ) { 2788a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt RADEON_STATECHANGE( rmesa, set ); 2798a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt rmesa->hw.set.cmd[SET_SE_COORDFMT] = se_coord_fmt; 2805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 2825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 283b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlievoid r100_swtcl_flush(GLcontext *ctx, uint32_t current_offset) 2845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 2854637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 2865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 287b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rcommonEnsureCmdBufSpace(&rmesa->radeon, 2881090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie rmesa->radeon.hw.max_state_size + (12*sizeof(int)), 289b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie __FUNCTION__); 2905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2921090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie radeonEmitState(&rmesa->radeon); 293b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie radeonEmitVertexAOS( rmesa, 294b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rmesa->radeon.swtcl.vertex_size, 295bbf2b5c4ffcb6755d34a5b698445aecf604e45fbPauli Nieminen first_elem(&rmesa->radeon.dma.reserved)->bo, 296b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie current_offset); 2975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 298b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie 299b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie radeonEmitVbufPrim( rmesa, 300b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rmesa->swtcl.vertex_format, 301b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rmesa->radeon.swtcl.hw_primitive, 302b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rmesa->radeon.swtcl.numverts); 3035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 3055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* 3075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Render unclipped vertex buffers by emitting vertices directly to 3085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * dma buffers. Use strip/fan hardware primitives where possible. 3095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Try to simulate missing primitives with indexed vertices. 3105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 3115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_POINTS 1 3125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_LINES 1 3135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_LINE_STRIPS 1 3145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_TRIANGLES 1 3155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_TRI_STRIPS 1 3165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_TRI_STRIP_1 0 3175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_TRI_FANS 1 3185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_QUADS 0 3195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_QUAD_STRIPS 0 3205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_POLYGONS 0 3218a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt/* \todo: is it possible to make "ELTS" work with t_vertex code ? */ 3228a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define HAVE_ELTS 0 3235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic const GLuint hw_prim[GL_POLYGON+1] = { 3255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_CP_VC_CNTL_PRIM_TYPE_POINT, 3265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_CP_VC_CNTL_PRIM_TYPE_LINE, 3275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 0, 3285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_CP_VC_CNTL_PRIM_TYPE_LINE_STRIP, 3295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST, 3305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_STRIP, 3315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_FAN, 3325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 0, 3335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 0, 3345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 0 3355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}; 3365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3378e5479c7f806ffd57eed26c147e3ca227a39f0a7Brian Paulstatic INLINE void 3384637235183b80963536f2364e4d50fcb894886ddDave AirlieradeonDmaPrimitive( r100ContextPtr rmesa, GLenum prim ) 3395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 3405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_NEWPRIM( rmesa ); 341b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rmesa->radeon.swtcl.hw_primitive = hw_prim[prim]; 342b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie // assert(rmesa->radeon.dma.current.ptr == rmesa->radeon.dma.current.start); 3435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 3445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3454637235183b80963536f2364e4d50fcb894886ddDave Airlie#define LOCAL_VARS r100ContextPtr rmesa = R100_CONTEXT(ctx) 3465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define INIT( prim ) radeonDmaPrimitive( rmesa, prim ) 3472dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell#define FLUSH() RADEON_NEWPRIM( rmesa ) 348b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie#define GET_CURRENT_VB_MAX_VERTS() 10\ 349b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie// (((int)rmesa->radeon.dma.current.end - (int)rmesa->radeon.dma.current.ptr) / (rmesa->radeon.swtcl.vertex_size*4)) 3505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define GET_SUBSEQUENT_VB_MAX_VERTS() \ 351b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie ((RADEON_BUFFER_SIZE) / (rmesa->radeon.swtcl.vertex_size*4)) 3522dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell#define ALLOC_VERTS( nr ) \ 353b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rcommonAllocDmaLowVerts( &rmesa->radeon, nr, rmesa->radeon.swtcl.vertex_size * 4 ) 3542dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell#define EMIT_VERTS( ctx, j, nr, buf ) \ 3558a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt _tnl_emit_vertices_to_buffer(ctx, j, (j)+(nr), buf) 3562dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell 3575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) radeon_dma_##x 3585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_dmatmp.h" 3595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/ 3625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Render pipeline stage */ 3635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/ 3645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic GLboolean radeon_run_render( GLcontext *ctx, 36757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell struct tnl_pipeline_stage *stage ) 3685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 3694637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 3705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TNLcontext *tnl = TNL_CONTEXT(ctx); 3715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul struct vertex_buffer *VB = &tnl->vb; 3723d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell tnl_render_func *tab = TAG(render_tab_verts); 3738592ba94b85b3f0f93ae875eece259b4626a6759Keith Whitwell GLuint i; 3745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 375b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie if (rmesa->radeon.swtcl.RenderIndex != 0 || 3762dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell !radeon_dma_validate_render( ctx, VB )) 3775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return GL_TRUE; 3785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tnl->Driver.Render.Start( ctx ); 3805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 38157c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell for (i = 0 ; i < VB->PrimitiveCount ; i++) 3825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul { 38357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell GLuint prim = VB->Primitive[i].mode; 38457c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell GLuint start = VB->Primitive[i].start; 38557c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell GLuint length = VB->Primitive[i].count; 38657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell 38757c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell if (!length) 38857c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell continue; 3895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (RADEON_DEBUG & DEBUG_PRIMS) 3912dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell fprintf(stderr, "radeon_render.c: prim %s %d..%d\n", 39257c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell _mesa_lookup_enum_by_nr(prim & PRIM_MODE_MASK), 39357c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwell start, start+length); 3945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (length) 3968592ba94b85b3f0f93ae875eece259b4626a6759Keith Whitwell tab[prim & PRIM_MODE_MASK]( ctx, start, start + length, prim ); 3975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tnl->Driver.Render.Finish( ctx ); 4005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return GL_FALSE; /* finished the pipe */ 4025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 4035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 40657c9814b9e87924696df4c741861c29d4236d1ebKeith Whitwellconst struct tnl_pipeline_stage _radeon_render_stage = 4075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 4085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul "radeon render", 409bf87f864934e174b3493592d5d107f012aac0842Keith Whitwell NULL, 410bf87f864934e174b3493592d5d107f012aac0842Keith Whitwell NULL, 411bf87f864934e174b3493592d5d107f012aac0842Keith Whitwell NULL, 412bf87f864934e174b3493592d5d107f012aac0842Keith Whitwell NULL, 4135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeon_run_render /* run */ 4145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}; 4155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**************************************************************************/ 4185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic const GLuint reduced_hw_prim[GL_POLYGON+1] = { 4215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_CP_VC_CNTL_PRIM_TYPE_POINT, 4225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_CP_VC_CNTL_PRIM_TYPE_LINE, 4235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_CP_VC_CNTL_PRIM_TYPE_LINE, 4245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_CP_VC_CNTL_PRIM_TYPE_LINE, 4255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST, 4265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST, 4275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST, 4285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST, 4295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST, 4305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST 4315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}; 4325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonRasterPrimitive( GLcontext *ctx, GLuint hwprim ); 4345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonRenderPrimitive( GLcontext *ctx, GLenum prim ); 4355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonResetLineStipple( GLcontext *ctx ); 4365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*********************************************************************** 4395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Emit primitives as inline vertices * 4405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/ 4415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef LOCAL_VARS 4432dc621f3fdb585f23013aa3e220f2148f9405538Keith Whitwell#undef ALLOC_VERTS 4444637235183b80963536f2364e4d50fcb894886ddDave Airlie#define CTX_ARG r100ContextPtr rmesa 445b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie#define GET_VERTEX_DWORDS() rmesa->radeon.swtcl.vertex_size 446b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie#define ALLOC_VERTS( n, size ) rcommonAllocDmaLowVerts( &rmesa->radeon, n, (size) * 4 ) 4475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef LOCAL_VARS 4485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define LOCAL_VARS \ 4494637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); \ 450b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie const char *radeonverts = (char *)rmesa->radeon.swtcl.verts; 4518a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define VERT(x) (radeonVertex *)(radeonverts + ((x) * (vertsize) * sizeof(int))) 4525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERTEX radeonVertex 4535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef TAG 4545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) radeon_##x 4555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_triemit.h" 4565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*********************************************************************** 4595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Macros for t_dd_tritmp.h to draw basic primitives * 4605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/ 4615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define QUAD( a, b, c, d ) radeon_quad( rmesa, a, b, c, d ) 4635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TRI( a, b, c ) radeon_triangle( rmesa, a, b, c ) 4645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define LINE( a, b ) radeon_line( rmesa, a, b ) 4655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define POINT( a ) radeon_point( rmesa, a ) 4665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*********************************************************************** 4685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Build render functions from dd templates * 4695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/ 4705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RADEON_TWOSIDE_BIT 0x01 4725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RADEON_UNFILLED_BIT 0x02 47330daa7529331057ecb470efb500152e9c4aa1ae5Roland Scheidegger#define RADEON_MAX_TRIFUNC 0x04 4745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic struct { 4773d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell tnl_points_func points; 4783d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell tnl_line_func line; 4793d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell tnl_triangle_func triangle; 4803d38361b718d490e1e7fda64519952ec887cd149Keith Whitwell tnl_quad_func quad; 4815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} rast_tab[RADEON_MAX_TRIFUNC]; 4825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_FALLBACK 0 485bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl#define DO_OFFSET 0 4865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_UNFILLED (IND & RADEON_UNFILLED_BIT) 4875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_TWOSIDE (IND & RADEON_TWOSIDE_BIT) 4885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_FLAT 0 4895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_TRI 1 4905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_QUAD 1 4915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_LINE 1 4925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_POINTS 1 4935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DO_FULL_QUAD 1 4945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_RGBA 1 4965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_SPEC 1 4975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_BACK_COLORS 0 4985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define HAVE_HW_FLATSHADE 1 4995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAB rast_tab 5005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define DEPTH_SCALE 1.0 5025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define UNFILLED_TRI unfilled_tri 5035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define UNFILLED_QUAD unfilled_quad 5045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERT_X(_v) _v->v.x 5055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERT_Y(_v) _v->v.y 5065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERT_Z(_v) _v->v.z 5075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define AREA_IS_CCW( a ) (a < 0) 508b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie#define GET_VERTEX(e) (rmesa->radeon.swtcl.verts + ((e) * rmesa->radeon.swtcl.vertex_size * sizeof(int))) 5095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 510c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell#define VERT_SET_RGBA( v, c ) \ 511c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwelldo { \ 512c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell radeon_color_t *color = (radeon_color_t *)&((v)->ui[coloroffset]); \ 513c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell UNCLAMPED_FLOAT_TO_UBYTE(color->red, (c)[0]); \ 514c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell UNCLAMPED_FLOAT_TO_UBYTE(color->green, (c)[1]); \ 515c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell UNCLAMPED_FLOAT_TO_UBYTE(color->blue, (c)[2]); \ 516c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell UNCLAMPED_FLOAT_TO_UBYTE(color->alpha, (c)[3]); \ 517c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell} while (0) 518c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell 5195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERT_COPY_RGBA( v0, v1 ) v0->ui[coloroffset] = v1->ui[coloroffset] 520c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell 5218a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define VERT_SET_SPEC( v, c ) \ 522c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwelldo { \ 5238a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt if (specoffset) { \ 5248a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt radeon_color_t *spec = (radeon_color_t *)&((v)->ui[specoffset]); \ 5258a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt UNCLAMPED_FLOAT_TO_UBYTE(spec->red, (c)[0]); \ 5268a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt UNCLAMPED_FLOAT_TO_UBYTE(spec->green, (c)[1]); \ 5278a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt UNCLAMPED_FLOAT_TO_UBYTE(spec->blue, (c)[2]); \ 528c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell } \ 529c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell} while (0) 530c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell#define VERT_COPY_SPEC( v0, v1 ) \ 531c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwelldo { \ 5328a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt if (specoffset) { \ 5338a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt radeon_color_t *spec0 = (radeon_color_t *)&((v0)->ui[specoffset]); \ 5348a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt radeon_color_t *spec1 = (radeon_color_t *)&((v1)->ui[specoffset]); \ 5358a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt spec0->red = spec1->red; \ 5368a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt spec0->green = spec1->green; \ 5378a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt spec0->blue = spec1->blue; \ 538c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell } \ 539c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell} while (0) 540c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell 541c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell/* These don't need LE32_TO_CPU() as they used to save and restore 542c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell * colors which are already in the correct format. 543c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell */ 544c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell#define VERT_SAVE_RGBA( idx ) color[idx] = v[idx]->ui[coloroffset] 545c4f7de5d785266237fd46ee420d4715771f67dfbKeith Whitwell#define VERT_RESTORE_RGBA( idx ) v[idx]->ui[coloroffset] = color[idx] 5468a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define VERT_SAVE_SPEC( idx ) if (specoffset) spec[idx] = v[idx]->ui[specoffset] 5478a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt#define VERT_RESTORE_SPEC( idx ) if (specoffset) v[idx]->ui[specoffset] = spec[idx] 5485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef LOCAL_VARS 5505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef TAG 5515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef INIT 5525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define LOCAL_VARS(n) \ 5544637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); \ 5555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint color[n], spec[n]; \ 5568a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt GLuint coloroffset = rmesa->swtcl.coloroffset; \ 5578a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt GLuint specoffset = rmesa->swtcl.specoffset; \ 5588a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt (void) color; (void) spec; (void) coloroffset; (void) specoffset; 5595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*********************************************************************** 5615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Helpers for rendering unfilled primitives * 5625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/ 5635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RASTERIZE(x) radeonRasterPrimitive( ctx, reduced_hw_prim[x] ) 565b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie#define RENDER_PRIMITIVE rmesa->radeon.swtcl.render_primitive 5665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef TAG 5675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x 5685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_unfilled.h" 5695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef IND 5705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*********************************************************************** 5735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Generate GL render functions * 5745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ***********************************************************************/ 5755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define IND (0) 5785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x 5795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_tritmp.h" 5805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define IND (RADEON_TWOSIDE_BIT) 5825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x##_twoside 5835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_tritmp.h" 5845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define IND (RADEON_UNFILLED_BIT) 5865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x##_unfilled 5875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_tritmp.h" 5885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define IND (RADEON_TWOSIDE_BIT|RADEON_UNFILLED_BIT) 5905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) x##_twoside_unfilled 5915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl_dd/t_dd_tritmp.h" 5925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void init_rast_tab( void ) 5955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 5965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul init(); 5975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul init_twoside(); 5985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul init_unfilled(); 5995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul init_twoside_unfilled(); 6005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 6015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/ 6035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Render unclipped begin/end objects */ 6045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/ 6055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RENDER_POINTS( start, count ) \ 6075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul for ( ; start < count ; start++) \ 6085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeon_point( rmesa, VERT(start) ) 6095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RENDER_LINE( v0, v1 ) \ 6105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeon_line( rmesa, VERT(v0), VERT(v1) ) 6115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RENDER_TRI( v0, v1, v2 ) \ 6125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeon_triangle( rmesa, VERT(v0), VERT(v1), VERT(v2) ) 6135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RENDER_QUAD( v0, v1, v2, v3 ) \ 6145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeon_quad( rmesa, VERT(v0), VERT(v1), VERT(v2), VERT(v3) ) 6155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef INIT 6165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define INIT(x) do { \ 6175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonRenderPrimitive( ctx, x ); \ 6185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} while (0) 6195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef LOCAL_VARS 6205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define LOCAL_VARS \ 6214637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); \ 622b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie const GLuint vertsize = rmesa->radeon.swtcl.vertex_size; \ 623b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie const char *radeonverts = (char *)rmesa->radeon.swtcl.verts; \ 6245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul const GLuint * const elt = TNL_CONTEXT(ctx)->vb.Elts; \ 6255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul const GLboolean stipple = ctx->Line.StippleFlag; \ 6265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul (void) elt; (void) stipple; 6275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RESET_STIPPLE if ( stipple ) radeonResetLineStipple( ctx ); 6285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define RESET_OCCLUSION 6295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define PRESERVE_VB_DEFS 6305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define ELT(x) (x) 6315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) radeon_##x##_verts 6325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/t_vb_rendertmp.h" 6335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef ELT 6345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#undef TAG 6355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TAG(x) radeon_##x##_elts 6365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define ELT(x) elt[x] 6375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "tnl/t_vb_rendertmp.h" 6385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/ 6425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Choose render functions */ 6435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/ 6445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonChooseRenderState( GLcontext *ctx ) 6465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 6475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TNLcontext *tnl = TNL_CONTEXT(ctx); 6484637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 6495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint index = 0; 6505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint flags = ctx->_TriangleCaps; 6515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6524637235183b80963536f2364e4d50fcb894886ddDave Airlie if (!rmesa->radeon.TclFallback || rmesa->radeon.Fallback) 6535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 6545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (flags & DD_TRI_LIGHT_TWOSIDE) index |= RADEON_TWOSIDE_BIT; 6565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (flags & DD_TRI_UNFILLED) index |= RADEON_UNFILLED_BIT; 6575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 658b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie if (index != rmesa->radeon.swtcl.RenderIndex) { 6595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tnl->Driver.Render.Points = rast_tab[index].points; 6605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tnl->Driver.Render.Line = rast_tab[index].line; 6615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tnl->Driver.Render.ClippedLine = rast_tab[index].line; 6625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tnl->Driver.Render.Triangle = rast_tab[index].triangle; 6635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tnl->Driver.Render.Quad = rast_tab[index].quad; 6645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (index == 0) { 6665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tnl->Driver.Render.PrimTabVerts = radeon_render_tab_verts; 6675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tnl->Driver.Render.PrimTabElts = radeon_render_tab_elts; 6685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tnl->Driver.Render.ClippedPolygon = radeon_fast_clipped_poly; 6695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 6705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tnl->Driver.Render.PrimTabVerts = _tnl_render_tab_verts; 6715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tnl->Driver.Render.PrimTabElts = _tnl_render_tab_elts; 6725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tnl->Driver.Render.ClippedPolygon = _tnl_RenderClippedPolygon; 6735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 675b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rmesa->radeon.swtcl.RenderIndex = index; 6765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 6785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/ 6815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* High level hooks for t_vb_render.c */ 6825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/ 6835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonRasterPrimitive( GLcontext *ctx, GLuint hwprim ) 6865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 6874637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 6885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 689b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie if (rmesa->radeon.swtcl.hw_primitive != hwprim) { 6905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_NEWPRIM( rmesa ); 691b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rmesa->radeon.swtcl.hw_primitive = hwprim; 6925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 6945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonRenderPrimitive( GLcontext *ctx, GLenum prim ) 6965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 6974637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 698b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rmesa->radeon.swtcl.render_primitive = prim; 6995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (prim < GL_TRIANGLES || !(ctx->_TriangleCaps & DD_TRI_UNFILLED)) 7005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonRasterPrimitive( ctx, reduced_hw_prim[prim] ); 7015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 7025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonRenderFinish( GLcontext *ctx ) 7045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 7055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 7065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonResetLineStipple( GLcontext *ctx ) 7085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 7094637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 7105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, lin ); 7115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 7125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/ 7155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Transition to/from hardware rasterization. */ 7165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/ 7175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic const char * const fallbackStrings[] = { 7195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul "Texture mode", 7205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul "glDrawBuffer(GL_FRONT_AND_BACK)", 7215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul "glEnable(GL_STENCIL) without hw stencil buffer", 7225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul "glRenderMode(selection or feedback)", 7235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul "glBlendEquation", 7245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul "glBlendFunc", 7255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul "RADEON_NO_RAST", 7265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul "Mixing GL_CLAMP_TO_BORDER and GL_CLAMP (or GL_MIRROR_CLAMP_ATI)" 7275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}; 7285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic const char *getFallbackString(GLuint bit) 7315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 7325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul int i = 0; 7335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul while (bit > 1) { 7345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul i++; 7355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul bit >>= 1; 7365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return fallbackStrings[i]; 7385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 7395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonFallback( GLcontext *ctx, GLuint bit, GLboolean mode ) 7425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 7434637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 7445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TNLcontext *tnl = TNL_CONTEXT(ctx); 7454637235183b80963536f2364e4d50fcb894886ddDave Airlie GLuint oldfallback = rmesa->radeon.Fallback; 7465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (mode) { 7484637235183b80963536f2364e4d50fcb894886ddDave Airlie rmesa->radeon.Fallback |= bit; 7495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (oldfallback == 0) { 7501090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie radeon_firevertices(&rmesa->radeon); 7515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_RASTER, GL_TRUE ); 7525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _swsetup_Wakeup( ctx ); 753b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rmesa->radeon.swtcl.RenderIndex = ~0; 7545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (RADEON_DEBUG & DEBUG_FALLBACKS) { 7555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fprintf(stderr, "Radeon begin rasterization fallback: 0x%x %s\n", 7565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul bit, getFallbackString(bit)); 7575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else { 7614637235183b80963536f2364e4d50fcb894886ddDave Airlie rmesa->radeon.Fallback &= ~bit; 7625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (oldfallback == bit) { 7635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _swrast_flush( ctx ); 7645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tnl->Driver.Render.Start = radeonRenderStart; 7655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tnl->Driver.Render.PrimitiveNotify = radeonRenderPrimitive; 7665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tnl->Driver.Render.Finish = radeonRenderFinish; 7678a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt 7688a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt tnl->Driver.Render.BuildVertices = _tnl_build_vertices; 7698a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt tnl->Driver.Render.CopyPV = _tnl_copy_pv; 7708a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt tnl->Driver.Render.Interp = _tnl_interp; 7718a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt 7725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tnl->Driver.Render.ResetLineStipple = radeonResetLineStipple; 7735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TCL_FALLBACK( ctx, RADEON_TCL_FALLBACK_RASTER, GL_FALSE ); 7744637235183b80963536f2364e4d50fcb894886ddDave Airlie if (rmesa->radeon.TclFallback) { 7754637235183b80963536f2364e4d50fcb894886ddDave Airlie /* These are already done if rmesa->radeon.TclFallback goes to 7765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * zero above. But not if it doesn't (RADEON_NO_TCL for 7775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * example?) 7785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 779555b5fac4f47576f04d8e4159dc22f72a2b0a397Roland Scheidegger _tnl_invalidate_vertex_state( ctx, ~0 ); 780555b5fac4f47576f04d8e4159dc22f72a2b0a397Roland Scheidegger _tnl_invalidate_vertices( ctx, ~0 ); 7814637235183b80963536f2364e4d50fcb894886ddDave Airlie RENDERINPUTS_ZERO( rmesa->radeon.tnl_index_bitset ); 7825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonChooseVertexState( ctx ); 7835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonChooseRenderState( ctx ); 7845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (RADEON_DEBUG & DEBUG_FALLBACKS) { 7865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fprintf(stderr, "Radeon end rasterization fallback: 0x%x %s\n", 7875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul bit, getFallbackString(bit)); 7885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 7925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/ 7955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Initialization. */ 7965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**********************************************************************/ 7975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulvoid radeonInitSwtcl( GLcontext *ctx ) 7995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 8005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul TNLcontext *tnl = TNL_CONTEXT(ctx); 8014637235183b80963536f2364e4d50fcb894886ddDave Airlie r100ContextPtr rmesa = R100_CONTEXT(ctx); 8025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul static int firsttime = 1; 8035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (firsttime) { 8055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul init_rast_tab(); 8065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul firsttime = 0; 8075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 8085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tnl->Driver.Render.Start = radeonRenderStart; 8105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tnl->Driver.Render.Finish = radeonRenderFinish; 8115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tnl->Driver.Render.PrimitiveNotify = radeonRenderPrimitive; 8125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul tnl->Driver.Render.ResetLineStipple = radeonResetLineStipple; 8138a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt tnl->Driver.Render.BuildVertices = _tnl_build_vertices; 8148a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt tnl->Driver.Render.CopyPV = _tnl_copy_pv; 8158a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt tnl->Driver.Render.Interp = _tnl_interp; 8165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8178a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt _tnl_init_vertices( ctx, ctx->Const.MaxArrayLockSize + 12, 8188a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt RADEON_MAX_TNL_VERTEX_SIZE); 8198a1df968627de01d04f3d692fd81108ba6492c18Eric Anholt 820b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rmesa->radeon.swtcl.verts = (GLubyte *)tnl->clipspace.vertex_buf; 821b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rmesa->radeon.swtcl.RenderIndex = ~0; 822b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rmesa->radeon.swtcl.render_primitive = GL_TRIANGLES; 823b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie rmesa->radeon.swtcl.hw_primitive = 0; 8245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 8255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 826