diff options
author | Franklin Wei <franklin@rockbox.org> | 2019-08-09 20:08:10 -0400 |
---|---|---|
committer | Franklin Wei <franklin@rockbox.org> | 2019-08-09 21:27:42 -0400 |
commit | ee70dad305a94709c877e776d723aee64d023cb5 (patch) | |
tree | 4483d1bd7b96e080dcb496e0665252e970d8cdbf /apps/plugins/sdl/progs/quake/r_bsp.c | |
parent | 3fffabf50d5597812ffa4381ac70dd6e2af6b392 (diff) | |
download | rockbox-ee70dad305a94709c877e776d723aee64d023cb5.tar.gz rockbox-ee70dad305a94709c877e776d723aee64d023cb5.zip |
quake: merge some fixed-point optimizations from PocketQuake
The PocketQuake project, available below, has some nice fixed-point code:
https://web.archive.org/web/20150412233306/http://quake.pocketmatrix.com/PocketQuake0062_src.zip
I'd like to see most of them merged into our Quake port. This commit
gives +0.9FPS on ipod6g. (A big change given that it was running at
only 9.7FPS to begin with!)
Change-Id: I91931bdd5c22f14fb28616de938a03b4e7d7b076
Diffstat (limited to 'apps/plugins/sdl/progs/quake/r_bsp.c')
-rw-r--r-- | apps/plugins/sdl/progs/quake/r_bsp.c | 109 |
1 files changed, 103 insertions, 6 deletions
diff --git a/apps/plugins/sdl/progs/quake/r_bsp.c b/apps/plugins/sdl/progs/quake/r_bsp.c index f8c38cf601..2940b1a509 100644 --- a/apps/plugins/sdl/progs/quake/r_bsp.c +++ b/apps/plugins/sdl/progs/quake/r_bsp.c | |||
@@ -27,6 +27,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
27 | // | 27 | // |
28 | qboolean insubmodel; | 28 | qboolean insubmodel; |
29 | entity_t *currententity; | 29 | entity_t *currententity; |
30 | |||
31 | #ifdef USE_PQ_OPT1 | ||
32 | int modelorg_fxp[3]; | ||
33 | #endif | ||
34 | |||
30 | vec3_t modelorg, base_modelorg; | 35 | vec3_t modelorg, base_modelorg; |
31 | // modelorg is the viewpoint reletive to | 36 | // modelorg is the viewpoint reletive to |
32 | // the currently rendering entity | 37 | // the currently rendering entity |
@@ -440,6 +445,10 @@ void R_DrawSubmodelPolygons (model_t *pmodel, int clipflags) | |||
440 | } | 445 | } |
441 | } | 446 | } |
442 | 447 | ||
448 | #ifdef USE_PQ_OPT1 | ||
449 | int clipplanes_fxp[4][3]; | ||
450 | int clipdist_fxp[4]; | ||
451 | #endif | ||
443 | 452 | ||
444 | /* | 453 | /* |
445 | ================ | 454 | ================ |
@@ -449,11 +458,16 @@ R_RecursiveWorldNode | |||
449 | void R_RecursiveWorldNode (mnode_t *node, int clipflags) | 458 | void R_RecursiveWorldNode (mnode_t *node, int clipflags) |
450 | { | 459 | { |
451 | int i, c, side, *pindex; | 460 | int i, c, side, *pindex; |
452 | vec3_t acceptpt, rejectpt; | ||
453 | mplane_t *plane; | 461 | mplane_t *plane; |
454 | msurface_t *surf, **mark; | 462 | msurface_t *surf, **mark; |
455 | mleaf_t *pleaf; | 463 | mleaf_t *pleaf; |
456 | double d, dot; | 464 | double dot; |
465 | #ifdef USE_PQ_OPT1 | ||
466 | int d_fxp; | ||
467 | #else | ||
468 | double d; | ||
469 | vec3_t acceptpt, rejectpt; | ||
470 | #endif | ||
457 | 471 | ||
458 | if (node->contents == CONTENTS_SOLID) | 472 | if (node->contents == CONTENTS_SOLID) |
459 | return; // solid | 473 | return; // solid |
@@ -477,16 +491,29 @@ void R_RecursiveWorldNode (mnode_t *node, int clipflags) | |||
477 | 491 | ||
478 | pindex = pfrustum_indexes[i]; | 492 | pindex = pfrustum_indexes[i]; |
479 | 493 | ||
494 | #ifdef USE_PQ_OPT1 | ||
495 | d_fxp=node->minmaxs[pindex[0]]*clipplanes_fxp[i][0]+node->minmaxs[pindex[1]]*clipplanes_fxp[i][1]+node->minmaxs[pindex[2]]*clipplanes_fxp[i][2]; | ||
496 | d_fxp-=clipdist_fxp[i]; | ||
497 | |||
498 | if (d_fxp <= 0) | ||
499 | return; | ||
500 | |||
501 | d_fxp=node->minmaxs[pindex[3]]*clipplanes_fxp[i][0]+node->minmaxs[pindex[4]]*clipplanes_fxp[i][1]+node->minmaxs[pindex[5]]*clipplanes_fxp[i][2]; | ||
502 | d_fxp-=clipdist_fxp[i]; | ||
503 | |||
504 | if (d_fxp >= 0) | ||
505 | clipflags &= ~(1<<i); // node is entirely on screen | ||
506 | #else | ||
480 | rejectpt[0] = (float)node->minmaxs[pindex[0]]; | 507 | rejectpt[0] = (float)node->minmaxs[pindex[0]]; |
481 | rejectpt[1] = (float)node->minmaxs[pindex[1]]; | 508 | rejectpt[1] = (float)node->minmaxs[pindex[1]]; |
482 | rejectpt[2] = (float)node->minmaxs[pindex[2]]; | 509 | rejectpt[2] = (float)node->minmaxs[pindex[2]]; |
483 | 510 | ||
484 | d = DotProduct (rejectpt, view_clipplanes[i].normal); | 511 | d = DotProduct (rejectpt, view_clipplanes[i].normal); |
485 | d -= view_clipplanes[i].dist; | 512 | d -= view_clipplanes[i].dist; |
486 | 513 | ||
487 | if (d <= 0) | 514 | if (d <= 0) |
488 | return; | 515 | return; |
489 | 516 | ||
490 | acceptpt[0] = (float)node->minmaxs[pindex[3+0]]; | 517 | acceptpt[0] = (float)node->minmaxs[pindex[3+0]]; |
491 | acceptpt[1] = (float)node->minmaxs[pindex[3+1]]; | 518 | acceptpt[1] = (float)node->minmaxs[pindex[3+1]]; |
492 | acceptpt[2] = (float)node->minmaxs[pindex[3+2]]; | 519 | acceptpt[2] = (float)node->minmaxs[pindex[3+2]]; |
@@ -496,6 +523,7 @@ void R_RecursiveWorldNode (mnode_t *node, int clipflags) | |||
496 | 523 | ||
497 | if (d >= 0) | 524 | if (d >= 0) |
498 | clipflags &= ~(1<<i); // node is entirely on screen | 525 | clipflags &= ~(1<<i); // node is entirely on screen |
526 | #endif | ||
499 | } | 527 | } |
500 | } | 528 | } |
501 | 529 | ||
@@ -656,10 +684,79 @@ void R_RenderWorld (void) | |||
656 | 684 | ||
657 | currententity = &cl_entities[0]; | 685 | currententity = &cl_entities[0]; |
658 | VectorCopy (r_origin, modelorg); | 686 | VectorCopy (r_origin, modelorg); |
687 | |||
688 | #ifdef USE_PQ_OPT1 | ||
689 | modelorg_fxp[0]=(int)(r_origin[0]*524288.0); | ||
690 | modelorg_fxp[1]=(int)(r_origin[1]*524288.0); | ||
691 | modelorg_fxp[2]=(int)(r_origin[2]*524288.0); | ||
692 | |||
693 | //modelorg_fxp[0]=(int)(r_origin[0]*65536.0); | ||
694 | //modelorg_fxp[1]=(int)(r_origin[1]*65536.0); | ||
695 | //modelorg_fxp[2]=(int)(r_origin[2]*65536.0); | ||
696 | |||
697 | vright_fxp[0]=(int)(256.0/vright[0]); | ||
698 | if (!vright_fxp[0]) vright_fxp[0]=0x7fffffff; | ||
699 | vright_fxp[1]=(int)(256.0/vright[1]); | ||
700 | if (!vright_fxp[1]) vright_fxp[1]=0x7fffffff; | ||
701 | vright_fxp[2]=(int)(256.0/vright[2]); | ||
702 | if (!vright_fxp[2]) vright_fxp[2]=0x7fffffff; | ||
703 | |||
704 | vpn_fxp[0]=(int)(256.0/vpn[0]); | ||
705 | if (!vpn_fxp[0]) vpn_fxp[0]=0x7fffffff; | ||
706 | vpn_fxp[1]=(int)(256.0/vpn[1]); | ||
707 | if (!vpn_fxp[1]) vpn_fxp[1]=0x7fffffff; | ||
708 | vpn_fxp[2]=(int)(256.0/vpn[2]); | ||
709 | if (!vpn_fxp[2]) vpn_fxp[2]=0x7fffffff; | ||
710 | |||
711 | vup_fxp[0]=(int)(256.0/vup[0]); | ||
712 | if (!vup_fxp[0]) vup_fxp[0]=0x7fffffff; | ||
713 | vup_fxp[1]=(int)(256.0/vup[1]); | ||
714 | if (!vup_fxp[1]) vup_fxp[1]=0x7fffffff; | ||
715 | vup_fxp[2]=(int)(256.0/vup[2]); | ||
716 | if (!vup_fxp[2]) vup_fxp[2]=0x7fffffff; | ||
717 | |||
718 | #endif | ||
719 | |||
720 | |||
659 | clmodel = currententity->model; | 721 | clmodel = currententity->model; |
660 | r_pcurrentvertbase = clmodel->vertexes; | 722 | r_pcurrentvertbase = clmodel->vertexes; |
661 | 723 | ||
662 | R_RecursiveWorldNode (clmodel->nodes, 15); | 724 | #ifdef USE_PQ_OPT2 |
725 | r_pcurrentvertbase_fxp = clmodel->vertexes_fxp; | ||
726 | #endif | ||
727 | #ifdef USE_PQ_OPT1 | ||
728 | //Dan Fixed point conversion stuff | ||
729 | for (i=0; i<4; i++) { | ||
730 | clipplanes_fxp[i][0]=(int)(view_clipplanes[i].normal[0]*65536.0); | ||
731 | clipplanes_fxp[i][1]=(int)(view_clipplanes[i].normal[1]*65536.0); | ||
732 | clipplanes_fxp[i][2]=(int)(view_clipplanes[i].normal[2]*65536.0); | ||
733 | clipdist_fxp[i] =(int)(view_clipplanes[i].dist*65536.0); | ||
734 | #ifdef USE_PQ_OPT2 | ||
735 | view_clipplanes_fxp[i].leftedge=view_clipplanes[i].leftedge; | ||
736 | view_clipplanes_fxp[i].rightedge=view_clipplanes[i].rightedge; | ||
737 | if (!view_clipplanes[i].normal[0]) view_clipplanes_fxp[i].normal[0]=2<<29; | ||
738 | else view_clipplanes_fxp[i].normal[0]=(int)(4096.0f/view_clipplanes[i].normal[0]); | ||
739 | if (!view_clipplanes[i].normal[0]) view_clipplanes_fxp[i].normal[0]=2<<29; | ||
740 | |||
741 | if (!view_clipplanes[i].normal[1]) view_clipplanes_fxp[i].normal[1]=2<<29; | ||
742 | else view_clipplanes_fxp[i].normal[1]=(int)(4096.0f/view_clipplanes[i].normal[1]); | ||
743 | if (!view_clipplanes[i].normal[1]) view_clipplanes_fxp[i].normal[1]=2<<29; | ||
744 | |||
745 | if (!view_clipplanes[i].normal[2]) view_clipplanes_fxp[i].normal[2]=2<<29; | ||
746 | else view_clipplanes_fxp[i].normal[2]=(int)(4096.0f/view_clipplanes[i].normal[2]); | ||
747 | if (!view_clipplanes[i].normal[2]) view_clipplanes_fxp[i].normal[2]=2<<29; | ||
748 | |||
749 | view_clipplanes_fxp[i].dist=(int)(view_clipplanes[i].dist*128.0f); | ||
750 | #endif | ||
751 | #if defined(_X86_)&&defined(DEBUG) | ||
752 | LogFloat(view_clipplanes[i].normal[0], "view_clipplanes[i].normal[0]", i, -1); | ||
753 | LogFloat(view_clipplanes[i].normal[1], "view_clipplanes[i].normal[1]", i, -1); | ||
754 | LogFloat(view_clipplanes[i].normal[2], "view_clipplanes[i].normal[2]", i, -1); | ||
755 | #endif | ||
756 | } | ||
757 | #endif | ||
758 | |||
759 | R_RecursiveWorldNode (clmodel->nodes, 15); | ||
663 | 760 | ||
664 | // if the driver wants the polygons back to front, play the visible ones back | 761 | // if the driver wants the polygons back to front, play the visible ones back |
665 | // in that order | 762 | // in that order |