static void _ChangeSize(void) { float res_scl_y; uint32_t dwHStartReg, dwVStartReg; uint32_t hstart, hend, vstart, vend, scale_y, scale_x; float fscale_x = 0.0; float fscale_y = 0.0; float aspect = 0.0; if (!gfx_info.VI_H_START_REG) return; res_scl_y = (float)settings.res_y / 240.0f; dwHStartReg = *gfx_info.VI_H_START_REG; dwVStartReg = *gfx_info.VI_V_START_REG; hstart = dwHStartReg >> 16; hend = dwHStartReg & 0xFFFF; vstart = dwVStartReg >> 16; vend = dwVStartReg & 0xFFFF; scale_x = *gfx_info.VI_X_SCALE_REG & 0xFFF; scale_y = *gfx_info.VI_Y_SCALE_REG & 0xFFF; if (!scale_x || !scale_y) return; fscale_x = (float)scale_x / 1024.0f; fscale_y = (float)scale_y / 2048.0f; // dunno... but sometimes this happens if (hend == hstart) hend = (int)(*gfx_info.VI_WIDTH_REG / fscale_x); rdp.vi_width = (hend - hstart) * fscale_x; rdp.vi_height = (vend - vstart) * fscale_y * 1.0126582f; aspect = (settings.adjust_aspect && (fscale_y > fscale_x) && (rdp.vi_width > rdp.vi_height)) ? fscale_x/fscale_y : 1.0f; rdp.scale_x = (float)settings.res_x / rdp.vi_width; if (region != OS_TV_TYPE_NTSC && settings.pal230) { // odd... but pal games seem to want 230 as height... rdp.scale_y = res_scl_y * (230.0f / rdp.vi_height) * aspect; } else { rdp.scale_y = (float)settings.res_y / rdp.vi_height * aspect; } rdp.offset_y = ((float)settings.res_y - rdp.vi_height * rdp.scale_y) * 0.5f; if (((uint32_t)rdp.vi_width <= (*gfx_info.VI_WIDTH_REG)/2) && (rdp.vi_width > rdp.vi_height)) rdp.scale_y *= 0.5f; gDPSetScissor( 0, /* mode */ 0, /* ulx */ 0, /* uly */ (uint32_t)rdp.vi_width, /* lrx */ (uint32_t)rdp.vi_height /* lry */ ); g_gdp.flags |= UPDATE_VIEWPORT | UPDATE_SCISSOR; }
void RDP_SetScissor( u32 w0, u32 w1 ) { gDPSetScissor( _SHIFTR( w1, 24, 2 ), // mode _FIXED2FLOAT( _SHIFTR( w0, 12, 12 ), 2 ), // ulx _FIXED2FLOAT( _SHIFTR( w0, 0, 12 ), 2 ), // uly _FIXED2FLOAT( _SHIFTR( w1, 12, 12 ), 2 ), // lrx _FIXED2FLOAT( _SHIFTR( w1, 0, 12 ), 2 ) ); // lry }
void gfx_mode_init(void) { gfx_sync(); gSPLoadGeometryMode(gfx_disp_p++, 0); gDPSetCycleType(gfx_disp_p++, G_CYC_1CYCLE); gDPSetRenderMode(gfx_disp_p++, G_RM_XLU_SURF, G_RM_XLU_SURF2); gDPSetScissor(gfx_disp_p++, G_SC_NON_INTERLACE, 0, 0, Z64_SCREEN_WIDTH, Z64_SCREEN_HEIGHT); gDPSetAlphaDither(gfx_disp_p++, G_AD_DISABLE); gDPSetColorDither(gfx_disp_p++, G_CD_DISABLE); gDPSetAlphaCompare(gfx_disp_p++, G_AC_NONE); gDPSetDepthSource(gfx_disp_p++, G_ZS_PRIM); gDPSetCombineKey(gfx_disp_p++, G_CK_NONE); gDPSetTextureConvert(gfx_disp_p++, G_TC_FILT); gDPSetTextureDetail(gfx_disp_p++, G_TD_CLAMP); gDPSetTexturePersp(gfx_disp_p++, G_TP_NONE); gDPSetTextureLOD(gfx_disp_p++, G_TL_TILE); gDPSetTextureLUT(gfx_disp_p++, G_TT_NONE); gDPPipelineMode(gfx_disp_p++, G_PM_NPRIMITIVE); gfx_mode_apply(GFX_MODE_ALL); }