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