RSX: Rewrite frame limit

This commit is contained in:
Nekotekina 2017-11-10 17:31:02 +03:00
parent 916851bd4a
commit 9ef00b4a12
2 changed files with 25 additions and 5 deletions

View file

@ -940,12 +940,33 @@ namespace rsx
case frame_limit_type::_30: limit = 30.; break;
case frame_limit_type::_auto: limit = rsx->fps_limit; break; // TODO
}
if (limit)
{
std::this_thread::sleep_for(std::chrono::milliseconds((s64)(1000.0 / limit - rsx->timer_sync.GetElapsedTimeInMilliSec())));
rsx->timer_sync.Start();
const u64 time = get_system_time() - Emu.GetPauseTime() - rsx->start_rsx_time;
if (rsx->int_flip_index == 0)
{
rsx->start_rsx_time = time;
}
else
{
// Convert limit to expected time value
double expected = rsx->int_flip_index * 1000000. / limit;
while (time >= expected + 1000000. / limit)
{
expected = rsx->int_flip_index++ * 1000000. / limit;
}
if (expected > time + 1000)
{
std::this_thread::sleep_for(std::chrono::milliseconds{static_cast<s64>(expected - time) / 1000});
}
}
}
rsx->int_flip_index++;
rsx->current_display_buffer = arg;
rsx->flip(arg);
// After each flip PS3 system is executing a routine that changes registers value to some default.