diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index 36d7752880..7d593570fc 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -1237,7 +1237,7 @@ void GLGSRender::flip(int buffer) u32 buffer_height = display_buffers[buffer].height; u32 buffer_pitch = display_buffers[buffer].pitch; - if (buffer < display_buffers_count && buffer_width && buffer_height && buffer_pitch) + if ((u32)buffer < display_buffers_count && buffer_width && buffer_height && buffer_pitch) { // Calculate blit coordinates coordi aspect_ratio; @@ -1423,7 +1423,7 @@ void GLGSRender::on_notify_memory_unmapped(u32 address_base, u32 size) } } -void GLGSRender::do_local_task(bool idle) +void GLGSRender::do_local_task(bool /*idle*/) { m_frame->clear_wm_events(); @@ -1444,9 +1444,14 @@ void GLGSRender::do_local_task(bool idle) q.cv.notify_one(); } - if (m_custom_ui) + if (m_overlay_cleanup_requests.size()) { - if (!in_begin_end && idle && native_ui_flip_request.load()) + m_ui_renderer.remove_temp_resources(); + m_overlay_cleanup_requests.clear(); + } + else if (m_custom_ui) + { + if (!in_begin_end && native_ui_flip_request.load()) { native_ui_flip_request.store(false); flip((s32)current_display_buffer); @@ -1517,5 +1522,6 @@ void GLGSRender::get_occlusion_query_result(rsx::occlusion_query_info* query) void GLGSRender::shell_do_cleanup() { - m_ui_renderer.remove_temp_resources(); -} \ No newline at end of file + //TODO: Key cleanup requests with UID to identify resources to remove + m_overlay_cleanup_requests.push_back(0); +} diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.h b/rpcs3/Emu/RSX/GL/GLGSRender.h index 4cdf9ddfa4..5ba2ae0005 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.h +++ b/rpcs3/Emu/RSX/GL/GLGSRender.h @@ -307,6 +307,8 @@ private: gl::depth_convert_pass m_depth_converter; gl::ui_overlay_renderer m_ui_renderer; + std::vector m_overlay_cleanup_requests; + std::mutex queue_guard; std::list work_queue; diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index aed4274845..ec144a6823 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -2010,7 +2010,7 @@ void VKGSRender::process_swap_request(frame_context_t *ctx, bool free_resources) ctx->swap_command_buffer = nullptr; } -void VKGSRender::do_local_task(bool idle) +void VKGSRender::do_local_task(bool /*idle*/) { if (m_flush_requests.pending()) { @@ -2857,10 +2857,10 @@ void VKGSRender::flip(int buffer) if (m_current_frame == &m_aux_frame_context) { m_current_frame = &frame_context_storage[m_current_queue_index]; - if (m_current_frame->swap_command_buffer && m_current_frame->swap_command_buffer->pending) + if (m_current_frame->swap_command_buffer) { - //No choice but to wait for the last frame on the dst swapchain image to complete - m_current_frame->swap_command_buffer->wait(); + //Always present if pending swap is present. + //Its possible this flip request is triggered by overlays and the flip queue is in undefined state process_swap_request(m_current_frame, true); } @@ -2967,7 +2967,7 @@ void VKGSRender::flip(int buffer) //Blit contents to screen.. vk::image* image_to_flip = nullptr; - if (buffer < display_buffers_count && buffer_width && buffer_height && buffer_pitch) + if ((u32)buffer < display_buffers_count && buffer_width && buffer_height && buffer_pitch) { rsx::tiled_region buffer_region = get_tiled_address(display_buffers[buffer].offset, CELL_GCM_LOCATION_LOCAL); u32 absolute_address = buffer_region.address + buffer_region.base; diff --git a/rpcs3/Emu/RSX/overlay_controls.h b/rpcs3/Emu/RSX/overlay_controls.h index d543a02fa5..2046c0ae81 100644 --- a/rpcs3/Emu/RSX/overlay_controls.h +++ b/rpcs3/Emu/RSX/overlay_controls.h @@ -854,7 +854,15 @@ namespace rsx last_word = text_width; } - renderer->get_char(c, text_width, unused); + if ((u32)c > renderer->char_count) + { + //Non-existent glyph + text_width += renderer->em_size; + } + else + { + renderer->get_char(c, text_width, unused); + } if (!ignore_word_wrap && wrap_text && text_width >= w) {