rsx: Implement HW accurate frame limiter

This commit is contained in:
Eladash 2022-05-20 21:10:55 +03:00 committed by Megamouse
parent ec2d529832
commit cd74fb6a6d
2 changed files with 8 additions and 6 deletions

View File

@ -3188,7 +3188,7 @@ namespace rsx
case frame_limit_type::_50: limit = 50.; break;
case frame_limit_type::_60: limit = 60.; break;
case frame_limit_type::_30: limit = 30.; break;
case frame_limit_type::_auto: limit = static_cast<double>(g_cfg.video.vblank_rate); break;
case frame_limit_type::_auto: limit = 0.; break; // Handled in RSX semaphore_acquire
default:
break;
}

View File

@ -88,9 +88,6 @@ namespace rsx
const auto& sema = vm::_ref<RsxSemaphore>(addr).val;
// TODO: Remove vblank semaphore hack
if (addr == rsx->device_addr + 0x30) return;
if (sema == arg)
{
// Flip semaphore doesnt need wake-up delay
@ -107,10 +104,15 @@ namespace rsx
rsx->flush_fifo();
}
if (addr == rsx->device_addr + 0x30 && g_cfg.video.frame_limit == frame_limit_type::none)
{
return;
}
u64 start = rsx::uclock();
while (sema != arg)
{
if (rsx->is_stopped())
if (rsx->test_stopped())
{
return;
}
@ -123,7 +125,7 @@ namespace rsx
while (rsx->is_paused())
{
rsx->cpu_wait({});
rsx->check_state();
}
// Reset