Пример #1
0
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;
}
Пример #2
0
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
}
Пример #3
0
Файл: gfx.c Проект: glankk/gz
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);
}