mirror of
https://github.com/RPCSX/rpcsx.git
synced 2026-04-20 22:05:12 +00:00
overlays: Avoid race condition on remove-on-update views
- Improves cleanup code to consist of 2 parts, remove then dispose. Remove does not deallocate the item until dispose is called on it, allowing the backends to first deallocate external references. - Caller is responsible for managing list locking and tracking disposable list of items when external references have been cleaned up before using dispose method.
This commit is contained in:
parent
2bfafe4b0d
commit
2adb2ebb00
3 changed files with 146 additions and 28 deletions
|
|
@ -1468,12 +1468,19 @@ void GLGSRender::flip(int buffer)
|
|||
{
|
||||
if (m_overlay_manager->has_dirty())
|
||||
{
|
||||
m_overlay_manager->lock();
|
||||
|
||||
std::vector<u32> uids_to_dispose;
|
||||
uids_to_dispose.reserve(m_overlay_manager->get_dirty().size());
|
||||
|
||||
for (const auto& view : m_overlay_manager->get_dirty())
|
||||
{
|
||||
m_ui_renderer.remove_temp_resources(view->uid);
|
||||
uids_to_dispose.push_back(view->uid);
|
||||
}
|
||||
|
||||
m_overlay_manager->clear_dirty();
|
||||
m_overlay_manager->unlock();
|
||||
m_overlay_manager->dispose(uids_to_dispose);
|
||||
}
|
||||
|
||||
if (m_overlay_manager->has_visible())
|
||||
|
|
@ -1481,6 +1488,9 @@ void GLGSRender::flip(int buffer)
|
|||
gl::screen.bind();
|
||||
glViewport(0, 0, m_frame->client_width(), m_frame->client_height());
|
||||
|
||||
// Lock to avoid modification during run-update chain
|
||||
std::lock_guard<rsx::overlays::display_manager> lock(*m_overlay_manager);
|
||||
|
||||
for (const auto& view : m_overlay_manager->get_views())
|
||||
{
|
||||
m_ui_renderer.run(m_frame->client_width(), m_frame->client_height(), 0, *view.get());
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue