rsx: Implement fast ZCULL barrier when query object is already known

This commit is contained in:
kd-11 2020-06-30 20:41:56 +03:00 committed by kd-11
parent d7ffc8b4ac
commit c9c0d7361d
2 changed files with 13 additions and 1 deletions

View File

@ -355,7 +355,8 @@ namespace rsx
}
else
{
zcull_ctrl->read_barrier(this, cond_render_ctrl.eval_address, 4, reports::sync_no_notify);
// NOTE: eval_sources list is reversed with newest query first
zcull_ctrl->read_barrier(this, cond_render_ctrl.eval_address, cond_render_ctrl.eval_sources.front());
verify(HERE), !cond_render_ctrl.eval_pending();
}
}
@ -3622,6 +3623,16 @@ namespace rsx
return result_zcull_intr;
}
flags32_t ZCULL_control::read_barrier(class ::rsx::thread* ptimer, u32 memory_address, occlusion_query_info* query)
{
while (query->pending && !Emu.IsStopped())
{
update(ptimer, memory_address);
}
return result_none;
}
query_search_result ZCULL_control::find_query(vm::addr_t sink_address, bool all)
{
query_search_result result{};

View File

@ -456,6 +456,7 @@ namespace rsx
// Conditionally sync any pending writes if range overlaps
flags32_t read_barrier(class ::rsx::thread* ptimer, u32 memory_address, u32 memory_range, flags32_t flags);
flags32_t read_barrier(class ::rsx::thread* ptimer, u32 memory_address, occlusion_query_info* query);
// Call once every 'tick' to update, optional address provided to partially sync until address is processed
void update(class ::rsx::thread* ptimer, u32 sync_address = 0, bool hint = false);