pvr: set correct framebuffer size in 240p/pixel_double

Some games use 240p and pixel_double resulting in a 320x240 framebuffer.
Renderer should be resized accordingly.
Fixes linear filtering artifact in KoF dream match 1999 (Issue #690)
This commit is contained in:
Flyinghead 2022-07-12 15:55:49 +02:00
parent 7f9d9b81aa
commit 4f206d2773
4 changed files with 35 additions and 9 deletions

View File

@ -811,6 +811,7 @@ bool Emulator::checkStatus()
bool Emulator::render()
{
rend_resize_renderer_if_needed();
if (!config::ThreadedRendering)
{
if (state != Running)

View File

@ -38,6 +38,7 @@ bool fb_dirty;
static bool pend_rend;
TA_context* _pvrrc;
extern bool rend_needs_resize;
static bool rend_frame(TA_context* ctx)
{
@ -363,32 +364,44 @@ void rend_deserialize(Deserializer& deser)
deser >> fb_watch_addr_end;
}
pend_rend = false;
rend_needs_resize = true;
}
void rend_resize_renderer()
{
if (renderer == nullptr)
return;
float hres;
int vres = config::RenderResolution;
int fbwidth = VO_CONTROL.pixel_double ? 320 : 640;
int fbheight = (SPG_CONTROL.PAL == SPG_CONTROL.NTSC) || SPG_CONTROL.interlace == 1 ? 480 : 240;
float upscaling = config::RenderResolution / 480.f;
float hres = fbwidth * upscaling;
float vres = fbheight * upscaling;
if (config::Widescreen && !config::Rotate90)
{
if (config::SuperWidescreen)
hres = (float)config::RenderResolution * settings.display.width / settings.display.height;
hres = vres * settings.display.width / settings.display.height;
else
hres = config::RenderResolution * 16.f / 9.f;
hres *= 4.f / 3.f;
}
else if (config::Rotate90)
{
vres = vres * config::ScreenStretching / 100;
hres = config::RenderResolution * 4.f / 3.f;
vres *= config::ScreenStretching / 100.f;
}
else
{
hres = config::RenderResolution * 4.f * config::ScreenStretching / 3.f / 100.f;
hres *= config::ScreenStretching / 100.f;
}
if (!config::Rotate90)
hres = std::roundf(hres / 2.f) * 2.f;
DEBUG_LOG(RENDERER, "rend_resize_renderer: %d x %d", (int)hres, vres);
renderer->Resize((int)hres, vres);
DEBUG_LOG(RENDERER, "rend_resize_renderer: %d x %d", (int)hres, (int)vres);
renderer->Resize((int)hres, (int)vres);
rend_needs_resize = false;
}
void rend_resize_renderer_if_needed()
{
if (!rend_needs_resize)
return;
rend_resize_renderer();
}

View File

@ -21,6 +21,7 @@ void rend_allow_rollback();
void rend_serialize(Serializer& ser);
void rend_deserialize(Deserializer& deser);
void rend_resize_renderer();
void rend_resize_renderer_if_needed();
///////
extern TA_context* _pvrrc;

View File

@ -7,6 +7,7 @@
bool pal_needs_update=true;
bool fog_needs_update=true;
bool rend_needs_resize = true;
u8 pvr_regs[pvr_RegSize];
@ -159,6 +160,16 @@ void pvr_WriteReg(u32 paddr,u32 data)
{
PvrReg(addr, u32) = data;
CalculateSync();
if (addr == SPG_CONTROL_addr)
rend_needs_resize = true;
}
return;
case VO_CONTROL_addr:
if (PvrReg(addr, u32) != data)
{
PvrReg(addr, u32) = data;
rend_needs_resize = true;
}
return;