static inline void gfx_sync(void) { if (!gfx_synced) { gDPPipeSync(gfx_disp_p++); gfx_synced = 1; } }
/*---------------------------------------------------------------------------- gfxClearCfb Clear frame buffer/Z buffer ----------------------------------------------------------------------------*/ void gfxClearCfb(void) { /* clear Z buffer*/ gDPSetDepthImage(glist_ptr++, OS_K0_TO_PHYSICAL(zbuffer)); gDPPipeSync(glist_ptr++); gDPSetCycleType(glist_ptr++, G_CYC_FILL); gDPSetColorImage(glist_ptr++, G_IM_FMT_RGBA, G_IM_SIZ_16b,SCREEN_WD, OS_K0_TO_PHYSICAL(zbuffer)); gDPSetFillColor(glist_ptr++,(GPACK_ZDZ(G_MAXFBZ,0) << 16 | GPACK_ZDZ(G_MAXFBZ,0))); gDPFillRectangle(glist_ptr++, 0, 0, SCREEN_WD-1, SCREEN_HT-1); gDPPipeSync(glist_ptr++); /* clear frame buffer */ gDPSetColorImage(glist_ptr++, G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_WD, osVirtualToPhysical(cfb[gfx_cfbdrawbuffer])); gDPSetFillColor(glist_ptr++, (GPACK_RGBA5551(0, 0, 0, 1) << 16 | GPACK_RGBA5551(0, 0, 0, 1))); gDPFillRectangle(glist_ptr++, 0, 0, SCREEN_WD-1, SCREEN_HT-1); gDPPipeSync(glist_ptr++); }
static void drawframe(dynamic_stuff *generate, Gfx **glistpParam, float t) { Gfx *glistp; Vtx *valist[2]; /* Array of vertex lists */ float weights[2]; /* Array of weights */ u16 perspnorm; int i; unsigned char a2; glistp = *glistpParam; /* Copy to local var */ /* * Set up matricies */ /* Z-distance to force for faces */ #define ZDIST (700*4) guPerspective(&(generate->projection), &perspnorm, 60.0, 320.0/240.0, ZDIST-500.0, ZDIST+500.0, 1.0); gSPPerspNormalize(glistp++, perspnorm); /* guRotate(&(generate->modeling_rotate1), 40.0, 1.0, 1.0, 1.0); */ guTranslate(&(generate->modeling_translate), 0.0, 0.0, 0.0); /* -... */ gSPMatrix(glistp++, OS_K0_TO_PHYSICAL(&(generate->projection)), G_MTX_PROJECTION|G_MTX_LOAD|G_MTX_NOPUSH); gSPMatrix(glistp++, OS_K0_TO_PHYSICAL(&(generate->modeling_translate)), G_MTX_MODELVIEW|G_MTX_LOAD|G_MTX_NOPUSH); /* gSPMatrix(glistp++, OS_K0_TO_PHYSICAL(&(generate->modeling_rotate1)), G_MTX_MODELVIEW|G_MTX_MUL|G_MTX_NOPUSH); */ /* * Morph */ valist[0] = vface1; weights[0] = t; valist[1] = vface2; weights[1] = 1.0 - t; /* Two sets of key verticies, tricnt*3 verticies per set, alpha = 255 */ /* Texture coords come from vface1 */ morph(valist, weights, 2, &(generate->tvface1[0]), tricnt*3, 255, -ZDIST); /* * 2nd set of verticies, same except for different alpha and s,t */ a2 = 255*(1.0-t); /* alpha value */ for (i=0; i<tricnt*3; i++) { generate->tvface2[i] = generate->tvface1[i]; generate->tvface2[i].v.tc[0] = vface2[i].v.tc[0] << 6; generate->tvface2[i].v.tc[1] = vface2[i].v.tc[1] << 6; generate->tvface2[i].v.cn[3] = a2; } /* for i */ /* Pass 1 -- opaque */ gSPSetGeometryMode(glistp++, G_SHADE); gDPPipeSync(glistp++); gDPSetRenderMode(glistp++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2); gSPDisplayList(glistp++, OS_K0_TO_PHYSICAL(dlist1)); /* Pass 2 -- transparent */ gSPSetGeometryMode(glistp++, G_SHADE); gDPPipeSync(glistp++); gDPSetRenderMode(glistp++, G_RM_AA_XLU_SURF, G_RM_AA_XLU_SURF2); gSPDisplayList(glistp++, OS_K0_TO_PHYSICAL(dlist2)); *glistpParam = glistp; /* Copy back from local var */ } /* drawframe */
void RDP_PipeSync( u32 w0, u32 w1 ) { gDPPipeSync(); }
// doFont() // // Draw all fonts for this frame. // void doFont(void) { static int color = 255; #ifdef DD64 currBufferPtr = fontBuffer; #endif /* Settings */ gDPPipeSync(glistp++); gDPSetCycleType(glistp++,G_CYC_1CYCLE); gDPSetTexturePersp(glistp++,G_TP_NONE); gDPSetTextureLUT(glistp++,G_TT_NONE); gDPSetTextureLOD(glistp++,G_TL_LOD); gDPSetAlphaCompare(glistp++,G_AC_THRESHOLD); gDPSetRenderMode(glistp++,G_RM_XLU_SURF,G_RM_XLU_SURF2); gDPSetCombineMode(glistp++,G_CC_INT4,G_CC_INT4); gDPSetPrimColor(glistp++,0,0,255,255,255,255); // Print welcome message printString(40, 30, 3, message[WELCOME_MESG]); #ifdef DD64 // Assume no EEPROM if DD game gDPSetPrimColor(glistp++,0,0,255,0,0,255); #else // Print EEPROM message if EEPROM exists if (EepromFound == 1) { gDPSetPrimColor(glistp++,0,0,0,255,0,255); } else { gDPSetPrimColor(glistp++,0,0,255,0,0,255); } #endif printString(30, 52, 3, message[EEPROM_MESG]); // Print DD message #ifdef DD64 gDPSetPrimColor(glistp++,0,0,0,255,0,255); #else gDPSetPrimColor(glistp++,0,0,255,0,0,255); #endif printString(250, 52, 3, message[DD_MESG]); #ifdef DD64 // Print Data menu if (DataMenu != DM_INVISIBLE) { gDPSetPrimColor(glistp++, 0, 0, 255, 255, 0, 255); printString(200, 170, 3, message[DM_READ_MESG]); printString(200, 182, 3, message[DM_WRITE_MESG]); printString(200, 194, 3, message[DM_GOAWAY_MESG]); gDPSetPrimColor(glistp++, 0, 0, color, 200, 200, 255); color += COLOR_DELTA; color = color%256; printString(200, 170 + 12*DataMenuPos, 3, message[DataMenuPos+3]); } #else // Print Data menu if ((EepromFound == 1) && (DataMenu != DM_INVISIBLE)) { gDPSetPrimColor(glistp++, 0, 0, 255, 255, 0, 255); printString(30, 170, 3, message[DM_READ_MESG]); printString(30, 182, 3, message[DM_WRITE_MESG]); printString(30, 194, 3, message[DM_GOAWAY_MESG]); gDPSetPrimColor(glistp++, 0, 0, color, 200, 200, 255); color += COLOR_DELTA; color = color%256; printString(30, 170 + 12*DataMenuPos, 3, message[DataMenuPos+3]); } #endif #ifdef DD64 osInvalDCache(fontBuffer,currBufferPtr-fontBuffer); #else osInvalDCache(myFont,sizeof(myFont)); #endif }
/*---------------------------------------------------------------------------* * M A I N *---------------------------------------------------------------------------*/ void Main(void *arg) { u8 draw_frame = 0; u32 objRM; Gfx *gp, *gtop; OSTime rspstart; u32 rsptime, rdptime; bg16seg = (u32)_codeSegmentEnd + (u32)_staticSegmentEnd - (u32)_staticSegmentStart; bg8seg = bg16seg + + (u32)_bg_rgbaSegmentRomEnd - (u32)_bg_rgbaSegmentRomStart; loadSegment(bg16seg, bg8seg); menuInit(); actionInit(); rsptime = rdptime = 0; while(1){ /*------ Start to read the controller. ------*/ osContStartReadData(&siMessageQ); /*------ Wait for the retrace. ------*/ osRecvMesg(&retraceMessageQ, NULL, OS_MESG_BLOCK); /*------ Setting the Bg structure. ------*/ setBg(); /*------ Setting the Object structure. ------*/ setObject(); /*------ Create the Gfx list. ------*/ gtop = gp = glist[draw_frame]; /*------ RSP initialization setting. ------*/ gSPSegment(gp ++, 0, 0x0); gSPSegment(gp ++, STATIC_SEGMENT, _codeSegmentEnd); if (aMenu[MENU_BG_TX_FORMAT]){ gSPSegment(gp ++, BG_SEGMENT, bg8seg); } gDPSetColorImage(gp ++, G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_WD, system_cfb[draw_frame]); gSPDisplayList(gp ++, rdpInit_dl); gSPDisplayList(gp ++, clearCfb_dl); gSPDisplayList(gp ++, spriteInit_dl); /*------ Bg output. ------*/ if (aMenu[MENU_BG_TX_FORMAT]){ gDPSetTextureLUT(gp ++, G_TT_RGBA16); gSPObjLoadTxtr(gp ++, &objBgTLUT); } if (aMenu[MENU_BG_SCALABLE] == 0){ /* Unscalable BG plane */ gDPSetRenderMode(gp ++, G_RM_NOOP, G_RM_NOOP2); gDPSetCycleType(gp ++, G_CYC_COPY); gSPBgRectCopy(gp ++, &objBg); } else { /* Scalable BG plane */ gDPSetRenderMode(gp ++, G_RM_SPRITE, G_RM_SPRITE2); gDPSetCycleType(gp ++, G_CYC_1CYCLE); gDPSetTextureFilter(gp ++, RMmodeTable[aMenu[MENU_RENDERMODE]].txtrFilter); if (aMenu[MENU_BG_SCALABLE] == 1){ /* Emulated by CPU */ guS2DEmuSetScissor(0, 0, SCREEN_WD, SCREEN_HT, (RMmodeTable[aMenu[MENU_RENDERMODE]].txtrFilter == G_TF_BILERP)); guS2DEmuBgRect1Cyc(&gp, &objBg); } else { /* GBI command */ gSPObjRenderMode(gp ++, RMmodeTable[aMenu[MENU_RENDERMODE]].objRMode); gSPBgRect1Cyc(gp ++, &objBg); } } gDPPipeSync(gp ++); /*------ Setting the Render Mode. ------*/ objRM = RMmodeTable[aMenu[MENU_RENDERMODE]].objRMode; if (RMmodeTable[aMenu[MENU_RENDERMODE]].cycleType != G_CYC_COPY){ if (!aMenu[MENU_RENDERMODE_2]){ /* Opaque */ if (RMmodeTable[aMenu[MENU_RENDERMODE]].antiAlias){ gDPSetRenderMode(gp ++, G_RM_AA_SPRITE, G_RM_AA_SPRITE2); } else { gDPSetRenderMode(gp ++, G_RM_SPRITE, G_RM_SPRITE2); } } else { /* Translucent */ if (RMmodeTable[aMenu[MENU_RENDERMODE]].antiAlias){ gDPSetRenderMode(gp ++, G_RM_AA_XLU_SPRITE, G_RM_AA_XLU_SPRITE2); } else { gDPSetRenderMode(gp ++, G_RM_XLU_SPRITE, G_RM_XLU_SPRITE2); } gDPSetCombineMode(gp ++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); gDPSetPrimColor(gp ++, 0, 0, 255, 255, 255, 128); } } /*------ Setting the Texture Filter and CycleType. ------*/ gDPSetTextureFilter(gp ++, RMmodeTable[aMenu[MENU_RENDERMODE]].txtrFilter); gDPSetCycleType (gp ++, RMmodeTable[aMenu[MENU_RENDERMODE]].cycleType ); /*------ Setting the Texture Window. ------*/ if (aMenu[MENU_OBJ_TX_WINDOW]) objRM |= G_OBJRM_NOTXCLAMP; /*------ Setting the Shrink. ------*/ objRM |= ShrinkTable[aMenu[MENU_OBJ_SHRINK]]; /*------ Setting the Object Render Mode. ------*/ gSPObjRenderMode(gp ++, objRM); /*------ Load setting of the Texture. -----*/ if (!aMenu[MENU_OBJ_TX_TYPE]){ gDPSetTextureLUT(gp ++, G_TT_NONE); gSPObjLoadTxtr(gp ++, (aMenu[MENU_OBJ_TX_LOAD_BY] ? &objTxtrTile_RGBA16 : &objTxtrBlock_RGBA16)); } else { gDPSetTextureLUT(gp ++, G_TT_RGBA16); gSPObjLoadTxtr(gp ++, (aMenu[MENU_OBJ_TX_LOAD_BY] ? &objTxtrTile_CI4 : &objTxtrBlock_CI4)); gSPObjLoadTxtr(gp ++, &objTLUT_CI4); } /*------ Output of Object:Rectangle1. ------*/ gSPObjRectangle(gp ++, &(objRect[0])); if (RMmodeTable[aMenu[MENU_RENDERMODE]].cycleType != G_CYC_COPY){ /*------ Output of Object:Rectangle2. ------*/ gSPObjMatrix(gp ++, &(objMtx[0])); gSPObjSprite(gp ++, &(objRect[1])); /*------ Output of Object:Ball. ------*/ /* Ball is displayed by combining two sprite pieces. Because of this, you need to change the processing method by setting the Texture Filter. If the Texture Filter is PointSample, you don't have to specify SHRINKSIZE; but, If it is Bilerp, it must be SHRINKSIZE_1. When you specify SHRINKSIZE_1, the circumference of Sprite for 0.5 texel is clamped. The area excepted by this clamp becomes a part that the Bilerp process gives no effect. Because you need to load the part of adjoining of Sprite twice in Bilerp, Ball draws only for 64x63 texels. It is important to understand the differences between objBall[1] and objBall[2] well. */ if (!aMenu[MENU_RENDERMODE_2]){ /* Draw one size larger to hide the joining part. (Only opaque.) It became unnecessary after S2DEX 1.05. */ /* objRM |= G_OBJRM_WIDEN; */ } gDPPipeSync(gp ++); gDPSetTextureLUT(gp ++, G_TT_RGBA16); gSPObjLoadTxtr(gp ++, &objBallTLUT); if (RMmodeTable[aMenu[MENU_RENDERMODE]].txtrFilter == G_TF_POINT){ gSPObjRenderMode(gp ++, objRM); gSPObjMatrix(gp ++, &(objMtx[2])); gSPObjLoadTxRectR(gp ++, &(objBall[0])); gSPObjLoadTxRectR(gp ++, &(objBall[1])); gSPObjMatrix(gp ++, &(objMtx[1])); gSPObjLoadTxSprite(gp ++, &(objBall[0])); gSPObjLoadTxSprite(gp ++, &(objBall[1])); } else { gSPObjRenderMode(gp ++, objRM|G_OBJRM_SHRINKSIZE_1); gSPObjMatrix(gp ++, &(objMtx[2])); gSPObjLoadTxRectR(gp ++, &(objBall[0])); gSPObjLoadTxRectR(gp ++, &(objBall[2])); gSPObjMatrix(gp ++, &(objMtx[1])); gSPObjLoadTxSprite(gp ++, &(objBall[0])); gSPObjLoadTxSprite(gp ++, &(objBall[2])); } } /*------ Output the processing meter. ------*/ if (rsptime){ gDPPipeSync(gp ++); gDPSetCycleType(gp ++, G_CYC_FILL); gDPSetRenderMode(gp ++, G_RM_OPA_SURF, G_RM_OPA_SURF2); gDPSetFillColor(gp ++, (GPACK_RGBA5551(128,128,255,1) << 16 | GPACK_RGBA5551(128,128,255,1))); gDPFillRectangle(gp ++, 30, 201, 30+rsptime/100, 202); gDPFillRectangle(gp ++, 30, 205, 30+rdptime/100, 206); gDPSetFillColor(gp ++, (GPACK_RGBA5551(255,255,255,1) << 16 | GPACK_RGBA5551(255,255,255,1))); gDPFillRectangle(gp ++, 30, 200, 30, 207); gDPFillRectangle(gp ++, 30+166, 200, 30+166, 207); } gDPFullSync(gp ++); gSPEndDisplayList(gp ++); /*------ Execute the Gfx task. ------*/ tlist.t.data_ptr = (u64 *)gtop; osWritebackDCache(gtop, ((u32)gp)-((u32)gtop)); rspstart = osGetTime(); osSpTaskStart(&tlist); /*------ Wait for the end. ------*/ osRecvMesg(&rspMessageQ, NULL, OS_MESG_BLOCK); rsptime = OS_CYCLES_TO_NSEC(osGetTime() - rspstart) / 1000; #ifdef RSP_DEBUG /*------ The ASSERT process of the micro-code. ------*/ if (ucCheckAssert()){ ucDebugGfxLogPrint(&tlist); /* Output the process log of RSP, Gfx and DL. */ // ucDebugRdpFifoPrint(&tlist); /* Output the RDP and fifo buffers. */ // ucDebugIMEMPrint(); /* Output IMEM. */ // ucDebugDMEMPrint(); /* Output DMEM. */ ucDebugAssertPrint(); /* Output Assert stop location, etc. */ ucDebugInfoPrint(); /* Output the work area for Debugging. */ while(1); } #endif #if 0 /*------ Output the DEBUG information. ------*/ if (Ac.pad[0].push & Z_TRIG){ ucDebugRdpFifoPrint(&tlist); /* Output the RDP and fifo buffers. */ ucDebugInfoPrint(); /* Output the work area for Debugging. */ } #endif osRecvMesg(&rdpMessageQ, NULL, OS_MESG_BLOCK); rdptime = OS_CYCLES_TO_NSEC(osGetTime() - rspstart) / 1000; /* Switching the Frame. */ osViSwapBuffer(system_cfb[draw_frame]); draw_frame ^= 1; /* Accept the controller data. */ osRecvMesg(&siMessageQ, NULL, OS_MESG_BLOCK); osContGetReadData(contPad); /* The input process. */ actionUpdate(); } }