~ubuntu-branches/ubuntu/gutsy/vnc4/gutsy

« back to all changes in this revision

Viewing changes to unix/xc/lib/GL/mesa/src/drv/i830/i830_vb.c

  • Committer: Bazaar Package Importer
  • Author(s): Ola Lundqvist
  • Date: 2006-05-15 20:35:17 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20060515203517-l4lre1ku942mn26k
Tags: 4.1.1+X4.3.0-10
* Correction of critical security issue. Thanks to Martin Kogler
  <e9925248@student.tuwien.ac.at> that informed me about the issue,
  and provided the patch.
  This flaw was originally found by Steve Wiseman of intelliadmin.com.
* Applied patch from Javier Kohen <jkohen@users.sourceforge.net> that
  inform the user that only 8 first characters of the password will
  actually be used when typing more than 8 characters, closes:
  #355619.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * GLX Hardware Device Driver for Intel i810
 
3
 * Copyright (C) 1999 Keith Whitwell
 
4
 *
 
5
 * Permission is hereby granted, free of charge, to any person obtaining a
 
6
 * copy of this software and associated documentation files (the "Software"),
 
7
 * to deal in the Software without restriction, including without limitation
 
8
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 
9
 * and/or sell copies of the Software, and to permit persons to whom the
 
10
 * Software is furnished to do so, subject to the following conditions:
 
11
 *
 
12
 * The above copyright notice and this permission notice shall be included
 
13
 * in all copies or substantial portions of the Software.
 
14
 *
 
15
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 
16
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 
17
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 
18
 * KEITH WHITWELL, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM,
 
19
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
 
20
 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
 
21
 * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
22
 *
 
23
 * Adapted for use on the I830M:
 
24
 *   Jeff Hartmann <jhartmann@2d3d.com>
 
25
 */
 
26
/* $XFree86: xc/lib/GL/mesa/src/drv/i830/i830_vb.c,v 1.5 2002/12/10 01:26:54 dawes Exp $ */
 
27
 
 
28
#include "glheader.h"
 
29
#include "mtypes.h"
 
30
#include "mem.h"
 
31
#include "macros.h"
 
32
#include "colormac.h"
 
33
#include "mmath.h"
 
34
 
 
35
#include "swrast_setup/swrast_setup.h"
 
36
#include "tnl/t_context.h"
 
37
 
 
38
#include "i830_screen.h"
 
39
#include "i830_dri.h"
 
40
 
 
41
#include "i830_context.h"
 
42
#include "i830_vb.h"
 
43
#include "i830_ioctl.h"
 
44
#include "i830_tris.h"
 
45
#include "i830_state.h"
 
46
 
 
47
#define I830_TEX1_BIT       0x1
 
48
#define I830_TEX0_BIT       0x2
 
49
#define I830_RGBA_BIT       0x4
 
50
#define I830_SPEC_BIT       0x8
 
51
#define I830_FOG_BIT        0x10
 
52
#define I830_XYZW_BIT       0x20
 
53
#define I830_PTEX_BIT       0x40
 
54
#define I830_MAX_SETUP      0x80
 
55
 
 
56
static struct {
 
57
   void                (*emit)( GLcontext *, GLuint, GLuint, void *, GLuint );
 
58
   interp_func          interp;
 
59
   copy_pv_func         copy_pv;
 
60
   GLboolean           (*check_tex_sizes)( GLcontext *ctx );
 
61
   GLuint               vertex_size;
 
62
   GLuint               vertex_stride_shift;
 
63
   GLuint               vertex_format;
 
64
} setup_tab[I830_MAX_SETUP];
 
65
 
 
66
#define TINY_VERTEX_FORMAT      (STATE3D_VERTEX_FORMAT_CMD | \
 
67
                                 VRTX_TEX_COORD_COUNT(0) | \
 
68
                                 VRTX_HAS_DIFFUSE | \
 
69
                                 VRTX_HAS_XYZ)
 
70
 
 
71
#define NOTEX_VERTEX_FORMAT     (STATE3D_VERTEX_FORMAT_CMD | \
 
72
                                 VRTX_TEX_COORD_COUNT(0) | \
 
73
                                 VRTX_HAS_DIFFUSE | \
 
74
                                 VRTX_HAS_SPEC | \
 
75
                                 VRTX_HAS_XYZW)
 
76
 
 
77
#define TEX0_VERTEX_FORMAT      (STATE3D_VERTEX_FORMAT_CMD | \
 
78
                                 VRTX_TEX_COORD_COUNT(1) | \
 
79
                                 VRTX_HAS_DIFFUSE | \
 
80
                                 VRTX_HAS_SPEC | \
 
81
                                 VRTX_HAS_XYZW)
 
82
 
 
83
#define TEX1_VERTEX_FORMAT      (STATE3D_VERTEX_FORMAT_CMD | \
 
84
                                 VRTX_TEX_COORD_COUNT(2) | \
 
85
                                 VRTX_HAS_DIFFUSE | \
 
86
                                 VRTX_HAS_SPEC | \
 
87
                                 VRTX_HAS_XYZW)
 
88
 
 
89
 
 
90
/* I'm cheating here hardcore : if bit 31 is set I know to emit
 
91
 * a vf2 state == TEXCOORDFMT_3D.  We never mix 2d/3d texcoords,
 
92
 * so this solution works for now.
 
93
 */
 
94
 
 
95
#define PROJ_TEX1_VERTEX_FORMAT ((1<<31) | \
 
96
                                 STATE3D_VERTEX_FORMAT_CMD | \
 
97
                                 VRTX_TEX_COORD_COUNT(2) | \
 
98
                                 VRTX_HAS_DIFFUSE | \
 
99
                                 VRTX_HAS_SPEC | \
 
100
                                 VRTX_HAS_XYZW)
 
101
 
 
102
/* Might want to do these later */
 
103
#define TEX2_VERTEX_FORMAT      0
 
104
#define TEX3_VERTEX_FORMAT      0
 
105
#define PROJ_TEX3_VERTEX_FORMAT 0
 
106
 
 
107
#define DO_XYZW (IND & I830_XYZW_BIT)
 
108
#define DO_RGBA (IND & I830_RGBA_BIT)
 
109
#define DO_SPEC (IND & I830_SPEC_BIT)
 
110
#define DO_FOG  (IND & I830_FOG_BIT)
 
111
#define DO_TEX0 (IND & I830_TEX0_BIT)
 
112
#define DO_TEX1 (IND & I830_TEX1_BIT)
 
113
#define DO_TEX2 0
 
114
#define DO_TEX3 0
 
115
#define DO_PTEX (IND & I830_PTEX_BIT)
 
116
 
 
117
#define VERTEX i830Vertex
 
118
#define VERTEX_COLOR i830_color_t
 
119
#define GET_VIEWPORT_MAT() I830_CONTEXT(ctx)->ViewportMatrix.m
 
120
#define GET_TEXSOURCE(n)  n
 
121
#define GET_VERTEX_FORMAT() I830_CONTEXT(ctx)->vertex_format
 
122
#define GET_VERTEX_STORE() ((GLubyte *)I830_CONTEXT(ctx)->verts)
 
123
#define GET_VERTEX_STRIDE_SHIFT() I830_CONTEXT(ctx)->vertex_stride_shift
 
124
#define GET_UBYTE_COLOR_STORE() &I830_CONTEXT(ctx)->UbyteColor
 
125
#define GET_UBYTE_SPEC_COLOR_STORE() &I830_CONTEXT(ctx)->UbyteSecondaryColor
 
126
#define INVALIDATE_STORED_VERTICES()
 
127
 
 
128
#define HAVE_HW_VIEWPORT    0
 
129
#define HAVE_HW_DIVIDE      0
 
130
#define HAVE_RGBA_COLOR     0
 
131
#define HAVE_TINY_VERTICES  1
 
132
#define HAVE_NOTEX_VERTICES 1
 
133
#define HAVE_TEX0_VERTICES  1
 
134
#define HAVE_TEX1_VERTICES  1
 
135
#define HAVE_TEX2_VERTICES  0
 
136
#define HAVE_TEX3_VERTICES  0
 
137
#define HAVE_PTEX_VERTICES  1
 
138
 
 
139
#define UNVIEWPORT_VARS  GLfloat h = I830_CONTEXT(ctx)->driDrawable->h
 
140
#define UNVIEWPORT_X(x)  x - SUBPIXEL_X
 
141
#define UNVIEWPORT_Y(y)  - y + h + SUBPIXEL_Y
 
142
#define UNVIEWPORT_Z(z)  z * (float)I830_CONTEXT(ctx)->ClearDepth
 
143
 
 
144
#define PTEX_FALLBACK() FALLBACK(I830_CONTEXT(ctx), I830_FALLBACK_TEXTURE, 1)
 
145
 
 
146
#define IMPORT_FLOAT_COLORS i830_import_float_colors
 
147
#define IMPORT_FLOAT_SPEC_COLORS i830_import_float_spec_colors
 
148
 
 
149
#define INTERP_VERTEX setup_tab[I830_CONTEXT(ctx)->SetupIndex].interp
 
150
#define COPY_PV_VERTEX setup_tab[I830_CONTEXT(ctx)->SetupIndex].copy_pv
 
151
 
 
152
 
 
153
/***********************************************************************
 
154
 *         Generate  pv-copying and translation functions              *
 
155
 ***********************************************************************/
 
156
 
 
157
#define TAG(x) i830_##x
 
158
#include "tnl_dd/t_dd_vb.c"
 
159
 
 
160
/***********************************************************************
 
161
 *             Generate vertex emit and interp functions               *
 
162
 ***********************************************************************/
 
163
 
 
164
#define IND (I830_XYZW_BIT|I830_RGBA_BIT)
 
165
#define TAG(x) x##_wg
 
166
#include "tnl_dd/t_dd_vbtmp.h"
 
167
 
 
168
#define IND (I830_XYZW_BIT|I830_RGBA_BIT|I830_SPEC_BIT)
 
169
#define TAG(x) x##_wgs
 
170
#include "tnl_dd/t_dd_vbtmp.h"
 
171
 
 
172
#define IND (I830_XYZW_BIT|I830_RGBA_BIT|I830_TEX0_BIT)
 
173
#define TAG(x) x##_wgt0
 
174
#include "tnl_dd/t_dd_vbtmp.h"
 
175
 
 
176
#define IND (I830_XYZW_BIT|I830_RGBA_BIT|I830_TEX0_BIT|I830_TEX1_BIT)
 
177
#define TAG(x) x##_wgt0t1
 
178
#include "tnl_dd/t_dd_vbtmp.h"
 
179
 
 
180
#define IND (I830_XYZW_BIT|I830_RGBA_BIT|I830_TEX0_BIT|I830_PTEX_BIT)
 
181
#define TAG(x) x##_wgpt0
 
182
#include "tnl_dd/t_dd_vbtmp.h"
 
183
 
 
184
#define IND (I830_XYZW_BIT|I830_RGBA_BIT|I830_SPEC_BIT|I830_TEX0_BIT)
 
185
#define TAG(x) x##_wgst0
 
186
#include "tnl_dd/t_dd_vbtmp.h"
 
187
 
 
188
#define IND (I830_XYZW_BIT|I830_RGBA_BIT|I830_SPEC_BIT|I830_TEX0_BIT|\
 
189
             I830_TEX1_BIT)
 
190
#define TAG(x) x##_wgst0t1
 
191
#include "tnl_dd/t_dd_vbtmp.h"
 
192
 
 
193
#define IND (I830_XYZW_BIT|I830_RGBA_BIT|I830_SPEC_BIT|I830_TEX0_BIT|\
 
194
             I830_PTEX_BIT)
 
195
#define TAG(x) x##_wgspt0
 
196
#include "tnl_dd/t_dd_vbtmp.h"
 
197
 
 
198
#define IND (I830_XYZW_BIT|I830_RGBA_BIT|I830_FOG_BIT)
 
199
#define TAG(x) x##_wgf
 
200
#include "tnl_dd/t_dd_vbtmp.h"
 
201
 
 
202
#define IND (I830_XYZW_BIT|I830_RGBA_BIT|I830_FOG_BIT|I830_SPEC_BIT)
 
203
#define TAG(x) x##_wgfs
 
204
#include "tnl_dd/t_dd_vbtmp.h"
 
205
 
 
206
#define IND (I830_XYZW_BIT|I830_RGBA_BIT|I830_FOG_BIT|I830_TEX0_BIT)
 
207
#define TAG(x) x##_wgft0
 
208
#include "tnl_dd/t_dd_vbtmp.h"
 
209
 
 
210
#define IND (I830_XYZW_BIT|I830_RGBA_BIT|I830_FOG_BIT|I830_TEX0_BIT|\
 
211
             I830_TEX1_BIT)
 
212
#define TAG(x) x##_wgft0t1
 
213
#include "tnl_dd/t_dd_vbtmp.h"
 
214
 
 
215
#define IND (I830_XYZW_BIT|I830_RGBA_BIT|I830_FOG_BIT|I830_TEX0_BIT|\
 
216
             I830_PTEX_BIT)
 
217
#define TAG(x) x##_wgfpt0
 
218
#include "tnl_dd/t_dd_vbtmp.h"
 
219
 
 
220
#define IND (I830_XYZW_BIT|I830_RGBA_BIT|I830_FOG_BIT|I830_SPEC_BIT|\
 
221
             I830_TEX0_BIT)
 
222
#define TAG(x) x##_wgfst0
 
223
#include "tnl_dd/t_dd_vbtmp.h"
 
224
 
 
225
#define IND (I830_XYZW_BIT|I830_RGBA_BIT|I830_FOG_BIT|I830_SPEC_BIT|\
 
226
             I830_TEX0_BIT|I830_TEX1_BIT)
 
227
#define TAG(x) x##_wgfst0t1
 
228
#include "tnl_dd/t_dd_vbtmp.h"
 
229
 
 
230
#define IND (I830_XYZW_BIT|I830_RGBA_BIT|I830_FOG_BIT|I830_SPEC_BIT|\
 
231
             I830_TEX0_BIT|I830_PTEX_BIT)
 
232
#define TAG(x) x##_wgfspt0
 
233
#include "tnl_dd/t_dd_vbtmp.h"
 
234
 
 
235
#define IND (I830_TEX0_BIT)
 
236
#define TAG(x) x##_t0
 
237
#include "tnl_dd/t_dd_vbtmp.h"
 
238
 
 
239
#define IND (I830_TEX0_BIT|I830_TEX1_BIT)
 
240
#define TAG(x) x##_t0t1
 
241
#include "tnl_dd/t_dd_vbtmp.h"
 
242
 
 
243
#define IND (I830_FOG_BIT)
 
244
#define TAG(x) x##_f
 
245
#include "tnl_dd/t_dd_vbtmp.h"
 
246
 
 
247
#define IND (I830_FOG_BIT|I830_TEX0_BIT)
 
248
#define TAG(x) x##_ft0
 
249
#include "tnl_dd/t_dd_vbtmp.h"
 
250
 
 
251
#define IND (I830_FOG_BIT|I830_TEX0_BIT|I830_TEX1_BIT)
 
252
#define TAG(x) x##_ft0t1
 
253
#include "tnl_dd/t_dd_vbtmp.h"
 
254
 
 
255
#define IND (I830_RGBA_BIT)
 
256
#define TAG(x) x##_g
 
257
#include "tnl_dd/t_dd_vbtmp.h"
 
258
 
 
259
#define IND (I830_RGBA_BIT|I830_SPEC_BIT)
 
260
#define TAG(x) x##_gs
 
261
#include "tnl_dd/t_dd_vbtmp.h"
 
262
 
 
263
#define IND (I830_RGBA_BIT|I830_TEX0_BIT)
 
264
#define TAG(x) x##_gt0
 
265
#include "tnl_dd/t_dd_vbtmp.h"
 
266
 
 
267
#define IND (I830_RGBA_BIT|I830_TEX0_BIT|I830_TEX1_BIT)
 
268
#define TAG(x) x##_gt0t1
 
269
#include "tnl_dd/t_dd_vbtmp.h"
 
270
 
 
271
#define IND (I830_RGBA_BIT|I830_SPEC_BIT|I830_TEX0_BIT)
 
272
#define TAG(x) x##_gst0
 
273
#include "tnl_dd/t_dd_vbtmp.h"
 
274
 
 
275
#define IND (I830_RGBA_BIT|I830_SPEC_BIT|I830_TEX0_BIT|I830_TEX1_BIT)
 
276
#define TAG(x) x##_gst0t1
 
277
#include "tnl_dd/t_dd_vbtmp.h"
 
278
 
 
279
#define IND (I830_RGBA_BIT|I830_FOG_BIT)
 
280
#define TAG(x) x##_gf
 
281
#include "tnl_dd/t_dd_vbtmp.h"
 
282
 
 
283
#define IND (I830_RGBA_BIT|I830_FOG_BIT|I830_SPEC_BIT)
 
284
#define TAG(x) x##_gfs
 
285
#include "tnl_dd/t_dd_vbtmp.h"
 
286
 
 
287
#define IND (I830_RGBA_BIT|I830_FOG_BIT|I830_TEX0_BIT)
 
288
#define TAG(x) x##_gft0
 
289
#include "tnl_dd/t_dd_vbtmp.h"
 
290
 
 
291
#define IND (I830_RGBA_BIT|I830_FOG_BIT|I830_TEX0_BIT|I830_TEX1_BIT)
 
292
#define TAG(x) x##_gft0t1
 
293
#include "tnl_dd/t_dd_vbtmp.h"
 
294
 
 
295
#define IND (I830_RGBA_BIT|I830_FOG_BIT|I830_SPEC_BIT|I830_TEX0_BIT)
 
296
#define TAG(x) x##_gfst0
 
297
#include "tnl_dd/t_dd_vbtmp.h"
 
298
 
 
299
#define IND (I830_RGBA_BIT|I830_FOG_BIT|I830_SPEC_BIT|I830_TEX0_BIT|\
 
300
             I830_TEX1_BIT)
 
301
#define TAG(x) x##_gfst0t1
 
302
#include "tnl_dd/t_dd_vbtmp.h"
 
303
 
 
304
/* Add functions for proj texturing for t0 and t1 */
 
305
#define IND (I830_XYZW_BIT|I830_RGBA_BIT|I830_TEX0_BIT|I830_TEX1_BIT|\
 
306
             I830_PTEX_BIT)
 
307
#define TAG(x) x##_wgpt0t1
 
308
#include "tnl_dd/t_dd_vbtmp.h"
 
309
 
 
310
#define IND (I830_XYZW_BIT|I830_RGBA_BIT|I830_SPEC_BIT|I830_TEX0_BIT|\
 
311
             I830_TEX1_BIT|I830_PTEX_BIT)
 
312
#define TAG(x) x##_wgspt0t1
 
313
#include "tnl_dd/t_dd_vbtmp.h"
 
314
 
 
315
#define IND (I830_XYZW_BIT|I830_RGBA_BIT|I830_FOG_BIT|I830_TEX0_BIT|\
 
316
             I830_TEX1_BIT|I830_PTEX_BIT)
 
317
#define TAG(x) x##_wgfpt0t1
 
318
#include "tnl_dd/t_dd_vbtmp.h"
 
319
 
 
320
#define IND (I830_XYZW_BIT|I830_RGBA_BIT|I830_FOG_BIT|I830_SPEC_BIT|\
 
321
             I830_TEX1_BIT|I830_TEX0_BIT|I830_PTEX_BIT)
 
322
#define TAG(x) x##_wgfspt0t1
 
323
#include "tnl_dd/t_dd_vbtmp.h"
 
324
 
 
325
 
 
326
static void init_setup_tab( void )
 
327
{
 
328
   init_wg();
 
329
   init_wgs();
 
330
   init_wgt0();
 
331
   init_wgt0t1();
 
332
   init_wgpt0();
 
333
   init_wgst0();
 
334
   init_wgst0t1();
 
335
   init_wgspt0();
 
336
   init_wgf();
 
337
   init_wgfs();
 
338
   init_wgft0();
 
339
   init_wgft0t1();
 
340
   init_wgfpt0();
 
341
   init_wgfst0();
 
342
   init_wgfst0t1();
 
343
   init_wgfspt0();
 
344
   init_t0();
 
345
   init_t0t1();
 
346
   init_f();
 
347
   init_ft0();
 
348
   init_ft0t1();
 
349
   init_g();
 
350
   init_gs();
 
351
   init_gt0();
 
352
   init_gt0t1();
 
353
   init_gst0();
 
354
   init_gst0t1();
 
355
   init_gf();
 
356
   init_gfs();
 
357
   init_gft0();
 
358
   init_gft0t1();
 
359
   init_gfst0();
 
360
   init_gfst0t1();
 
361
   /* Add proj texturing on t1 */
 
362
   init_wgpt0t1();
 
363
   init_wgspt0t1();
 
364
   init_wgfpt0t1();
 
365
   init_wgfspt0t1();
 
366
}
 
367
 
 
368
 
 
369
 
 
370
void i830PrintSetupFlags(char *msg, GLuint flags )
 
371
{
 
372
   fprintf(stderr, "%s(%x): %s%s%s%s%s%s%s\n",
 
373
           msg,
 
374
           (int)flags,
 
375
           (flags & I830_XYZW_BIT)      ? " xyzw," : "",
 
376
           (flags & I830_RGBA_BIT)     ? " rgba," : "",
 
377
           (flags & I830_SPEC_BIT)     ? " spec," : "",
 
378
           (flags & I830_FOG_BIT)      ? " fog," : "",
 
379
           (flags & I830_TEX0_BIT)     ? " tex-0," : "",
 
380
           (flags & I830_TEX1_BIT)     ? " tex-1," : "",
 
381
           (flags & I830_PTEX_BIT)     ? " ptex," : "");
 
382
}
 
383
 
 
384
void i830CheckTexSizes( GLcontext *ctx )
 
385
{
 
386
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 
387
   i830ContextPtr imesa = I830_CONTEXT( ctx );
 
388
 
 
389
   if (!setup_tab[imesa->SetupIndex].check_tex_sizes(ctx)) {
 
390
      int ind = imesa->SetupIndex |= I830_PTEX_BIT;
 
391
         
 
392
      if(setup_tab[ind].vertex_format != imesa->vertex_format) {
 
393
         int vfmt = setup_tab[ind].vertex_format;
 
394
 
 
395
         I830_STATECHANGE(imesa, I830_UPLOAD_CTX);
 
396
         imesa->Setup[I830_CTXREG_VF] = ~(1<<31) & vfmt;
 
397
 
 
398
         if (vfmt & (1<<31)) {
 
399
            /* Proj texturing */
 
400
            imesa->Setup[I830_CTXREG_VF2] = (STATE3D_VERTEX_FORMAT_2_CMD |
 
401
                                          VRTX_TEX_SET_0_FMT(TEXCOORDFMT_3D) |
 
402
                                          VRTX_TEX_SET_1_FMT(TEXCOORDFMT_3D) | 
 
403
                                          VRTX_TEX_SET_2_FMT(TEXCOORDFMT_3D) |
 
404
                                          VRTX_TEX_SET_3_FMT(TEXCOORDFMT_3D));
 
405
            i830UpdateTexUnitProj( ctx, 0, GL_TRUE );
 
406
            i830UpdateTexUnitProj( ctx, 1, GL_TRUE );
 
407
            
 
408
         } else {
 
409
            /* Normal texturing */
 
410
            imesa->Setup[I830_CTXREG_VF2] = (STATE3D_VERTEX_FORMAT_2_CMD |
 
411
                                          VRTX_TEX_SET_0_FMT(TEXCOORDFMT_2D) |
 
412
                                          VRTX_TEX_SET_1_FMT(TEXCOORDFMT_2D) | 
 
413
                                          VRTX_TEX_SET_2_FMT(TEXCOORDFMT_2D) |
 
414
                                          VRTX_TEX_SET_3_FMT(TEXCOORDFMT_2D));
 
415
            i830UpdateTexUnitProj( ctx, 0, GL_FALSE );
 
416
            i830UpdateTexUnitProj( ctx, 1, GL_FALSE );
 
417
         }
 
418
         imesa->vertex_format = vfmt;
 
419
         imesa->vertex_size = setup_tab[ind].vertex_size;
 
420
         imesa->vertex_stride_shift = setup_tab[ind].vertex_stride_shift;
 
421
      }
 
422
 
 
423
      if (!imesa->Fallback &&
 
424
          !(ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED))) {
 
425
         tnl->Driver.Render.Interp = setup_tab[imesa->SetupIndex].interp;
 
426
         tnl->Driver.Render.CopyPV = setup_tab[imesa->SetupIndex].copy_pv;
 
427
      }
 
428
   }
 
429
}
 
430
 
 
431
void i830BuildVertices( GLcontext *ctx,
 
432
                        GLuint start,
 
433
                        GLuint count,
 
434
                        GLuint newinputs )
 
435
{
 
436
   i830ContextPtr imesa = I830_CONTEXT( ctx );
 
437
   GLubyte *v = ((GLubyte *)
 
438
                 imesa->verts + (start<<imesa->vertex_stride_shift));
 
439
   GLuint stride = 1<<imesa->vertex_stride_shift;
 
440
 
 
441
   if (0) fprintf(stderr, "%s\n", __FUNCTION__);
 
442
 
 
443
   newinputs |= imesa->SetupNewInputs;
 
444
   imesa->SetupNewInputs = 0;
 
445
 
 
446
   if (!newinputs)
 
447
      return;
 
448
 
 
449
   if (newinputs & VERT_CLIP) {
 
450
      setup_tab[imesa->SetupIndex].emit( ctx, start, count, v, stride );
 
451
   } else {
 
452
      GLuint ind = 0;
 
453
 
 
454
      if (newinputs & VERT_RGBA)
 
455
         ind |= I830_RGBA_BIT;
 
456
 
 
457
      if (newinputs & VERT_SPEC_RGB)
 
458
         ind |= I830_SPEC_BIT;
 
459
 
 
460
      if (newinputs & VERT_TEX0)
 
461
         ind |= I830_TEX0_BIT;
 
462
 
 
463
      if (newinputs & VERT_TEX1)
 
464
         ind |= I830_TEX1_BIT;
 
465
 
 
466
      if (newinputs & VERT_FOG_COORD)
 
467
         ind |= I830_FOG_BIT;
 
468
 
 
469
#if 0
 
470
      if (imesa->SetupIndex & I830_PTEX_BIT)
 
471
         ind = ~0;
 
472
#endif
 
473
 
 
474
      ind &= imesa->SetupIndex;
 
475
 
 
476
      if (ind) {
 
477
         setup_tab[ind].emit( ctx, start, count, v, stride );
 
478
      }
 
479
   }
 
480
}
 
481
 
 
482
void i830ChooseVertexState( GLcontext *ctx )
 
483
{
 
484
   TNLcontext *tnl = TNL_CONTEXT(ctx);
 
485
   i830ContextPtr imesa = I830_CONTEXT( ctx );
 
486
   GLuint ind = I830_XYZW_BIT|I830_RGBA_BIT;
 
487
 
 
488
   if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR)
 
489
      ind |= I830_SPEC_BIT;
 
490
 
 
491
   if (ctx->Fog.Enabled)
 
492
      ind |= I830_FOG_BIT;
 
493
 
 
494
   /* unit 1 */
 
495
   if (ctx->Texture._ReallyEnabled & TEXTURE1_ANY)
 
496
      ind |= I830_TEX1_BIT|I830_TEX0_BIT;
 
497
   /* unit 0 */
 
498
   else if (ctx->Texture._ReallyEnabled & TEXTURE0_ANY)
 
499
      ind |= I830_TEX0_BIT;
 
500
 
 
501
   imesa->SetupIndex = ind;
 
502
 
 
503
   if (I830_DEBUG & (DEBUG_VERTS|DEBUG_STATE))
 
504
      i830PrintSetupFlags( __FUNCTION__, ind );
 
505
 
 
506
   if (ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED)) {
 
507
      tnl->Driver.Render.Interp = i830_interp_extras;
 
508
      tnl->Driver.Render.CopyPV = i830_copy_pv_extras;
 
509
   } else {
 
510
      tnl->Driver.Render.Interp = setup_tab[ind].interp;
 
511
      tnl->Driver.Render.CopyPV = setup_tab[ind].copy_pv;
 
512
   }
 
513
 
 
514
   if (setup_tab[ind].vertex_format != imesa->vertex_format) {
 
515
      int vfmt = setup_tab[ind].vertex_format;
 
516
 
 
517
      I830_STATECHANGE(imesa, I830_UPLOAD_CTX);
 
518
      imesa->Setup[I830_CTXREG_VF] = ~(1<<31) & vfmt;
 
519
 
 
520
      if (vfmt & (1<<31)) {
 
521
         /* Proj texturing */
 
522
         imesa->Setup[I830_CTXREG_VF2] = (STATE3D_VERTEX_FORMAT_2_CMD |
 
523
                                          VRTX_TEX_SET_0_FMT(TEXCOORDFMT_3D) |
 
524
                                          VRTX_TEX_SET_1_FMT(TEXCOORDFMT_3D) | 
 
525
                                          VRTX_TEX_SET_2_FMT(TEXCOORDFMT_3D) |
 
526
                                          VRTX_TEX_SET_3_FMT(TEXCOORDFMT_3D));
 
527
         i830UpdateTexUnitProj( ctx, 0, GL_TRUE );
 
528
         i830UpdateTexUnitProj( ctx, 1, GL_TRUE );
 
529
      } else {
 
530
         /* Normal texturing */
 
531
         imesa->Setup[I830_CTXREG_VF2] = (STATE3D_VERTEX_FORMAT_2_CMD |
 
532
                                          VRTX_TEX_SET_0_FMT(TEXCOORDFMT_2D) |
 
533
                                          VRTX_TEX_SET_1_FMT(TEXCOORDFMT_2D) | 
 
534
                                          VRTX_TEX_SET_2_FMT(TEXCOORDFMT_2D) |
 
535
                                          VRTX_TEX_SET_3_FMT(TEXCOORDFMT_2D));
 
536
         i830UpdateTexUnitProj( ctx, 0, GL_FALSE );
 
537
         i830UpdateTexUnitProj( ctx, 1, GL_FALSE );
 
538
      }
 
539
      imesa->vertex_format = vfmt;
 
540
      imesa->vertex_size = setup_tab[ind].vertex_size;
 
541
      imesa->vertex_stride_shift = setup_tab[ind].vertex_stride_shift;
 
542
   }
 
543
}
 
544
 
 
545
 
 
546
 
 
547
void i830_emit_contiguous_verts( GLcontext *ctx,
 
548
                                 GLuint start,
 
549
                                 GLuint count )
 
550
{
 
551
   i830ContextPtr imesa = I830_CONTEXT(ctx);
 
552
   GLuint vertex_size = imesa->vertex_size * 4;
 
553
   GLuint *dest = i830AllocDmaLow( imesa, (count-start) * vertex_size);
 
554
   setup_tab[imesa->SetupIndex].emit( ctx, start, count, dest, vertex_size );
 
555
}
 
556
 
 
557
 
 
558
 
 
559
void i830InitVB( GLcontext *ctx )
 
560
{
 
561
   i830ContextPtr imesa = I830_CONTEXT(ctx);
 
562
   GLuint size = TNL_CONTEXT(ctx)->vb.Size;
 
563
   
 
564
   imesa->verts = (char *)ALIGN_MALLOC(size * 4 * 16, 32);
 
565
 
 
566
   {
 
567
      static int firsttime = 1;
 
568
      if (firsttime) {
 
569
         init_setup_tab();
 
570
         firsttime = 0;
 
571
      }
 
572
   }
 
573
}
 
574
 
 
575
 
 
576
void i830FreeVB( GLcontext *ctx )
 
577
{
 
578
   i830ContextPtr imesa = I830_CONTEXT(ctx);
 
579
   if (imesa->verts) {
 
580
      ALIGN_FREE(imesa->verts);
 
581
      imesa->verts = 0;
 
582
   }
 
583
 
 
584
   if (imesa->UbyteSecondaryColor.Ptr) {
 
585
      ALIGN_FREE(imesa->UbyteSecondaryColor.Ptr);
 
586
      imesa->UbyteSecondaryColor.Ptr = 0;
 
587
   }
 
588
 
 
589
   if (imesa->UbyteColor.Ptr) {
 
590
      ALIGN_FREE(imesa->UbyteColor.Ptr);
 
591
      imesa->UbyteColor.Ptr = 0;
 
592
   }
 
593
}