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::_50: limit = 50.; break;
case frame_limit_type::_60: limit = 60.; break; case frame_limit_type::_60: limit = 60.; break;
case frame_limit_type::_30: limit = 30.; 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: default:
break; break;
} }

View File

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