1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCopyright (C) The Weather Channel, Inc.  2002.  All Rights Reserved.
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgThe Weather Channel (TM) funded Tungsten Graphics to develop the
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orginitial release of the Radeon 8500 driver under the XFree86 license.
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgThis notice must be preserved.
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPermission is hereby granted, free of charge, to any person obtaining
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orga copy of this software and associated documentation files (the
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org"Software"), to deal in the Software without restriction, including
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwithout limitation the rights to use, copy, modify, merge, publish,
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdistribute, sublicense, and/or sell copies of the Software, and to
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpermit persons to whom the Software is furnished to do so, subject to
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgthe following conditions:
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgThe above copyright notice and this permission notice (including the
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnext paragraph) shall be included in all copies or substantial
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgportions of the Software.
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgIN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org**************************************************************************/
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors:
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *   Keith Whitwell <keith@tungstengraphics.com>
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/glheader.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/mtypes.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/colormac.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/enums.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/image.h"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/imports.h"
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/macros.h"
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/simple_list.h"
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast/s_context.h"
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast/s_fog.h"
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "swrast_setup/swrast_setup.h"
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl/tnl.h"
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl/t_context.h"
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl/t_pipeline.h"
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r200_context.h"
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r200_ioctl.h"
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r200_state.h"
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r200_swtcl.h"
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r200_tcl.h"
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***********************************************************************
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *                         Initialization
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ***********************************************************************/
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define EMIT_ATTR( ATTR, STYLE, F0 )					\
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo {									\
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].attrib = (ATTR);	\
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].format = (STYLE);	\
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->radeon.swtcl.vertex_attr_count++;					\
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fmt_0 |= F0;								\
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0)
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define EMIT_PAD( N )							\
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo {									\
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].attrib = 0;		\
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].format = EMIT_PAD;	\
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].offset = (N);		\
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->radeon.swtcl.vertex_attr_count++;					\
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0)
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200SetVertexFormat( struct gl_context *ctx )
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT( ctx );
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TNLcontext *tnl = TNL_CONTEXT(ctx);
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct vertex_buffer *VB = &tnl->vb;
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLbitfield64 index_bitset = tnl->render_inputs_bitset;
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int fmt_0 = 0;
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int fmt_1 = 0;
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int offset = 0;
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Important:
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ( VB->NdcPtr != NULL ) {
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      VB->AttribPtr[VERT_ATTRIB_POS] = VB->NdcPtr;
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      VB->AttribPtr[VERT_ATTRIB_POS] = VB->ClipPtr;
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert( VB->AttribPtr[VERT_ATTRIB_POS] != NULL );
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->radeon.swtcl.vertex_attr_count = 0;
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* EMIT_ATTR's must be in order as they tell t_vertex.c how to
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * build up a hardware vertex.
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ( !rmesa->swtcl.needproj ||
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        (index_bitset & BITFIELD64_RANGE(_TNL_ATTRIB_TEX0, _TNL_NUM_TEX)) ) {
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* need w coord for projected textures */
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_4F, R200_VTX_XY | R200_VTX_Z0 | R200_VTX_W0 );
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      offset = 4;
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      EMIT_ATTR( _TNL_ATTRIB_POS, EMIT_3F, R200_VTX_XY | R200_VTX_Z0 );
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      offset = 3;
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (index_bitset & BITFIELD64_BIT(_TNL_ATTRIB_POINTSIZE)) {
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      EMIT_ATTR( _TNL_ATTRIB_POINTSIZE, EMIT_1F, R200_VTX_POINT_SIZE );
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      offset += 1;
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->swtcl.coloroffset = offset;
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if MESA_LITTLE_ENDIAN
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EMIT_ATTR( _TNL_ATTRIB_COLOR0, EMIT_4UB_4F_RGBA, (R200_VTX_PK_RGBA << R200_VTX_COLOR_0_SHIFT) );
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EMIT_ATTR( _TNL_ATTRIB_COLOR0, EMIT_4UB_4F_ABGR, (R200_VTX_PK_RGBA << R200_VTX_COLOR_0_SHIFT) );
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   offset += 1;
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->swtcl.specoffset = 0;
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (index_bitset &
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       (BITFIELD64_BIT(_TNL_ATTRIB_COLOR1) | BITFIELD64_BIT(_TNL_ATTRIB_FOG))) {
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if MESA_LITTLE_ENDIAN
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (index_bitset & BITFIELD64_BIT(_TNL_ATTRIB_COLOR1)) {
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->swtcl.specoffset = offset;
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EMIT_ATTR( _TNL_ATTRIB_COLOR1, EMIT_3UB_3F_RGB, (R200_VTX_PK_RGBA << R200_VTX_COLOR_1_SHIFT) );
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EMIT_PAD( 3 );
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (index_bitset & BITFIELD64_BIT(_TNL_ATTRIB_FOG)) {
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EMIT_ATTR( _TNL_ATTRIB_FOG, EMIT_1UB_1F, (R200_VTX_PK_RGBA << R200_VTX_COLOR_1_SHIFT) );
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EMIT_PAD( 1 );
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (index_bitset & BITFIELD64_BIT(_TNL_ATTRIB_FOG)) {
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EMIT_ATTR( _TNL_ATTRIB_FOG, EMIT_1UB_1F, (R200_VTX_PK_RGBA << R200_VTX_COLOR_1_SHIFT) );
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EMIT_PAD( 1 );
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (index_bitset & BITFIELD64_BIT(_TNL_ATTRIB_COLOR1)) {
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->swtcl.specoffset = offset;
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EMIT_ATTR( _TNL_ATTRIB_COLOR1, EMIT_3UB_3F_BGR, (R200_VTX_PK_RGBA << R200_VTX_COLOR_1_SHIFT) );
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EMIT_PAD( 3 );
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (index_bitset & BITFIELD64_RANGE(_TNL_ATTRIB_TEX0, _TNL_NUM_TEX)) {
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int i;
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (index_bitset & BITFIELD64_BIT(_TNL_ATTRIB_TEX(i))) {
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    GLuint sz = VB->AttribPtr[_TNL_ATTRIB_TEX0 + i]->size;
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    fmt_1 |= sz << (3 * i);
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    EMIT_ATTR( _TNL_ATTRIB_TEX0+i, EMIT_1F + sz - 1, 0 );
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ( (rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] & R200_FOG_USE_MASK)
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      != R200_FOG_USE_SPEC_ALPHA ) {
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, ctx );
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] &= ~R200_FOG_USE_MASK;
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] |= R200_FOG_USE_SPEC_ALPHA;
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (rmesa->radeon.tnl_index_bitset != index_bitset ||
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	(rmesa->hw.vtx.cmd[VTX_VTXFMT_0] != fmt_0) ||
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	(rmesa->hw.vtx.cmd[VTX_VTXFMT_1] != fmt_1) ) {
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_NEWPRIM(rmesa);
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, vtx );
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.vtx.cmd[VTX_VTXFMT_0] = fmt_0;
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.vtx.cmd[VTX_VTXFMT_1] = fmt_1;
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->radeon.swtcl.vertex_size =
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  _tnl_install_attrs( ctx,
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      rmesa->radeon.swtcl.vertex_attrs,
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      rmesa->radeon.swtcl.vertex_attr_count,
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      NULL, 0 );
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->radeon.swtcl.vertex_size /= 4;
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->radeon.tnl_index_bitset = index_bitset;
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200_predict_emit_size( r200ContextPtr rmesa )
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (RADEON_DEBUG & RADEON_VERTS)
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "%s\n", __func__);
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int vertex_array_size = 7;
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int prim_size = 3;
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!rmesa->radeon.swtcl.emit_prediction) {
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const int state_size = radeonCountStateEmitSize(&rmesa->radeon);
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (rcommonEnsureCmdBufSpace(&rmesa->radeon,
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       state_size +
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       vertex_array_size + prim_size,
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       __FUNCTION__))
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->radeon.swtcl.emit_prediction = radeonCountStateEmitSize(&rmesa->radeon);
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->radeon.swtcl.emit_prediction = state_size;
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->radeon.swtcl.emit_prediction += vertex_array_size + prim_size
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 + rmesa->radeon.cmdbuf.cs->cdw;
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200RenderStart( struct gl_context *ctx )
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200SetVertexFormat( ctx );
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (RADEON_DEBUG & RADEON_VERTS)
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "%s\n", __func__);
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set vertex state for SW TCL.  The primary purpose of this function is to
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * determine in advance whether or not the hardware can / should do the
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * projection divide or Mesa should do it.
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r200ChooseVertexState( struct gl_context *ctx )
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT( ctx );
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TNLcontext *tnl = TNL_CONTEXT(ctx);
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint vte;
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint vap;
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* We must ensure that we don't do _tnl_need_projected_coords while in a
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * rasterization fallback.  As this function will be called again when we
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * leave a rasterization fallback, we can just skip it for now.
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (rmesa->radeon.Fallback != 0)
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vte = rmesa->hw.vte.cmd[VTE_SE_VTE_CNTL];
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vap = rmesa->hw.vap.cmd[VAP_SE_VAP_CNTL];
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* HW perspective divide is a win, but tiny vertex formats are a
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * bigger one.
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ((0 == (tnl->render_inputs_bitset & BITFIELD64_RANGE(_TNL_ATTRIB_TEX0, _TNL_NUM_TEX)))
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	|| (ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED))) {
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->swtcl.needproj = GL_TRUE;
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vte |= R200_VTX_XY_FMT | R200_VTX_Z_FMT;
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vte &= ~R200_VTX_W0_FMT;
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (tnl->render_inputs_bitset & BITFIELD64_RANGE(_TNL_ATTRIB_TEX0, _TNL_NUM_TEX)) {
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 vap &= ~R200_VAP_FORCE_W_TO_ONE;
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 vap |= R200_VAP_FORCE_W_TO_ONE;
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->swtcl.needproj = GL_FALSE;
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vte &= ~(R200_VTX_XY_FMT | R200_VTX_Z_FMT);
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vte |= R200_VTX_W0_FMT;
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vap &= ~R200_VAP_FORCE_W_TO_ONE;
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _tnl_need_projected_coords( ctx, rmesa->swtcl.needproj );
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (vte != rmesa->hw.vte.cmd[VTE_SE_VTE_CNTL]) {
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, vte );
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.vte.cmd[VTE_SE_VTE_CNTL] = vte;
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (vap != rmesa->hw.vap.cmd[VAP_SE_VAP_CNTL]) {
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_STATECHANGE( rmesa, vap );
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->hw.vap.cmd[VAP_SE_VAP_CNTL] = vap;
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r200_swtcl_flush(struct gl_context *ctx, uint32_t current_offset)
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (RADEON_DEBUG & RADEON_VERTS)
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "%s\n", __func__);
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   radeonEmitState(&rmesa->radeon);
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200EmitVertexAOS( rmesa,
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		      rmesa->radeon.swtcl.vertex_size,
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		      rmesa->radeon.swtcl.bo,
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		      current_offset);
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200EmitVbufPrim( rmesa,
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     rmesa->radeon.swtcl.hw_primitive,
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     rmesa->radeon.swtcl.numverts);
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ( rmesa->radeon.swtcl.emit_prediction < rmesa->radeon.cmdbuf.cs->cdw )
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      WARN_ONCE("Rendering was %d commands larger than predicted size."
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    " We might overflow  command buffer.\n",
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    rmesa->radeon.cmdbuf.cs->cdw - rmesa->radeon.swtcl.emit_prediction );
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->radeon.swtcl.emit_prediction = 0;
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************/
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE GLuint reduced_hw_prim( struct gl_context *ctx, GLuint prim)
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (prim) {
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_POINTS:
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return ((!(ctx->_TriangleCaps & DD_POINT_SMOOTH)) ?
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 R200_VF_PRIM_POINT_SPRITES : R200_VF_PRIM_POINTS);
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LINES:
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* fallthrough */
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LINE_LOOP:
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* fallthrough */
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LINE_STRIP:
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return R200_VF_PRIM_LINES;
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* all others reduced to triangles */
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return R200_VF_PRIM_TRIANGLES;
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200RasterPrimitive( struct gl_context *ctx, GLuint hwprim );
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200RenderPrimitive( struct gl_context *ctx, GLenum prim );
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200ResetLineStipple( struct gl_context *ctx );
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***********************************************************************
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *                    Emit primitives as inline vertices               *
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ***********************************************************************/
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HAVE_POINTS      1
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HAVE_LINES       1
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HAVE_LINE_STRIPS 1
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HAVE_TRIANGLES   1
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HAVE_TRI_STRIPS  1
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HAVE_TRI_STRIP_1 0
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HAVE_TRI_FANS    1
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HAVE_QUADS       0
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HAVE_QUAD_STRIPS 0
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HAVE_POLYGONS    1
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HAVE_ELTS        0
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void* r200_alloc_verts( r200ContextPtr rmesa, GLuint n, GLuint size)
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void *rv;
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   do {
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r200_predict_emit_size( rmesa );
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rv = rcommonAllocDmaLowVerts( &rmesa->radeon, n, size * 4 );
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } while(!rv);
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return rv;
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef LOCAL_VARS
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef ALLOC_VERTS
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CTX_ARG r200ContextPtr rmesa
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GET_VERTEX_DWORDS() rmesa->radeon.swtcl.vertex_size
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ALLOC_VERTS( n, size ) r200_alloc_verts(rmesa, n, size)
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LOCAL_VARS						\
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);		\
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *r200verts = (char *)rmesa->radeon.swtcl.verts;
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VERT(x) (radeonVertex *)(r200verts + ((x) * vertsize * sizeof(int)))
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VERTEX radeonVertex
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DO_DEBUG_VERTS (1 && (R200_DEBUG & RADEON_VERTS))
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef TAG
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TAG(x) r200_##x
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl_dd/t_dd_triemit.h"
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***********************************************************************
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *          Macros for t_dd_tritmp.h to draw basic primitives          *
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ***********************************************************************/
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define QUAD( a, b, c, d ) r200_quad( rmesa, a, b, c, d )
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TRI( a, b, c )     r200_triangle( rmesa, a, b, c )
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LINE( a, b )       r200_line( rmesa, a, b )
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define POINT( a )         r200_point( rmesa, a )
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***********************************************************************
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *              Build render functions from dd templates               *
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ***********************************************************************/
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define R200_TWOSIDE_BIT	0x01
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define R200_UNFILLED_BIT	0x02
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define R200_MAX_TRIFUNC	0x04
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct {
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tnl_points_func	        points;
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tnl_line_func		line;
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tnl_triangle_func	triangle;
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tnl_quad_func		quad;
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} rast_tab[R200_MAX_TRIFUNC];
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DO_FALLBACK  0
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DO_UNFILLED (IND & R200_UNFILLED_BIT)
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DO_TWOSIDE  (IND & R200_TWOSIDE_BIT)
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DO_FLAT      0
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DO_OFFSET     0
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DO_TRI       1
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DO_QUAD      1
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DO_LINE      1
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DO_POINTS    1
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DO_FULL_QUAD 1
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HAVE_SPEC   1
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HAVE_BACK_COLORS  0
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HAVE_HW_FLATSHADE 1
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TAB rast_tab
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DEPTH_SCALE 1.0
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UNFILLED_TRI unfilled_tri
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UNFILLED_QUAD unfilled_quad
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VERT_X(_v) _v->v.x
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VERT_Y(_v) _v->v.y
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VERT_Z(_v) _v->v.z
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define AREA_IS_CCW( a ) (a < 0)
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GET_VERTEX(e) (rmesa->radeon.swtcl.verts + (e*rmesa->radeon.swtcl.vertex_size*sizeof(int)))
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VERT_SET_RGBA( v, c )  					\
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo {								\
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   radeon_color_t *color = (radeon_color_t *)&((v)->ui[coloroffset]);	\
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UNCLAMPED_FLOAT_TO_UBYTE(color->red, (c)[0]);		\
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UNCLAMPED_FLOAT_TO_UBYTE(color->green, (c)[1]);		\
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UNCLAMPED_FLOAT_TO_UBYTE(color->blue, (c)[2]);		\
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UNCLAMPED_FLOAT_TO_UBYTE(color->alpha, (c)[3]);		\
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0)
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VERT_COPY_RGBA( v0, v1 ) v0->ui[coloroffset] = v1->ui[coloroffset]
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VERT_SET_SPEC( v, c )					\
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo {								\
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (specoffset) {						\
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      radeon_color_t *spec = (radeon_color_t *)&((v)->ui[specoffset]);	\
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      UNCLAMPED_FLOAT_TO_UBYTE(spec->red, (c)[0]);	\
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      UNCLAMPED_FLOAT_TO_UBYTE(spec->green, (c)[1]);	\
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      UNCLAMPED_FLOAT_TO_UBYTE(spec->blue, (c)[2]);	\
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }								\
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0)
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VERT_COPY_SPEC( v0, v1 )			\
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo {							\
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (specoffset) {					\
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      radeon_color_t *spec0 = (radeon_color_t *)&((v0)->ui[specoffset]);	\
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      radeon_color_t *spec1 = (radeon_color_t *)&((v1)->ui[specoffset]);	\
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      spec0->red   = spec1->red;	\
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      spec0->green = spec1->green;	\
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      spec0->blue  = spec1->blue; 	\
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }							\
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0)
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* These don't need LE32_TO_CPU() as they used to save and restore
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * colors which are already in the correct format.
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VERT_SAVE_RGBA( idx )    color[idx] = v[idx]->ui[coloroffset]
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VERT_RESTORE_RGBA( idx ) v[idx]->ui[coloroffset] = color[idx]
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VERT_SAVE_SPEC( idx )    if (specoffset) spec[idx] = v[idx]->ui[specoffset]
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VERT_RESTORE_SPEC( idx ) if (specoffset) v[idx]->ui[specoffset] = spec[idx]
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef LOCAL_VARS
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef TAG
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef INIT
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LOCAL_VARS(n)							\
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);			\
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint color[n] = {0}, spec[n] = {0};						\
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint coloroffset = rmesa->swtcl.coloroffset;	\
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint specoffset = rmesa->swtcl.specoffset;			\
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) color; (void) spec; (void) coloroffset; (void) specoffset;
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***********************************************************************
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *                Helpers for rendering unfilled primitives            *
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ***********************************************************************/
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RASTERIZE(x) r200RasterPrimitive( ctx, reduced_hw_prim(ctx, x) )
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RENDER_PRIMITIVE rmesa->radeon.swtcl.render_primitive
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef TAG
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TAG(x) x
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl_dd/t_dd_unfilled.h"
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef IND
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***********************************************************************
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *                      Generate GL render functions                   *
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ***********************************************************************/
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IND (0)
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TAG(x) x
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl_dd/t_dd_tritmp.h"
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IND (R200_TWOSIDE_BIT)
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TAG(x) x##_twoside
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl_dd/t_dd_tritmp.h"
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IND (R200_UNFILLED_BIT)
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TAG(x) x##_unfilled
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl_dd/t_dd_tritmp.h"
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IND (R200_TWOSIDE_BIT|R200_UNFILLED_BIT)
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TAG(x) x##_twoside_unfilled
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl_dd/t_dd_tritmp.h"
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void init_rast_tab( void )
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   init();
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   init_twoside();
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   init_unfilled();
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   init_twoside_unfilled();
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*               Render unclipped begin/end objects                   */
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RENDER_POINTS( start, count )		\
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for ( ; start < count ; start++)		\
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r200_point( rmesa, VERT(start) )
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RENDER_LINE( v0, v1 ) \
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200_line( rmesa, VERT(v0), VERT(v1) )
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RENDER_TRI( v0, v1, v2 )  \
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200_triangle( rmesa, VERT(v0), VERT(v1), VERT(v2) )
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RENDER_QUAD( v0, v1, v2, v3 ) \
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200_quad( rmesa, VERT(v0), VERT(v1), VERT(v2), VERT(v3) )
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INIT(x) do {					\
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200RenderPrimitive( ctx, x );			\
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0)
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef LOCAL_VARS
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LOCAL_VARS						\
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);		\
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLuint vertsize = rmesa->radeon.swtcl.vertex_size;		\
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *r200verts = (char *)rmesa->radeon.swtcl.verts;		\
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLuint * const elt = TNL_CONTEXT(ctx)->vb.Elts;	\
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLboolean stipple = ctx->Line.StippleFlag;		\
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) elt; (void) stipple;
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RESET_STIPPLE	if ( stipple ) r200ResetLineStipple( ctx );
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RESET_OCCLUSION
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PRESERVE_VB_DEFS
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ELT(x) (x)
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TAG(x) r200_##x##_verts
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl/t_vb_rendertmp.h"
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef ELT
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef TAG
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TAG(x) r200_##x##_elts
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ELT(x) elt[x]
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tnl/t_vb_rendertmp.h"
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*                    Choose render functions                         */
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r200ChooseRenderState( struct gl_context *ctx )
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TNLcontext *tnl = TNL_CONTEXT(ctx);
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint index = 0;
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint flags = ctx->_TriangleCaps;
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!rmesa->radeon.TclFallback || rmesa->radeon.Fallback)
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (flags & DD_TRI_LIGHT_TWOSIDE) index |= R200_TWOSIDE_BIT;
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (flags & DD_TRI_UNFILLED)      index |= R200_UNFILLED_BIT;
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (index != rmesa->radeon.swtcl.RenderIndex) {
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      tnl->Driver.Render.Points = rast_tab[index].points;
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      tnl->Driver.Render.Line = rast_tab[index].line;
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      tnl->Driver.Render.ClippedLine = rast_tab[index].line;
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      tnl->Driver.Render.Triangle = rast_tab[index].triangle;
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      tnl->Driver.Render.Quad = rast_tab[index].quad;
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (index == 0) {
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tnl->Driver.Render.PrimTabVerts = r200_render_tab_verts;
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tnl->Driver.Render.PrimTabElts = r200_render_tab_elts;
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tnl->Driver.Render.ClippedPolygon = r200_fast_clipped_poly;
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tnl->Driver.Render.PrimTabVerts = _tnl_render_tab_verts;
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tnl->Driver.Render.PrimTabElts = _tnl_render_tab_elts;
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tnl->Driver.Render.ClippedPolygon = _tnl_RenderClippedPolygon;
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->radeon.swtcl.RenderIndex = index;
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*                 High level hooks for t_vb_render.c                 */
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200RasterPrimitive( struct gl_context *ctx, GLuint hwprim )
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   radeon_prepare_render(&rmesa->radeon);
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (rmesa->radeon.NewGLState)
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r200ValidateState( ctx );
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (rmesa->radeon.swtcl.hw_primitive != hwprim) {
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* need to disable perspective-correct texturing for point sprites */
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ((hwprim & 0xf) == R200_VF_PRIM_POINT_SPRITES && ctx->Point.PointSprite) {
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (rmesa->hw.set.cmd[SET_RE_CNTL] & R200_PERSPECTIVE_ENABLE) {
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    R200_STATECHANGE( rmesa, set );
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    rmesa->hw.set.cmd[SET_RE_CNTL] &= ~R200_PERSPECTIVE_ENABLE;
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (!(rmesa->hw.set.cmd[SET_RE_CNTL] & R200_PERSPECTIVE_ENABLE)) {
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 R200_STATECHANGE( rmesa, set );
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.set.cmd[SET_RE_CNTL] |= R200_PERSPECTIVE_ENABLE;
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      R200_NEWPRIM( rmesa );
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->radeon.swtcl.hw_primitive = hwprim;
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200RenderPrimitive( struct gl_context *ctx, GLenum prim )
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->radeon.swtcl.render_primitive = prim;
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (prim < GL_TRIANGLES || !(ctx->_TriangleCaps & DD_TRI_UNFILLED))
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r200RasterPrimitive( ctx, reduced_hw_prim(ctx, prim) );
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200RenderFinish( struct gl_context *ctx )
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200ResetLineStipple( struct gl_context *ctx )
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_STATECHANGE( rmesa, lin );
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*           Transition to/from hardware rasterization.               */
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char * const fallbackStrings[] = {
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "Texture mode",
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "glDrawBuffer(GL_FRONT_AND_BACK)",
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "glEnable(GL_STENCIL) without hw stencil buffer",
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "glRenderMode(selection or feedback)",
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "R200_NO_RAST",
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   "Mixing GL_CLAMP_TO_BORDER and GL_CLAMP (or GL_MIRROR_CLAMP_ATI)"
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char *getFallbackString(GLuint bit)
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i = 0;
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   while (bit > 1) {
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      i++;
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bit >>= 1;
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return fallbackStrings[i];
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r200Fallback( struct gl_context *ctx, GLuint bit, GLboolean mode )
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TNLcontext *tnl = TNL_CONTEXT(ctx);
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint oldfallback = rmesa->radeon.Fallback;
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (mode) {
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->radeon.Fallback |= bit;
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (oldfallback == 0) {
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 radeon_firevertices(&rmesa->radeon);
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 TCL_FALLBACK( ctx, R200_TCL_FALLBACK_RASTER, GL_TRUE );
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 _swsetup_Wakeup( ctx );
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->radeon.swtcl.RenderIndex = ~0;
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (R200_DEBUG & RADEON_FALLBACKS) {
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            fprintf(stderr, "R200 begin rasterization fallback: 0x%x %s\n",
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    bit, getFallbackString(bit));
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->radeon.Fallback &= ~bit;
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (oldfallback == bit) {
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 _swrast_flush( ctx );
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tnl->Driver.Render.Start = r200RenderStart;
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tnl->Driver.Render.PrimitiveNotify = r200RenderPrimitive;
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tnl->Driver.Render.Finish = r200RenderFinish;
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tnl->Driver.Render.BuildVertices = _tnl_build_vertices;
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tnl->Driver.Render.CopyPV = _tnl_copy_pv;
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tnl->Driver.Render.Interp = _tnl_interp;
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tnl->Driver.Render.ResetLineStipple = r200ResetLineStipple;
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 TCL_FALLBACK( ctx, R200_TCL_FALLBACK_RASTER, GL_FALSE );
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (rmesa->radeon.TclFallback) {
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    /* These are already done if rmesa->radeon.TclFallback goes to
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     * zero above. But not if it doesn't (R200_NO_TCL for
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     * example?)
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     */
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    _tnl_invalidate_vertex_state( ctx, ~0 );
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    _tnl_invalidate_vertices( ctx, ~0 );
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    rmesa->radeon.tnl_index_bitset = 0;
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    r200ChooseVertexState( ctx );
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    r200ChooseRenderState( ctx );
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (R200_DEBUG & RADEON_FALLBACKS) {
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            fprintf(stderr, "R200 end rasterization fallback: 0x%x %s\n",
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    bit, getFallbackString(bit));
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Cope with depth operations by drawing individual pixels as points.
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \todo
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The way the vertex state is set in this routine is hokey.  It seems to
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * work, but it's very hackish.  This whole routine is pretty hackish.  If
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the bitmap is small enough, it seems like it would be faster to copy it
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to AGP memory and use it as a non-power-of-two texture (i.e.,
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * NV_texture_rectangle).
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgr200PointsBitmap( struct gl_context *ctx, GLint px, GLint py,
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  GLsizei width, GLsizei height,
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  const struct gl_pixelstore_attrib *unpack,
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  const GLubyte *bitmap )
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLfloat *rc = ctx->Current.RasterColor;
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint row, col;
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   radeonVertex vert;
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint orig_vte;
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint h;
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Turn off tcl.
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TCL_FALLBACK( ctx, R200_TCL_FALLBACK_BITMAP, 1 );
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Choose tiny vertex format
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint fmt_0 = R200_VTX_XY | R200_VTX_Z0 | R200_VTX_W0
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  | (R200_VTX_PK_RGBA << R200_VTX_COLOR_0_SHIFT);
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint fmt_1 = 0;
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint vte = rmesa->hw.vte.cmd[VTE_SE_VTE_CNTL];
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint vap = rmesa->hw.vap.cmd[VAP_SE_VAP_CNTL];
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vte &= ~(R200_VTX_XY_FMT | R200_VTX_Z_FMT);
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vte |= R200_VTX_W0_FMT;
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vap &= ~R200_VAP_FORCE_W_TO_ONE;
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rmesa->radeon.swtcl.vertex_size = 5;
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ( (rmesa->hw.vtx.cmd[VTX_VTXFMT_0] != fmt_0)
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   || (rmesa->hw.vtx.cmd[VTX_VTXFMT_1] != fmt_1) ) {
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 R200_NEWPRIM(rmesa);
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 R200_STATECHANGE( rmesa, vtx );
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.vtx.cmd[VTX_VTXFMT_0] = fmt_0;
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.vtx.cmd[VTX_VTXFMT_1] = fmt_1;
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (vte != rmesa->hw.vte.cmd[VTE_SE_VTE_CNTL]) {
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 R200_STATECHANGE( rmesa, vte );
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.vte.cmd[VTE_SE_VTE_CNTL] = vte;
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (vap != rmesa->hw.vap.cmd[VAP_SE_VAP_CNTL]) {
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 R200_STATECHANGE( rmesa, vap );
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.vap.cmd[VAP_SE_VAP_CNTL] = vap;
793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Ready for point primitives:
797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200RenderPrimitive( ctx, GL_POINTS );
799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Turn off the hw viewport transformation:
801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_STATECHANGE( rmesa, vte );
803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   orig_vte = rmesa->hw.vte.cmd[VTE_SE_VTE_CNTL];
804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.vte.cmd[VTE_SE_VTE_CNTL] &= ~(R200_VPORT_X_SCALE_ENA |
805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   R200_VPORT_Y_SCALE_ENA |
806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   R200_VPORT_Z_SCALE_ENA |
807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   R200_VPORT_X_OFFSET_ENA |
808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   R200_VPORT_Y_OFFSET_ENA |
809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					   R200_VPORT_Z_OFFSET_ENA);
810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Turn off other stuff:  Stipple?, texture?, blending?, etc.
812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Populate the vertex
816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Incorporate FOG into RGBA
818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Fog.Enabled) {
820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *fc = ctx->Fog.Color;
821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLfloat color[4];
822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLfloat f;
823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT)
825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         f = _swrast_z_to_fogfactor(ctx, ctx->Current.Attrib[VERT_ATTRIB_FOG][0]);
826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         f = _swrast_z_to_fogfactor(ctx, ctx->Current.RasterDistance);
828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      color[0] = f * rc[0] + (1.F - f) * fc[0];
830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      color[1] = f * rc[1] + (1.F - f) * fc[1];
831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      color[2] = f * rc[2] + (1.F - f) * fc[2];
832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      color[3] = rc[3];
833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      UNCLAMPED_FLOAT_TO_CHAN(vert.tv.color.red,   color[0]);
835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      UNCLAMPED_FLOAT_TO_CHAN(vert.tv.color.green, color[1]);
836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      UNCLAMPED_FLOAT_TO_CHAN(vert.tv.color.blue,  color[2]);
837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      UNCLAMPED_FLOAT_TO_CHAN(vert.tv.color.alpha, color[3]);
838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      UNCLAMPED_FLOAT_TO_CHAN(vert.tv.color.red,   rc[0]);
841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      UNCLAMPED_FLOAT_TO_CHAN(vert.tv.color.green, rc[1]);
842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      UNCLAMPED_FLOAT_TO_CHAN(vert.tv.color.blue,  rc[2]);
843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      UNCLAMPED_FLOAT_TO_CHAN(vert.tv.color.alpha, rc[3]);
844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vert.tv.z = ctx->Current.RasterPos[2];
848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Update window height
851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   h = radeon_get_drawable(&rmesa->radeon)->h;
853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Clipping handled by existing mechansims in r200_ioctl.c?
855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (row=0; row<height; row++) {
857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLubyte *src = (const GLubyte *)
858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 _mesa_image_address2d(unpack, bitmap, width, height,
859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               GL_COLOR_INDEX, GL_BITMAP, row, 0 );
860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (unpack->LsbFirst) {
862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* Lsb first */
863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte mask = 1U << (unpack->SkipPixels & 0x7);
864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (col=0; col<width; col++) {
865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (*src & mask) {
866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       vert.tv.x = px+col;
867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       vert.tv.y = h - (py+row) - 1;
868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       r200_point( rmesa, &vert );
869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    src += (mask >> 7);
871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    mask = ((mask << 1) & 0xff) | (mask >> 7);
872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* get ready for next row */
875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (mask != 1)
876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            src++;
877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* Msb first */
880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLubyte mask = 128U >> (unpack->SkipPixels & 0x7);
881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (col=0; col<width; col++) {
882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (*src & mask) {
883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       vert.tv.x = px+col;
884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       vert.tv.y = h - (py+row) - 1;
885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       r200_point( rmesa, &vert );
886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    src += mask & 1;
888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    mask = ((mask << 7) & 0xff) | (mask >> 1);
889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* get ready for next row */
891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (mask != 128)
892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            src++;
893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Fire outstanding vertices, restore state
897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   R200_STATECHANGE( rmesa, vte );
899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->hw.vte.cmd[VTE_SE_VTE_CNTL] = orig_vte;
900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Unfallback
902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TCL_FALLBACK( ctx, R200_TCL_FALLBACK_BITMAP, 0 );
904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Need to restore vertexformat?
906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (rmesa->radeon.TclFallback)
908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r200ChooseVertexState( ctx );
909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*                            Initialization.                         */
915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r200InitSwtcl( struct gl_context *ctx )
918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TNLcontext *tnl = TNL_CONTEXT(ctx);
920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   static int firsttime = 1;
922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (firsttime) {
924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      init_rast_tab();
925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      firsttime = 0;
926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->radeon.swtcl.emit_prediction = 0;
928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tnl->Driver.Render.Start = r200RenderStart;
930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tnl->Driver.Render.Finish = r200RenderFinish;
931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tnl->Driver.Render.PrimitiveNotify = r200RenderPrimitive;
932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tnl->Driver.Render.ResetLineStipple = r200ResetLineStipple;
933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tnl->Driver.Render.BuildVertices = _tnl_build_vertices;
934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tnl->Driver.Render.CopyPV = _tnl_copy_pv;
935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tnl->Driver.Render.Interp = _tnl_interp;
936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* FIXME: what are these numbers? */
938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _tnl_init_vertices( ctx, ctx->Const.MaxArrayLockSize + 12,
939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		       36 * sizeof(GLfloat) );
940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->radeon.swtcl.verts = (GLubyte *)tnl->clipspace.vertex_buf;
942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->radeon.swtcl.RenderIndex = ~0;
943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->radeon.swtcl.render_primitive = GL_TRIANGLES;
944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->radeon.swtcl.hw_primitive = 0;
945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
947