mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-05 06:21:26 +12:00
rsx: Implement fast ZCULL barrier when query object is already known
This commit is contained in:
parent
d7ffc8b4ac
commit
c9c0d7361d
2 changed files with 13 additions and 1 deletions
|
@ -355,7 +355,8 @@ namespace rsx
|
||||||
}
|
}
|
||||||
else
|
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();
|
verify(HERE), !cond_render_ctrl.eval_pending();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3622,6 +3623,16 @@ namespace rsx
|
||||||
return result_zcull_intr;
|
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 ZCULL_control::find_query(vm::addr_t sink_address, bool all)
|
||||||
{
|
{
|
||||||
query_search_result result{};
|
query_search_result result{};
|
||||||
|
|
|
@ -456,6 +456,7 @@ namespace rsx
|
||||||
|
|
||||||
// Conditionally sync any pending writes if range overlaps
|
// 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, 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
|
// 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);
|
void update(class ::rsx::thread* ptimer, u32 sync_address = 0, bool hint = false);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue