Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1901 serge 1
 
2
 * Mesa 3-D graphics library
3
 * Version:  3.5
4
 *
5
 * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
6
 *
7
 * Permission is hereby granted, free of charge, to any person obtaining a
8
 * copy of this software and associated documentation files (the "Software"),
9
 * to deal in the Software without restriction, including without limitation
10
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11
 * and/or sell copies of the Software, and to permit persons to whom the
12
 * Software is furnished to do so, subject to the following conditions:
13
 *
14
 * The above copyright notice and this permission notice shall be included
15
 * in all copies or substantial portions of the Software.
16
 *
17
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
 *
24
 * Authors:
25
 *    Keith Whitwell 
26
 *    Gareth Hughes 
27
 */
28
29
 
30
 *
31
 * Probably instantiate once for each vertex format used:
32
 *   - TINY_VERTICES
33
 *   - TEX0_VERTICES
34
 *   - TEX1_VERTICES
35
 *   - PTEX_VERTICES
36
 *
37
 * Have to handle TEX->PTEX transition somehow.
38
 */
39
40
 
41
42
 
43
 
44
 
45
 * GL_POINTS
46
 */
47
48
 
49
{
50
   if ( !v0->mask ) {
51
      LOCAL_VARS;
52
      DRAW_POINT( v0 );
53
   }
54
}
55
56
 
57
 
58
 * GL_LINES
59
 */
60
61
 
62
63
 
64
{
65
   LOCAL_VARS;
66
   FLUSH_VERTEX = TAG(flush_line_1);
67
   ACTIVE_VERTEX = IMM_VERTICES( 1 );
68
}
69
70
 
71
{
72
   LOCAL_VARS;
73
   TNL_VERTEX *v1 = v0 - 1;
74
   ACTIVE_VERTEX = IMM_VERTICES( 0 );
75
   FLUSH_VERTEX = TAG(flush_line_0);
76
   if (FALLBACK_OR_CLIPPING)
77
      CLIP_OR_DRAW_LINE( ctx, v1, v0 );
78
   else
79
      DRAW_LINE( ctx, v1, v0 );
80
}
81
82
 
83
 
84
 * GL_LINE_LOOP
85
 */
86
87
 
88
static void TAG(flush_line_loop_1)( struct gl_context *ctx, TNL_VERTEX *v0 );
89
90
 
91
{
92
   LOCAL_VARS;
93
94
 
95
   FLUSH_VERTEX = TAG(flush_line_loop_1);
96
}
97
98
 
99
   if (!HAVE_LINE_STRIP || FALLBACK_OR_CLIPPING) {	\
100
      CLIP_OR_DRAW_LINE( ctx, a, b );			\
101
   } else if (EXTEND_PRIM( 1 )) {			\
102
      EMIT_VERTEX( b );					\
103
   } else {						\
104
      BEGIN_PRIM( GL_LINE_STRIP, 2 ); 			\
105
      EMIT_VERTEX( a );					\
106
      EMIT_VERTEX( b );      				\
107
   }
108
109
 
110
{
111
   LOCAL_VARS;
112
   TNL_VERTEX *v1 = v0 - 1;
113
   ACTIVE_VERTEX = v1;
114
   FLUSH_VERTEX = TAG(flush_line_loop_2);
115
   DRAW_LINELOOP_LINE( v1, v0 );
116
}
117
118
 
119
{
120
   LOCAL_VARS;
121
   TNL_VERTEX *v1 = v0 + 1;
122
   ACTIVE_VERTEX = v1;
123
   FLUSH_VERTEX = TAG(flush_line_loop_1);
124
   DRAW_LINELOOP_LINE( v1, v0 );
125
}
126
127
 
128
{
129
   LOCAL_VARS;
130
131
 
132
      TNL_VERTEX *v1 = ACTIVE_VERTEX;
133
      TNL_VERTEX *v0 = IMM_VERTICES( 0 );
134
      DRAW_LINELOOP_LINE( v1, v0 );
135
   }
136
}
137
138
 
139
 
140
 
141
 * GL_LINE_STRIP
142
 */
143
144
 
145
static void TAG(flush_line_strip_1)( struct gl_context *ctx, TNL_VERTEX *v0 );
146
147
 
148
{
149
   LOCAL_VARS;
150
151
 
152
   FLUSH_VERTEX = TAG(flush_line_strip_0b);
153
}
154
155
 
156
 
157
{
158
   LOCAL_VARS;
159
   TNL_VERTEX *v1 = v0 - 1;
160
161
 
162
   FLUSH_VERTEX = TAG(flush_line_strip_2);
163
164
 
165
      CLIP_OR_DRAW_LINE( ctx, v1, v0 );
166
   else if (EXTEND_PRIM( 1 )) {
167
      EMIT_VERTEX( v0 );
168
   } else {
169
      BEGIN_PRIM( GL_LINE_STRIP, 2 );
170
      EMIT_VERTEX( v1 );
171
      EMIT_VERTEX( v0 );
172
   }
173
}
174
175
 
176
{
177
   LOCAL_VARS;
178
   TNL_VERTEX *v1 = v0 + 1;
179
180
 
181
   FLUSH_VERTEX = TAG(flush_line_strip_1);
182
183
 
184
      CLIP_OR_DRAW_LINE( ctx, v1, v0 );
185
   else if (EXTEND_PRIM( 1 )) {
186
      EMIT_VERTEX( v0 );
187
   } else {
188
      BEGIN_PRIM( GL_LINE_STRIP, 2 );
189
      EMIT_VERTEX( v1 );
190
      EMIT_VERTEX( v0 );
191
   }
192
}
193
194
 
195
 
196
 
197
 * GL_TRIANGLES
198
 */
199
200
 
201
static void TAG(flush_triangle_1)( struct gl_context *ctx, TNL_VERTEX *v0 );
202
203
 
204
{
205
   LOCAL_VARS;
206
207
 
208
209
 
210
   FLUSH_VERTEX = TAG(flush_triangle_1);
211
   BEGIN_PRIM( GL_TRIANGLES, 0 );
212
}
213
214
 
215
{
216
   LOCAL_VARS;
217
218
 
219
220
 
221
   FLUSH_VERTEX = TAG(flush_triangle_2);
222
}
223
224
 
225
{
226
   LOCAL_VARS;
227
   TNL_VERTEX *v2 = v0 - 2;
228
   TNL_VERTEX *v1 = v0 - 1;
229
230
 
231
232
 
233
   FLUSH_VERTEX = TAG(flush_triangle_0);
234
235
 
236
    * happens normally in this case.
237
    */
238
   if (FALLBACK_OR_CLIPPING)
239
      CLIP_OR_DRAW_TRI( ctx, v2, v1, v0 );
240
   else
241
      DRAW_TRI( ctx, v2, v1, v0 );
242
}
243
244
 
245
 
246
 
247
 
248
 * GL_TRIANGLE_STRIP
249
 */
250
251
 
252
static void TAG(flush_tri_strip_2)( struct gl_context *ctx, TNL_VERTEX *v0 );
253
static void TAG(flush_tri_strip_1)( struct gl_context *ctx, TNL_VERTEX *v0 );
254
255
 
256
{
257
   LOCAL_VARS;
258
   ACTIVE_VERTEX = IMM_VERTICES( 1 );
259
   FLUSH_VERTEX = TAG(flush_tri_strip_1);
260
}
261
262
 
263
{
264
   LOCAL_VARS;
265
   ACTIVE_VERTEX = IMM_VERTICES( 2 );
266
   FLUSH_VERTEX = TAG(flush_tri_strip_2);
267
}
268
269
 
270
   if (!HAVE_TRI_STRIP || FALLBACK_OR_CLIPPING) {	\
271
      TNL_VERTEX *v2 = IMM_VERTICES( vert0 );			\
272
      TNL_VERTEX *v1 = IMM_VERTICES( vert1 );			\
273
      TAG(draw_tri)( ctx, v2, v1, v0 );				\
274
   } else if (EXTEND_PRIM( 1 )) {				\
275
      EMIT_VERTEX( v0 );					\
276
   } else {							\
277
      TNL_VERTEX *v2 = IMM_VERTICES( vert0 );			\
278
      TNL_VERTEX *v1 = IMM_VERTICES( vert1 );			\
279
      BEGIN_PRIM( GL_TRIANGLE_STRIP, 3 ); 			\
280
      EMIT_VERTEX( v2 );					\
281
      EMIT_VERTEX( v1 );      					\
282
      EMIT_VERTEX( v0 );      					\
283
   }
284
285
 
286
{
287
   LOCAL_VARS;
288
   FLUSH_VERTEX = TAG(flush_tri_strip_3);
289
   ACTIVE_VERTEX = IMM_VERTICES( 3 );
290
   DO_TRISTRIP_TRI( 0, 1 );
291
}
292
293
 
294
{
295
   LOCAL_VARS;
296
   FLUSH_VERTEX = TAG(flush_tri_strip_4);
297
   ACTIVE_VERTEX = IMM_VERTICES( 0 );
298
   DO_TRISTRIP_TRI( 1, 2 );
299
}
300
301
 
302
{
303
   LOCAL_VARS;
304
   FLUSH_VERTEX = TAG(flush_tri_strip_5);
305
   ACTIVE_VERTEX = IMM_VERTICES( 1 );
306
   DO_TRISTRIP_TRI( 2, 3 );
307
}
308
309
 
310
{
311
   LOCAL_VARS;
312
   FLUSH_VERTEX = TAG(flush_tri_strip_2);
313
   ACTIVE_VERTEX = IMM_VERTICES( 2 );
314
   DO_TRISTRIP_TRI( 0, 3 );
315
}
316
317
 
318
 
319
 
320
 * GL_TRIANGLE_FAN
321
 */
322
323
 
324
static void TAG(flush_tri_fan_1)( struct gl_context *ctx, TNL_VERTEX *v0 );
325
326
 
327
{
328
   LOCAL_VARS;
329
330
 
331
   FLUSH_VERTEX = TAG(flush_tri_fan_1);
332
}
333
334
 
335
{
336
   LOCAL_VARS;
337
338
 
339
   FLUSH_VERTEX = TAG(flush_tri_fan_2);
340
}
341
342
 
343
   if (!HAVE_TRI_FAN || FALLBACK_OR_CLIPPING) {	\
344
      TNL_VERTEX *v2 = IMM_VERTICES( vert0 );			\
345
      TNL_VERTEX *v1 = IMM_VERTICES( vert1 );			\
346
      TAG(draw_tri)( ctx, v2, v1, v0 );				\
347
   } else if (EXTEND_PRIM( 1 )) {				\
348
      EMIT_VERTEX( v0 );					\
349
   } else {							\
350
      TNL_VERTEX *v2 = IMM_VERTICES( vert0 );			\
351
      TNL_VERTEX *v1 = IMM_VERTICES( vert1 );			\
352
      BEGIN_PRIM( GL_TRIANGLE_FAN, 3 ); 			\
353
      EMIT_VERTEX( v2 );					\
354
      EMIT_VERTEX( v1 );      					\
355
      EMIT_VERTEX( v0 );      					\
356
   }
357
358
 
359
{
360
   LOCAL_VARS;
361
   ACTIVE_VERTEX = IMM_VERTICES( 1 );
362
   FLUSH_VERTEX = TAG(flush_tri_fan_3 );
363
   DO_TRIFAN_TRI( 0, 1 );
364
}
365
366
 
367
{
368
   LOCAL_VARS;
369
   ACTIVE_VERTEX = IMM_VERTICES( 2 );
370
   FLUSH_VERTEX = TAG(flush_tri_fan_2 );
371
   DO_TRIFAN_TRI( 0, 2 );
372
}
373
374
 
375
 
376
 
377
 * GL_QUADS
378
 */
379
380
 
381
static void TAG(flush_quad_2)( struct gl_context *ctx, TNL_VERTEX *v0 );
382
static void TAG(flush_quad_1)( struct gl_context *ctx, TNL_VERTEX *v0 );
383
384
 
385
{
386
   LOCAL_VARS;
387
   IMM_VERTEX( v0 ) = v0 + 1;
388
   FLUSH_VERTEX = TAG(flush_quad_1);
389
}
390
391
 
392
{
393
   LOCAL_VARS;
394
   IMM_VERTEX( v0 ) = v0 + 1;
395
   FLUSH_VERTEX = TAG(flush_quad_2);
396
}
397
398
 
399
{
400
   LOCAL_VARS;
401
   IMM_VERTEX( v0 ) = v0 + 1;
402
   FLUSH_VERTEX = TAG(flush_quad_3);
403
}
404
405
 
406
{
407
   LOCAL_VARS;
408
   TNL_VERTEX *v3 = v0 - 3;
409
   TNL_VERTEX *v2 = v0 - 2;
410
   TNL_VERTEX *v1 = v0 - 1;
411
412
 
413
   FLUSH_VERTEX = TAG(flush_quad_0);
414
415
 
416
      CLIP_OR_DRAW_TRI( ctx, v3, v2, v0 );
417
      CLIP_OR_DRAW_TRI( ctx, v2, v1, v0 );
418
   } else {
419
      EXTEND_PRIM_NF( GL_QUADS, 4 );
420
      EMIT_VERTEX( v3 );
421
      EMIT_VERTEX( v2 );
422
      EMIT_VERTEX( v1 );
423
      EMIT_VERTEX( v0 );
424
   }
425
}
426
427
 
428
 
429
 
430
 * GL_QUAD_STRIP
431
 */
432
433
 
434
static void TAG(flush_quad_strip_2)( struct gl_context *ctx, TNL_VERTEX *v0 );
435
static void TAG(flush_quad_strip_1)( struct gl_context *ctx, TNL_VERTEX *v0 );
436
437
 
438
{
439
   LOCAL_VARS;
440
441
 
442
   IMM_VERTEX( v0 ) = v0 + 1;
443
   FLUSH_VERTEX = TAG(flush_quad_strip_1);
444
}
445
446
 
447
{
448
   LOCAL_VARS;
449
450
 
451
   IMM_VERTEX( v0 ) = v0 + 1;
452
   FLUSH_VERTEX = TAG(flush_quad_strip_2);
453
}
454
455
 
456
{
457
   LOCAL_VARS;
458
459
 
460
   IMM_VERTEX( v0 ) = v0 + 1;
461
   FLUSH_VERTEX = TAG(flush_quad_strip_3);
462
}
463
464
 
465
{
466
   LOCAL_VARS;
467
   TNL_VERTEX *v3 = IMM_VERTEX( v3 );
468
   TNL_VERTEX *v2 = IMM_VERTEX( v2 );
469
   TNL_VERTEX *v1 = IMM_VERTEX( v1 );
470
471
 
472
   IMM_VERTEX( v2 ) = v0;
473
   IMM_VERTEX( v3 ) = v1;
474
   FLUSH_VERTEX = TAG(flush_quad_strip_2);
475
476
 
477
      CLIP_OR_DRAW_TRI( ctx, v3, v2, v0 );
478
      CLIP_OR_DRAW_TRI( ctx, v2, v1, v0 );
479
   } else {
480
      DRAW_TRI( ctx, v3, v2, v0 );
481
      DRAW_TRI( ctx, v2, v1, v0 );
482
   }
483
}
484
485
 
486
 
487
 
488
 * GL_POLYGON
489
 */
490
491
 
492
static void TAG(flush_poly_1)( struct gl_context *ctx, TNL_VERTEX *v0 );
493
494
 
495
{
496
   LOCAL_VARS;
497
   ACTIVE_VERTEX = IMM_VERTICES( 1 );
498
   FLUSH_VERTEX = TAG(flush_poly_1);
499
}
500
501
 
502
{
503
   LOCAL_VARS;
504
   ACTIVE_VERTEX = IMM_VERTICES( 2 );
505
   FLUSH_VERTEX = TAG(flush_poly_2);
506
}
507
508
 
509
   if (!HAVE_POLYGONS || FALLBACK_OR_CLIPPING) {	\
510
      TNL_VERTEX *v2 = IMM_VERTICES( vert0 );			\
511
      TNL_VERTEX *v1 = IMM_VERTICES( vert1 );			\
512
      TAG(draw_tri)( ctx, v1, v0, v2 );				\
513
   } else if (EXTEND_PRIM( 1 )) {				\
514
      EMIT_VERTEX( v0 );					\
515
   } else {							\
516
      TNL_VERTEX *v2 = IMM_VERTICES( vert0 );			\
517
      TNL_VERTEX *v1 = IMM_VERTICES( vert1 );			\
518
      BEGIN_PRIM( GL_POLYGON, 3 );				\
519
      EMIT_VERTEX( v2 );					\
520
      EMIT_VERTEX( v1 );					\
521
      EMIT_VERTEX( v0 );					\
522
   }
523
524
 
525
{
526
   LOCAL_VARS;
527
   ACTIVE_VERTEX = IMM_VERTICES( 1 );
528
   FLUSH_VERTEX = TAG(flush_poly_3);
529
   DO_POLY_TRI( 0, 1 );
530
}
531
532
 
533
{
534
   LOCAL_VARS;
535
   ACTIVE_VERTEX = IMM_VERTICES( 2 );
536
   FLUSH_VERTEX = TAG(flush_poly_2);
537
   DO_POLY_TRI( 0, 2 );
538
}
539
540
 
541
 
542
{
543
   TAG(flush_point),
544
   TAG(flush_line_0),
545
   TAG(flush_line_loop_0),
546
   TAG(flush_line_strip_0),
547
   TAG(flush_triangle_0),
548
   TAG(flush_tri_strip_0),
549
   TAG(flush_tri_fan_0),
550
   TAG(flush_quad_0),
551
   TAG(flush_quad_strip_0),
552
   TAG(flush_poly_0),
553
};
554
555
 
556
 
557
#undef LOCAL_VARS
558
#undef GET_INTERP_FUNC
559
#undef IMM_VERTEX
560
#undef IMM_VERTICES
561
#undef FLUSH_VERTEX
562
#endif
563
#undef PRESERVE_PRIM_DEFS
564
#undef EXTEND_PRIM
565
#undef EMIT_VERTEX
566
#undef EMIT_VERTEX_TRI
567
#undef EMIT_VERTEX_LINE
568
#undef EMIT_VERTEX_POINT
569
#undef TAG
570