Changeset 3598 for trunk/src/opengl/mesa/vbcull.c
- Timestamp:
- May 23, 2000, 10:41:28 PM (25 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/opengl/mesa/vbcull.c
r2962 r3598 1 /* $Id: vbcull.c,v 1. 2 2000-03-01 18:49:39jeroen Exp $ */1 /* $Id: vbcull.c,v 1.3 2000-05-23 20:41:01 jeroen Exp $ */ 2 2 3 3 /* 4 4 * Mesa 3-D graphics library 5 * Version: 3. 15 * Version: 3.3 6 6 * 7 7 * Copyright (C) 1999 Brian Paul All Rights Reserved. … … 33 33 #include "all.h" 34 34 #else 35 #ifndef XFree86Server 36 #include <stdio.h> 37 #else 38 #include "GL/xf86glx.h" 39 #endif 35 #include "glheader.h" 40 36 #include "types.h" 41 37 #include "context.h" … … 45 41 #include "vbrender.h" 46 42 #include "xform.h" 43 #include "mem.h" 47 44 #endif 48 45 … … 83 80 84 81 static GLuint gl_cull_points( struct vertex_buffer *VB, 85 86 87 88 82 GLuint start, 83 GLuint count, 84 GLuint parity, 85 CONST GLfloat (*proj)[4]) 89 86 { 90 87 const GLubyte *clipmask = VB->ClipMask; … … 99 96 for (i=start+1;i<count;i++) { 100 97 if (clipmask[i] == 0) 101 98 cullmask[i] = VERT_FACE_FRONT | PRIM_FACE_FRONT; 102 99 else { 103 100 cullcount++; 104 101 } 105 102 } … … 112 109 */ 113 110 static GLuint gl_cull_points_neither( struct vertex_buffer *VB, 114 115 116 117 111 GLuint start, 112 GLuint count, 113 GLuint parity, 114 CONST GLfloat (*proj)[4]) 118 115 { 119 116 GLubyte unculled_prim = VERT_FACE_FRONT|PRIM_FACE_FRONT; … … 126 123 127 124 128 #define CULL_LINE( i1, i, nr ) 129 do { 130 GLubyte ClipOr = VB->ClipMask[i1] | VB->ClipMask[i]; 131 132 if (ClipOr) { 133 if (VB->ClipMask[i1] & VB->ClipMask[i] & CLIP_ALL_BITS) { 134 cullcount+=nr;\135 } 136 else { 137 cullmask[i1] |= VERT_FACE_FRONT;\138 139 } 140 } else { 141 cullmask[i1] |= VERT_FACE_FRONT; 142 cullmask[i] |= VERT_FACE_FRONT | PRIM_FACE_FRONT; 143 } 125 #define CULL_LINE( i1, i, nr ) \ 126 do { \ 127 GLubyte ClipOr = VB->ClipMask[i1] | VB->ClipMask[i]; \ 128 \ 129 if (ClipOr) { \ 130 if (VB->ClipMask[i1] & VB->ClipMask[i] & CLIP_ALL_BITS) { \ 131 cullcount+=nr; \ 132 } \ 133 else { \ 134 cullmask[i1] |= VERT_FACE_FRONT; \ 135 cullmask[i] |= VERT_FACE_FRONT | PRIM_FACE_FRONT | PRIM_CLIPPED; \ 136 } \ 137 } else { \ 138 cullmask[i1] |= VERT_FACE_FRONT; \ 139 cullmask[i] |= VERT_FACE_FRONT | PRIM_FACE_FRONT; \ 140 } \ 144 141 } while (0) 145 142 … … 147 144 148 145 static GLuint gl_cull_lines( struct vertex_buffer *VB, 149 150 151 152 146 GLuint start, 147 GLuint count, 148 GLuint parity, 149 CONST GLfloat (*proj)[4]) 153 150 { 154 151 GLubyte *cullmask = VB->CullMask; … … 172 169 173 170 static GLuint gl_cull_line_strip( struct vertex_buffer *VB, 174 175 176 177 171 GLuint start, 172 GLuint count, 173 GLuint parity, 174 CONST GLfloat (*proj)[4]) 178 175 { 179 176 GLubyte *cullmask = VB->CullMask; … … 198 195 199 196 static GLuint gl_cull_line_loop( struct vertex_buffer *VB, 200 201 202 203 197 GLuint start, 198 GLuint count, 199 GLuint parity, 200 CONST GLfloat (*proj)[4]) 204 201 { 205 202 GLuint cullcount = 0; … … 221 218 222 219 223 #define CULL_TRI( do_clip, do_area, i2, i1, i0, parity, nr ) 224 do { 225 GLubyte ClipOr = 0; 226 if (do_clip) { 227 ClipOr = (VB->ClipMask[i2] | 228 VB->ClipMask[i1] |\229 VB->ClipMask[i0]);\230 } 231 232 if (do_clip && (ClipOr&CLIP_ALL_BITS)) 233 { 234 if (VB->ClipMask[i2] & VB->ClipMask[i1] & VB->ClipMask[i0] & 235 CLIP_ALL_BITS)\236 { 237 cullcount+=nr;\238 } 239 else 240 { 241 cullmask[i0] = cull_faces | PRIM_CLIPPED;\242 cullmask[i1] |= cull_faces;\243 cullmask[i2] |= cull_faces;\244 } 245 } 246 else 247 { 248 GLfloat area; 249 GLubyte face_flags; 250 251 if (do_area) { 252 area = ((proj[i2][0] - proj[i0][0]) *\253 (proj[i1][1] - proj[i0][1]) -\254 (proj[i2][1] - proj[i0][1]) *\255 (proj[i1][0] - proj[i0][0]));\256 257 face_flags = (((area<0.0F) ^ parity) + 1) & cull_faces;\258 } else { 259 face_flags = cull_faces;\260 } 261 262 if (!do_area || face_flags) 263 { 264 cullmask[i0] = face_flags | (face_flags << PRIM_FLAG_SHIFT);\265 cullmask[i1] |= face_flags;\266 cullmask[i2] |= face_flags;\267 if (do_clip && ClipOr) cullmask[i0] |= PRIM_CLIPPED;\268 } 269 else 270 { 271 cullcount+=nr;\272 } 273 } 220 #define CULL_TRI( do_clip, do_area, i2, i1, i0, parity, nr ) \ 221 do { \ 222 GLubyte ClipOr = 0; \ 223 if (do_clip) { \ 224 ClipOr = (VB->ClipMask[i2] | \ 225 VB->ClipMask[i1] | \ 226 VB->ClipMask[i0]); \ 227 } \ 228 \ 229 if (do_clip && (ClipOr&CLIP_ALL_BITS)) \ 230 { \ 231 if (VB->ClipMask[i2] & VB->ClipMask[i1] & VB->ClipMask[i0] & \ 232 CLIP_ALL_BITS) \ 233 { \ 234 cullcount+=nr; \ 235 } \ 236 else \ 237 { \ 238 cullmask[i0] = cull_faces | PRIM_CLIPPED; \ 239 cullmask[i1] |= cull_faces; \ 240 cullmask[i2] |= cull_faces; \ 241 } \ 242 } \ 243 else \ 244 { \ 245 GLfloat area; \ 246 GLubyte face_flags; \ 247 \ 248 if (do_area) { \ 249 area = ((proj[i2][0] - proj[i0][0]) * \ 250 (proj[i1][1] - proj[i0][1]) - \ 251 (proj[i2][1] - proj[i0][1]) * \ 252 (proj[i1][0] - proj[i0][0])); \ 253 \ 254 face_flags = (((area<0.0F) ^ parity) + 1) & cull_faces; \ 255 } else { \ 256 face_flags = cull_faces; \ 257 } \ 258 \ 259 if (!do_area || face_flags) \ 260 { \ 261 cullmask[i0] = face_flags | (face_flags << PRIM_FLAG_SHIFT); \ 262 cullmask[i1] |= face_flags; \ 263 cullmask[i2] |= face_flags; \ 264 if (do_clip && ClipOr) cullmask[i0] |= PRIM_CLIPPED; \ 265 } \ 266 else \ 267 { \ 268 cullcount+=nr; \ 269 } \ 270 } \ 274 271 } while (0) 275 272 … … 278 275 279 276 280 #define CULL_QUAD( do_clip, do_area, i3, i2, i1, i, nr ) 281 do { 282 GLubyte ClipOr = 0; 283 284 if (do_clip) { 285 ClipOr = (VB->ClipMask[i3] | 286 VB->ClipMask[i2] |\287 VB->ClipMask[i1] |\288 VB->ClipMask[i]);\289 } 290 291 if (do_clip && (ClipOr&CLIP_ALL_BITS)) 292 { 293 if (VB->ClipMask[i3] & VB->ClipMask[i2] & 294 VB->ClipMask[i1] & VB->ClipMask[i] &\295 CLIP_ALL_BITS)\296 { 297 cullcount+=nr;\298 } 299 else 300 { 301 cullmask[i] = cull_faces | PRIM_CLIPPED;\302 cullmask[i1] = cull_faces | PRIM_CLIPPED;\303 cullmask[i2] |= cull_faces;\304 cullmask[i3] |= cull_faces;\305 } 306 } 307 else 308 { 309 GLfloat area; 310 GLubyte face_flags; 311 312 if (do_area) { 313 area = ((proj[i1][0] - proj[i3][0]) * /* ex */\314 (proj[i ][1] - proj[i2][1]) - /* fy */\315 (proj[i1][1] - proj[i3][1]) * /* ey */\316 (proj[i ][0] - proj[i2][0])); /* fx */\317 318 face_flags = (((area<0.0F) ^ face_bit) + 1) & cull_faces;\319 } else { 320 face_flags = cull_faces;\321 } 322 323 if (do_area && !face_flags) 324 { 325 cullcount+=nr;\326 } 327 else 328 { 329 cullmask[i] = face_flags | (face_flags<<PRIM_FLAG_SHIFT);\330 cullmask[i1] = face_flags | (face_flags<<PRIM_FLAG_SHIFT);\331 cullmask[i2] |= face_flags;\332 cullmask[i3] |= face_flags;\333 if (ClipOr)\334 cullmask[i] |= PRIM_CLIPPED;\335 } 336 } 277 #define CULL_QUAD( do_clip, do_area, i3, i2, i1, i, nr ) \ 278 do { \ 279 GLubyte ClipOr = 0; \ 280 \ 281 if (do_clip) { \ 282 ClipOr = (VB->ClipMask[i3] | \ 283 VB->ClipMask[i2] | \ 284 VB->ClipMask[i1] | \ 285 VB->ClipMask[i]); \ 286 } \ 287 \ 288 if (do_clip && (ClipOr&CLIP_ALL_BITS)) \ 289 { \ 290 if (VB->ClipMask[i3] & VB->ClipMask[i2] & \ 291 VB->ClipMask[i1] & VB->ClipMask[i] & \ 292 CLIP_ALL_BITS) \ 293 { \ 294 cullcount+=nr; \ 295 } \ 296 else \ 297 { \ 298 cullmask[i] = cull_faces | PRIM_CLIPPED; \ 299 cullmask[i1] = cull_faces | PRIM_CLIPPED; \ 300 cullmask[i2] |= cull_faces; \ 301 cullmask[i3] |= cull_faces; \ 302 } \ 303 } \ 304 else \ 305 { \ 306 GLfloat area; \ 307 GLubyte face_flags; \ 308 \ 309 if (do_area) { \ 310 area = ((proj[i1][0] - proj[i3][0]) * /* ex */ \ 311 (proj[i ][1] - proj[i2][1]) - /* fy */ \ 312 (proj[i1][1] - proj[i3][1]) * /* ey */ \ 313 (proj[i ][0] - proj[i2][0])); /* fx */ \ 314 \ 315 face_flags = (((area<0.0F) ^ face_bit) + 1) & cull_faces; \ 316 } else { \ 317 face_flags = cull_faces; \ 318 } \ 319 \ 320 if (do_area && !face_flags) \ 321 { \ 322 cullcount+=nr; \ 323 } \ 324 else \ 325 { \ 326 cullmask[i] = face_flags | (face_flags<<PRIM_FLAG_SHIFT); \ 327 cullmask[i1] = face_flags | (face_flags<<PRIM_FLAG_SHIFT); \ 328 cullmask[i2] |= face_flags; \ 329 cullmask[i3] |= face_flags; \ 330 if (ClipOr) \ 331 cullmask[i] |= PRIM_CLIPPED; \ 332 } \ 333 } \ 337 334 } while(0) 338 335 … … 357 354 358 355 static GLuint gl_cull_dummy_prim( struct vertex_buffer *VB, 359 360 361 362 356 GLuint start, 357 GLuint count, 358 GLuint parity, 359 CONST GLfloat (*proj)[4]) 363 360 { 364 361 (void) VB; … … 380 377 */ 381 378 static GLuint gl_copy_last_cull( struct vertex_buffer *VB, 382 383 379 GLuint start, GLuint count, 380 GLuint ovf, CONST GLfloat (*proj)[4]) 384 381 { 385 382 const GLcontext *ctx = VB->ctx; … … 399 396 400 397 static GLuint gl_copy_first_and_last_cull( struct vertex_buffer *VB, 401 402 403 398 GLuint start, 399 GLuint count, GLuint ovf, 400 CONST GLfloat (*proj)[4] ) 404 401 { 405 402 const GLcontext *ctx = VB->ctx; … … 427 424 */ 428 425 static GLuint gl_copy_last_two_cull( struct vertex_buffer *VB, 429 430 431 426 GLuint start, 427 GLuint count, GLuint ovf, 428 CONST GLfloat (*proj)[4] ) 432 429 { 433 430 const GLcontext *ctx = VB->ctx; … … 452 449 if (ovf == 1) { 453 450 if (cullmask[count-3] == 0) { 454 455 451 rv++; 452 cullmask[count-3] = ctx->Polygon.CullBits; 456 453 } 457 454 VB->CopyCount = 3; … … 467 464 */ 468 465 static GLuint gl_copy_overflow_cull( struct vertex_buffer *VB, 469 470 466 GLuint start, GLuint count, 467 GLuint ovf, CONST GLfloat (*proj)[4] ) 471 468 { 472 469 const GLcontext *ctx = VB->ctx; … … 487 484 488 485 static GLuint gl_copy_last( struct vertex_buffer *VB, 489 490 486 GLuint start, GLuint count, 487 GLuint ovf, CONST GLfloat (*proj)[4]) 491 488 { 492 489 (void) start; … … 499 496 500 497 static GLuint gl_copy_first_and_last( struct vertex_buffer *VB, 501 502 503 498 GLuint start, 499 GLuint count, 500 GLuint ovf, CONST GLfloat (*proj)[4]) 504 501 { 505 502 (void) ovf; … … 513 510 514 511 static GLuint gl_copy_last_two( struct vertex_buffer *VB, 515 516 512 GLuint start, GLuint count, 513 GLuint ovf, CONST GLfloat (*proj)[4]) 517 514 { 518 515 (void) start; … … 533 530 534 531 static GLuint gl_copy_overflow( struct vertex_buffer *VB, 535 536 537 538 532 GLuint start, 533 GLuint count, 534 GLuint ovf, 535 CONST GLfloat (*proj)[4] ) 539 536 { 540 537 GLuint src_offset = count - ovf; … … 557 554 558 555 static void gl_fast_copy_noop( struct vertex_buffer *VB, 559 560 556 GLuint start, GLuint count, 557 GLuint ovf) 561 558 { 562 559 (void) start; … … 567 564 568 565 static void gl_fast_copy_last( struct vertex_buffer *VB, 569 570 566 GLuint start, GLuint count, 567 GLuint ovf) 571 568 { 572 569 (void) start; … … 577 574 578 575 static void gl_fast_copy_first_and_last( struct vertex_buffer *VB, 579 580 581 576 GLuint start, 577 GLuint count, 578 GLuint ovf) 582 579 { 583 580 (void) ovf; … … 588 585 589 586 static void gl_fast_copy_last_two( struct vertex_buffer *VB, 590 591 587 GLuint start, GLuint count, 588 GLuint ovf ) 592 589 { 593 590 (void) start; … … 603 600 604 601 static void gl_fast_copy_overflow( struct vertex_buffer *VB, 605 606 607 602 GLuint start, 603 GLuint count, 604 GLuint ovf ) 608 605 { 609 606 GLuint src_offset = count - ovf; … … 618 615 619 616 typedef void (*fast_copy_func)( struct vertex_buffer *VB, 620 621 622 617 GLuint start, 618 GLuint count, 619 GLuint ovf ); 623 620 624 621 … … 626 623 627 624 typedef GLuint (*cull_func)( struct vertex_buffer *VB, 628 629 630 631 625 GLuint start, 626 GLuint count, 627 GLuint parity, 628 CONST GLfloat (*proj)[4]); 632 629 633 630 634 631 typedef GLuint (*copy_func)( struct vertex_buffer *VB, 635 636 637 638 632 GLuint start, 633 GLuint end, 634 GLuint ovf, 635 CONST GLfloat (*proj)[4] ); 639 636 640 637 … … 775 772 776 773 for ( i = start ; i < next ; i++) { 777 778 779 cullmask[i] = PRIM_CLIPPED;/* nonzero */780 781 782 774 if (~(flags[i] & purge)) { 775 indirect[j] = i; 776 cullmask[i] = PRIM_CLIPPED; /* nonzero */ 777 j++; 778 } 779 783 780 } 784 781 … … 794 791 795 792 static void build_clip_vert_bits( GLubyte *clipmask, const GLubyte *cullmask, 796 793 GLuint count ) 797 794 { 798 795 GLuint i = 0; 799 796 for (;;) 800 797 if (cullmask[++i]==0) { 801 802 798 clipmask[i] |= CLIP_CULLED_BIT; 799 if (&cullmask[i] == &cullmask[count]) return; 803 800 } 804 801 } … … 845 842 846 843 if (n == next - i) 847 844 out_prim[i] = GL_POLYGON+1; 848 845 else 849 846 out_prim[i] = prim; 850 847 851 848 cullcount += n; … … 855 852 if (VB->LastPrimitive < VB->Count) { 856 853 if (copy_tab_cull[lastprim]) 857 858 859 860 861 854 cullcount -= copy_tab_cull[prim]( VB, 855 first, 856 VB->Count, 857 VB->Ovf, 858 (const GLfloat (*)[4])proj ); 862 859 } 863 860 … … 871 868 872 869 if (cullcount < VB->Count) 873 870 build_clip_vert_bits( VB->ClipMask, VB->CullMask, VB->Count ); 874 871 875 872 } … … 906 903 907 904 if (first == VB_START) 908 905 first = VB->Start; 909 906 910 907 if (copy_tab_no_cull[prim]) 911 912 913 914 915 908 copy_tab_no_cull[prim]( VB, 909 first, 910 VB->Count, 911 VB->Ovf, 912 (const GLfloat (*)[4])proj ); 916 913 } 917 914 … … 929 926 930 927 if (first == VB_START) 931 928 first = VB->Start; 932 929 933 930 fast_copy_tab[prim]( VB, first, VB->Count, VB->Ovf ); … … 952 949 953 950 if (VB->CullMode & CULL_MASK_ACTIVE) { 954 955 956 957 958 959 960 961 962 951 GLubyte *lastnorm = VB->NormCullStart; 952 953 for (i = VB->Start ;;) { 954 *lastnorm |= VB->CullMask[i]; 955 if (VB->Flag[++i] & (VERT_NORM|VERT_END_VB)) { 956 lastnorm = &VB->NormCullMask[i]; 957 if (VB->Flag[i] & VERT_END_VB) return; 958 } 959 } 963 960 } else { 964 965 966 967 968 969 961 VB->NormCullMask[VB->Start] = ~0; 962 for (i = VB->Start ;; ) 963 if (VB->Flag[++i] & (VERT_NORM|VERT_END_VB)) { 964 VB->NormCullMask[i] = ~0; 965 if (VB->Flag[i] & VERT_END_VB) return; 966 } 970 967 } 971 968 } else {
Note:
See TracChangeset
for help on using the changeset viewer.