Changeset 3598 for trunk/src/opengl/mesa/3dfx/fxtexman.c
- Timestamp:
- May 23, 2000, 10:41:28 PM (25 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/opengl/mesa/3dfx/fxtexman.c
r2938 r3598 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. … … 55 55 #include "fxdrv.h" 56 56 57 int texSwaps=0; 58 57 59 #define FX_2MB_SPLIT 0x200000 58 60 59 61 static struct gl_texture_object *fxTMFindOldestObject(fxMesaContext fxMesa, 60 62 int tmu); 61 63 62 64 … … 82 84 fubar(); 83 85 } 84 if (prev && (prev->startAddr>=tmp->startAddr || 85 86 if (prev && (prev->startAddr>=tmp->startAddr || 87 prev->endAddr>tmp->startAddr)) { 86 88 fprintf(stderr, "Sorting fubar\n"); 87 89 fubar(); … … 101 103 fubar(); 102 104 } 103 if (prev && (prev->startAddr>=tmp->startAddr || 104 105 if (prev && (prev->startAddr>=tmp->startAddr || 106 prev->endAddr>tmp->startAddr)) { 105 107 fprintf(stderr, "Sorting fubar\n"); 106 108 fubar(); … … 122 124 fprintf(stderr, "fxDriver: out of memory!\n"); 123 125 fxCloseHardware(); 124 exit(-1);126 EXIT(-1); 125 127 } 126 128 } … … 162 164 if(fxMesa->verbose) 163 165 fprintf(stderr," %07u-%07u\n", 164 166 (unsigned int)blockstart,(unsigned int)blockend); 165 167 166 168 tmn=fxTMNewRangeNode(fxMesa, blockstart, blockend); … … 186 188 while (tmp) { 187 189 if (tmp->endAddr-tmp->startAddr>=size) { /* Fits here */ 188 189 190 191 192 193 194 195 196 197 198 199 190 result=tmp->startAddr; 191 tmp->startAddr+=size; 192 if (tmp->startAddr==tmp->endAddr) { /* Empty */ 193 if (prev) { 194 prev->next=tmp->next; 195 } else { 196 fxMesa->tmFree[tmu]=tmp->next; 197 } 198 fxTMDeleteRangeNode(fxMesa, tmp); 199 } 200 fxMesa->freeTexMem[tmu]-=size; 201 return result; 200 202 } 201 203 prev=tmp; … … 209 211 } 210 212 fxTMMoveOutTM(fxMesa, obj); 213 texSwaps++; 211 214 } 212 215 } … … 234 237 range->next=tmp; 235 238 if (tmp) { 236 if (range->endAddr==tmp->startAddr && tmp->startAddr&(FX_2MB_SPLIT-1)) { 239 if (range->endAddr==tmp->startAddr && tmp->startAddr&(FX_2MB_SPLIT-1)) { 237 240 /* Combine */ 238 241 tmp->startAddr=range->startAddr; … … 242 245 } 243 246 if (prev) { 244 if (prev->endAddr==range->startAddr && range->startAddr&(FX_2MB_SPLIT-1)) { 247 if (prev->endAddr==range->startAddr && range->startAddr&(FX_2MB_SPLIT-1)) { 245 248 /* Combine */ 246 249 prev->endAddr=range->endAddr; … … 254 257 255 258 static struct gl_texture_object *fxTMFindOldestObject(fxMesaContext fxMesa, 256 259 int tmu) 257 260 { 258 261 GLuint age, old, lasttime, bindnumber; … … 270 273 271 274 if (info && info->isInTM && 272 (info->whichTMU==tmu || info->whichTMU==FX_TMU_BOTH || 273 info->whichTMU==FX_TMU_SPLIT)) {275 ((info->whichTMU==tmu) || (info->whichTMU==FX_TMU_BOTH) || 276 (info->whichTMU==FX_TMU_SPLIT))) { 274 277 lasttime=info->lastTimeUsed; 275 278 276 279 if (lasttime>bindnumber) 277 280 age=bindnumber+(UINT_MAX-lasttime+1); /* TO DO: check wrap around */ 278 281 else 279 282 age=bindnumber-lasttime; 280 283 281 284 if (age>=old) { 282 283 285 old=age; 286 obj=tmp; 284 287 } 285 288 } … … 289 292 } 290 293 291 static MemRange *fxTMAddObj(fxMesaContext fxMesa, 292 293 294 static MemRange *fxTMAddObj(fxMesaContext fxMesa, 295 struct gl_texture_object *tObj, 296 GLint tmu, int texmemsize) 294 297 { 295 298 FxU32 startAddr; … … 319 322 fprintf(stderr,"fx Driver: internal error in fxTMMoveInTM() -> not validated\n"); 320 323 fxCloseHardware(); 321 exit(-1); 322 } 323 324 if (ti->isInTM) return; 324 EXIT(-1); 325 } 326 327 if (ti->isInTM) { 328 if (ti->whichTMU==where) return; 329 if (where==FX_TMU_SPLIT || ti->whichTMU==FX_TMU_SPLIT) 330 fxTMMoveOutTM_NoLock(fxMesa, tObj); 331 else { 332 if (ti->whichTMU==FX_TMU_BOTH) return; 333 where=FX_TMU_BOTH; 334 } 335 } 325 336 326 337 if (MESA_VERBOSE&(VERBOSE_DRIVER|VERBOSE_TEXTURE)) { … … 334 345 case FX_TMU1: 335 346 texmemsize=(int)FX_grTexTextureMemRequired_NoLock(GR_MIPMAPLEVELMASK_BOTH, 336 347 &(ti->info)); 337 348 ti->tm[where]=fxTMAddObj(fxMesa, tObj, where, texmemsize); 338 349 fxMesa->stats.memTexUpload+=texmemsize; 339 350 340 351 for (i=FX_largeLodValue(ti->info), l=ti->minLevel; 341 342 352 i<=FX_smallLodValue(ti->info); 353 i++,l++) 343 354 FX_grTexDownloadMipMapLevel_NoLock(where, 344 345 346 347 348 349 350 351 break; 352 case FX_TMU_SPLIT: /* TO DO: alternate even/odd TMU0/TMU1 */355 ti->tm[where]->startAddr, 356 FX_valueToLod(i), 357 FX_largeLodLog2(ti->info), 358 FX_aspectRatioLog2(ti->info), 359 ti->info.format, 360 GR_MIPMAPLEVELMASK_BOTH, 361 ti->mipmapLevel[l].data); 362 break; 363 case FX_TMU_SPLIT: 353 364 texmemsize=(int)FX_grTexTextureMemRequired_NoLock(GR_MIPMAPLEVELMASK_ODD, 354 365 &(ti->info)); 355 366 ti->tm[FX_TMU0]=fxTMAddObj(fxMesa, tObj, FX_TMU0, texmemsize); 356 367 fxMesa->stats.memTexUpload+=texmemsize; 357 368 358 369 texmemsize=(int)FX_grTexTextureMemRequired_NoLock(GR_MIPMAPLEVELMASK_EVEN, 359 370 &(ti->info)); 360 371 ti->tm[FX_TMU1]=fxTMAddObj(fxMesa, tObj, FX_TMU1, texmemsize); 361 372 fxMesa->stats.memTexUpload+=texmemsize; 362 373 363 374 for (i=FX_largeLodValue(ti->info),l=ti->minLevel; 364 365 375 i<=FX_smallLodValue(ti->info); 376 i++,l++) { 366 377 FX_grTexDownloadMipMapLevel_NoLock(GR_TMU0, 367 368 369 370 371 372 373 378 ti->tm[FX_TMU0]->startAddr, 379 FX_valueToLod(i), 380 FX_largeLodLog2(ti->info), 381 FX_aspectRatioLog2(ti->info), 382 ti->info.format, 383 GR_MIPMAPLEVELMASK_ODD, 384 ti->mipmapLevel[l].data); 374 385 375 386 FX_grTexDownloadMipMapLevel_NoLock(GR_TMU1, 376 ti->tm[FX_TMU1]->startAddr, 377 FX_valueToLod(i), 378 FX_largeLodLog2(ti->info), 379 FX_aspectRatioLog2(ti->info), 380 ti->info.format, 381 GR_MIPMAPLEVELMASK_EVEN, 382 ti->mipmapLevel[l].data); 387 ti->tm[FX_TMU1]->startAddr, 388 FX_valueToLod(i), 389 FX_largeLodLog2(ti->info), 390 FX_aspectRatioLog2(ti->info), 391 ti->info.format, 392 GR_MIPMAPLEVELMASK_EVEN, 393 ti->mipmapLevel[l].data); 394 } 395 break; 396 case FX_TMU_BOTH: 397 texmemsize=(int)FX_grTexTextureMemRequired_NoLock(GR_MIPMAPLEVELMASK_BOTH, 398 &(ti->info)); 399 ti->tm[FX_TMU0]=fxTMAddObj(fxMesa, tObj, FX_TMU0, texmemsize); 400 fxMesa->stats.memTexUpload+=texmemsize; 401 402 texmemsize=(int)FX_grTexTextureMemRequired_NoLock(GR_MIPMAPLEVELMASK_BOTH, 403 &(ti->info)); 404 ti->tm[FX_TMU1]=fxTMAddObj(fxMesa, tObj, FX_TMU1, texmemsize); 405 fxMesa->stats.memTexUpload+=texmemsize; 406 407 for (i=FX_largeLodValue(ti->info),l=ti->minLevel; 408 i<=FX_smallLodValue(ti->info); 409 i++,l++) { 410 FX_grTexDownloadMipMapLevel_NoLock(GR_TMU0, 411 ti->tm[FX_TMU0]->startAddr, 412 FX_valueToLod(i), 413 FX_largeLodLog2(ti->info), 414 FX_aspectRatioLog2(ti->info), 415 ti->info.format, 416 GR_MIPMAPLEVELMASK_BOTH, 417 ti->mipmapLevel[l].data); 418 419 FX_grTexDownloadMipMapLevel_NoLock(GR_TMU1, 420 ti->tm[FX_TMU1]->startAddr, 421 FX_valueToLod(i), 422 FX_largeLodLog2(ti->info), 423 FX_aspectRatioLog2(ti->info), 424 ti->info.format, 425 GR_MIPMAPLEVELMASK_BOTH, 426 ti->mipmapLevel[l].data); 383 427 } 384 428 break; … … 386 430 fprintf(stderr,"fx Driver: internal error in fxTMMoveInTM() -> wrong tmu (%d)\n",where); 387 431 fxCloseHardware(); 388 exit(-1);432 EXIT(-1); 389 433 } 390 434 … … 409 453 fprintf(stderr,"fx Driver: internal error in fxTMReloadMipMapLevel() -> not validated\n"); 410 454 fxCloseHardware(); 411 exit(-1);455 EXIT(-1); 412 456 } 413 457 … … 416 460 417 461 fxTexGetInfo(ti->mipmapLevel[0].width,ti->mipmapLevel[0].height, 418 &lodlevel, NULL, NULL, NULL, NULL, NULL, NULL, NULL); 419 462 &lodlevel, NULL, NULL, NULL, NULL, NULL, NULL, NULL); 463 464 #ifdef FX_GLIDE3 465 lodlevel-=level; 466 #else 467 lodlevel+=level; 468 #endif 420 469 switch(tmu) { 421 470 case FX_TMU0: 422 471 case FX_TMU1: 423 472 FX_grTexDownloadMipMapLevel(tmu, 424 425 FX_valueToLod(FX_lodToValue(lodlevel)+level),426 427 428 429 430 431 break; 432 case FX_TMU_SPLIT: /* TO DO: alternate even/odd TMU0/TMU1 */473 ti->tm[tmu]->startAddr, 474 FX_valueToLod(FX_lodToValue(lodlevel)), 475 FX_largeLodLog2(ti->info), 476 FX_aspectRatioLog2(ti->info), 477 ti->info.format, 478 GR_MIPMAPLEVELMASK_BOTH, 479 ti->mipmapLevel[level].data); 480 break; 481 case FX_TMU_SPLIT: 433 482 FX_grTexDownloadMipMapLevel(GR_TMU0, 434 435 FX_valueToLod(FX_lodToValue(lodlevel)+level),436 437 438 439 440 441 483 ti->tm[GR_TMU0]->startAddr, 484 FX_valueToLod(FX_lodToValue(lodlevel)), 485 FX_largeLodLog2(ti->info), 486 FX_aspectRatioLog2(ti->info), 487 ti->info.format, 488 GR_MIPMAPLEVELMASK_ODD, 489 ti->mipmapLevel[level].data); 490 442 491 FX_grTexDownloadMipMapLevel(GR_TMU1, 443 ti->tm[GR_TMU1]->startAddr, 444 FX_valueToLod(FX_lodToValue(lodlevel)+level), 445 FX_largeLodLog2(ti->info), 446 FX_aspectRatioLog2(ti->info), 447 ti->info.format, 448 GR_MIPMAPLEVELMASK_EVEN, 449 ti->mipmapLevel[level].data); 450 break; 492 ti->tm[GR_TMU1]->startAddr, 493 FX_valueToLod(FX_lodToValue(lodlevel)), 494 FX_largeLodLog2(ti->info), 495 FX_aspectRatioLog2(ti->info), 496 ti->info.format, 497 GR_MIPMAPLEVELMASK_EVEN, 498 ti->mipmapLevel[level].data); 499 break; 500 case FX_TMU_BOTH: 501 FX_grTexDownloadMipMapLevel(GR_TMU0, 502 ti->tm[GR_TMU0]->startAddr, 503 FX_valueToLod(FX_lodToValue(lodlevel)), 504 FX_largeLodLog2(ti->info), 505 FX_aspectRatioLog2(ti->info), 506 ti->info.format, 507 GR_MIPMAPLEVELMASK_BOTH, 508 ti->mipmapLevel[level].data); 509 510 FX_grTexDownloadMipMapLevel(GR_TMU1, 511 ti->tm[GR_TMU1]->startAddr, 512 FX_valueToLod(FX_lodToValue(lodlevel)), 513 FX_largeLodLog2(ti->info), 514 FX_aspectRatioLog2(ti->info), 515 ti->info.format, 516 GR_MIPMAPLEVELMASK_BOTH, 517 ti->mipmapLevel[level].data); 518 break; 519 451 520 default: 452 521 fprintf(stderr,"fx Driver: internal error in fxTMReloadMipMapLevel() -> wrong tmu (%d)\n",tmu); 453 522 fxCloseHardware(); 454 exit(-1);455 } 456 } 457 458 void fxTMReloadSubMipMapLevel(fxMesaContext fxMesa, 459 460 523 EXIT(-1); 524 } 525 } 526 527 void fxTMReloadSubMipMapLevel(fxMesaContext fxMesa, 528 struct gl_texture_object *tObj, 529 GLint level, GLint yoffset, GLint height) 461 530 { 462 531 tfxTexInfo *ti=fxTMGetTexInfo(tObj); … … 468 537 fprintf(stderr,"fx Driver: internal error in fxTMReloadSubMipMapLevel() -> not validated\n"); 469 538 fxCloseHardware(); 470 exit(-1);539 EXIT(-1); 471 540 } 472 541 … … 475 544 476 545 fxTexGetInfo(ti->mipmapLevel[0].width, ti->mipmapLevel[0].height, 477 546 &lodlevel, NULL, NULL, NULL, NULL, NULL, NULL, NULL); 478 547 479 548 if((ti->info.format==GR_TEXFMT_INTENSITY_8) || … … 488 557 case FX_TMU1: 489 558 FX_grTexDownloadMipMapLevelPartial(tmu, 490 491 492 493 494 495 496 497 498 break; 499 case FX_TMU_SPLIT: /* TO DO: alternate even/odd TMU0/TMU1 */559 ti->tm[tmu]->startAddr, 560 FX_valueToLod(FX_lodToValue(lodlevel)+level), 561 FX_largeLodLog2(ti->info), 562 FX_aspectRatioLog2(ti->info), 563 ti->info.format, 564 GR_MIPMAPLEVELMASK_BOTH, 565 data, 566 yoffset,yoffset+height-1); 567 break; 568 case FX_TMU_SPLIT: 500 569 FX_grTexDownloadMipMapLevelPartial(GR_TMU0, 501 502 503 504 505 506 507 508 570 ti->tm[FX_TMU0]->startAddr, 571 FX_valueToLod(FX_lodToValue(lodlevel)+level), 572 FX_largeLodLog2(ti->info), 573 FX_aspectRatioLog2(ti->info), 574 ti->info.format, 575 GR_MIPMAPLEVELMASK_ODD, 576 data, 577 yoffset,yoffset+height-1); 509 578 510 579 FX_grTexDownloadMipMapLevelPartial(GR_TMU1, 511 ti->tm[FX_TMU1]->startAddr, 512 FX_valueToLod(FX_lodToValue(lodlevel)+level), 513 FX_largeLodLog2(ti->info), 514 FX_aspectRatioLog2(ti->info), 515 ti->info.format, 516 GR_MIPMAPLEVELMASK_EVEN, 517 data, 518 yoffset,yoffset+height-1); 580 ti->tm[FX_TMU1]->startAddr, 581 FX_valueToLod(FX_lodToValue(lodlevel)+level), 582 FX_largeLodLog2(ti->info), 583 FX_aspectRatioLog2(ti->info), 584 ti->info.format, 585 GR_MIPMAPLEVELMASK_EVEN, 586 data, 587 yoffset,yoffset+height-1); 588 break; 589 case FX_TMU_BOTH: 590 FX_grTexDownloadMipMapLevelPartial(GR_TMU0, 591 ti->tm[FX_TMU0]->startAddr, 592 FX_valueToLod(FX_lodToValue(lodlevel)+level), 593 FX_largeLodLog2(ti->info), 594 FX_aspectRatioLog2(ti->info), 595 ti->info.format, 596 GR_MIPMAPLEVELMASK_BOTH, 597 data, 598 yoffset,yoffset+height-1); 599 600 FX_grTexDownloadMipMapLevelPartial(GR_TMU1, 601 ti->tm[FX_TMU1]->startAddr, 602 FX_valueToLod(FX_lodToValue(lodlevel)+level), 603 FX_largeLodLog2(ti->info), 604 FX_aspectRatioLog2(ti->info), 605 ti->info.format, 606 GR_MIPMAPLEVELMASK_BOTH, 607 data, 608 yoffset,yoffset+height-1); 519 609 break; 520 610 default: 521 611 fprintf(stderr,"fx Driver: internal error in fxTMReloadSubMipMapLevel() -> wrong tmu (%d)\n",tmu); 522 612 fxCloseHardware(); 523 exit(-1);613 EXIT(-1); 524 614 } 525 615 } … … 541 631 break; 542 632 case FX_TMU_SPLIT: 633 case FX_TMU_BOTH: 543 634 fxTMRemoveRange(fxMesa, FX_TMU0, ti->tm[FX_TMU0]); 544 635 fxTMRemoveRange(fxMesa, FX_TMU1, ti->tm[FX_TMU1]); … … 547 638 fprintf(stderr,"fx Driver: internal error in fxTMMoveOutTM()\n"); 548 639 fxCloseHardware(); 549 exit(-1);640 EXIT(-1); 550 641 } 551 642 … … 563 654 for(i=0; i<MAX_TEXTURE_LEVELS; i++) { 564 655 if (ti->mipmapLevel[i].used && 565 656 ti->mipmapLevel[i].translated) 566 657 FREE(ti->mipmapLevel[i].data); 567 658 … … 618 709 } 619 710 620 void fxTMRestore_NoLock(fxMesaContext fxMesa, struct gl_texture_object *tObj)621 {622 tfxTexInfo *ti=fxTMGetTexInfo(tObj);623 int i,l, where;624 625 if (MESA_VERBOSE&VERBOSE_DRIVER) {626 fprintf(stderr,"fxmesa: fxRestore(%d)\n",tObj->Name);627 }628 629 if (!ti->validated) {630 fprintf(stderr,"fxDriver: internal error in fxRestore -> not validated\n");631 fxCloseHardware();632 exit(-1);633 }634 635 where=ti->whichTMU;636 if (MESA_VERBOSE&(VERBOSE_DRIVER|VERBOSE_TEXTURE)) {637 fprintf(stderr,"fxmesa: reloading %x (%d) in texture memory in %d\n",638 (GLuint)tObj, tObj->Name, where);639 }640 641 switch(where) {642 case FX_TMU0:643 case FX_TMU1:644 for (i=FX_largeLodValue_NoLock(ti->info), l=ti->minLevel;645 i<=FX_smallLodValue_NoLock(ti->info);646 i++,l++)647 if (ti->mipmapLevel[l].data)648 FX_grTexDownloadMipMapLevel_NoLock(where,649 ti->tm[where]->startAddr,650 FX_valueToLod(i),651 FX_largeLodLog2(ti->info),652 FX_aspectRatioLog2(ti->info),653 ti->info.format,654 GR_MIPMAPLEVELMASK_BOTH,655 ti->mipmapLevel[l].data);656 break;657 case FX_TMU_SPLIT: /* TO DO: alternate even/odd TMU0/TMU1 */658 for (i=FX_largeLodValue_NoLock(ti->info),l=ti->minLevel;659 i<=FX_smallLodValue_NoLock(ti->info);660 i++,l++) {661 if (ti->mipmapLevel[l].data) {662 FX_grTexDownloadMipMapLevel_NoLock(GR_TMU0,663 ti->tm[FX_TMU0]->startAddr,664 FX_valueToLod(i),665 FX_largeLodLog2(ti->info),666 FX_aspectRatioLog2(ti->info),667 ti->info.format,668 GR_MIPMAPLEVELMASK_ODD,669 ti->mipmapLevel[l].data);670 FX_grTexDownloadMipMapLevel_NoLock(GR_TMU1,671 ti->tm[FX_TMU1]->startAddr,672 FX_valueToLod(i),673 FX_largeLodLog2(ti->info),674 FX_aspectRatioLog2(ti->info),675 ti->info.format,676 GR_MIPMAPLEVELMASK_EVEN,677 ti->mipmapLevel[l].data);678 }679 }680 break;681 default:682 fprintf(stderr,"fxDriver: internal error in fxRestore -> bad tmu (%d)\n",683 where);684 fxCloseHardware();685 exit(-1);686 }687 }688 689 711 void 690 fxTMRestoreTextures (fxMesaContext ctx) {712 fxTMRestoreTextures_NoLock(fxMesaContext ctx) { 691 713 tfxTexInfo *ti; 692 714 struct gl_texture_object *tObj; 693 int i ;715 int i, where; 694 716 695 717 tObj=ctx->glCtx->Shared->TexObjectList; … … 698 720 if (ti && ti->isInTM) { 699 721 for (i=0; i<MAX_TEXTURE_UNITS; i++) 700 if (ctx->glCtx->Texture.Unit[i].Current==tObj) { 701 /* Force the texture onto the board, as it could be in use */ 702 fxTMRestore_NoLock(ctx, tObj); 703 break; 704 } 722 if (ctx->glCtx->Texture.Unit[i].Current==tObj) { 723 /* Force the texture onto the board, as it could be in use */ 724 where=ti->whichTMU; 725 fxTMMoveOutTM_NoLock(ctx, tObj); 726 fxTMMoveInTM_NoLock(ctx, tObj, where); 727 break; 728 } 705 729 if (i==MAX_TEXTURE_UNITS) /* Mark the texture as off the board */ 706 fxTMMoveOutTM(ctx, tObj);730 fxTMMoveOutTM_NoLock(ctx, tObj); 707 731 } 708 732 tObj=tObj->Next;
Note:
See TracChangeset
for help on using the changeset viewer.