mirror of https://github.com/RPCS3/rpcs3.git
rsx: Abort all drawing commands if no swapchain exists
- Should keep nvidia from consuming all device memory when minimized
This commit is contained in:
parent
6d2dcbd164
commit
bbb3bdf008
|
@ -931,7 +931,7 @@ void VKGSRender::begin()
|
||||||
{
|
{
|
||||||
rsx::thread::begin();
|
rsx::thread::begin();
|
||||||
|
|
||||||
if (skip_frame)
|
if (skip_frame || renderer_unavailable)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
init_buffers();
|
init_buffers();
|
||||||
|
@ -1102,7 +1102,7 @@ void VKGSRender::close_render_pass()
|
||||||
|
|
||||||
void VKGSRender::end()
|
void VKGSRender::end()
|
||||||
{
|
{
|
||||||
if (skip_frame || !framebuffer_status_valid)
|
if (skip_frame || !framebuffer_status_valid || renderer_unavailable)
|
||||||
{
|
{
|
||||||
rsx::thread::end();
|
rsx::thread::end();
|
||||||
return;
|
return;
|
||||||
|
@ -1572,7 +1572,7 @@ void VKGSRender::on_exit()
|
||||||
|
|
||||||
void VKGSRender::clear_surface(u32 mask)
|
void VKGSRender::clear_surface(u32 mask)
|
||||||
{
|
{
|
||||||
if (skip_frame) return;
|
if (skip_frame || renderer_unavailable) return;
|
||||||
|
|
||||||
// Ignore invalid clear flags
|
// Ignore invalid clear flags
|
||||||
if (!(mask & 0xF3)) return;
|
if (!(mask & 0xF3)) return;
|
||||||
|
@ -1979,9 +1979,12 @@ void VKGSRender::do_local_task()
|
||||||
case wm_event::geometry_change_in_progress:
|
case wm_event::geometry_change_in_progress:
|
||||||
timeout += 10; //extend timeout to wait for user to finish resizing
|
timeout += 10; //extend timeout to wait for user to finish resizing
|
||||||
break;
|
break;
|
||||||
|
case wm_event::window_restored:
|
||||||
|
if (renderer_unavailable)
|
||||||
|
renderer_unavailable = false;
|
||||||
|
//fall through
|
||||||
case wm_event::window_visibility_changed:
|
case wm_event::window_visibility_changed:
|
||||||
case wm_event::window_minimized:
|
case wm_event::window_minimized:
|
||||||
case wm_event::window_restored:
|
|
||||||
case wm_event::window_moved:
|
case wm_event::window_moved:
|
||||||
handled = true; //ignore these events as they do not alter client area
|
handled = true; //ignore these events as they do not alter client area
|
||||||
break;
|
break;
|
||||||
|
@ -2021,7 +2024,11 @@ void VKGSRender::do_local_task()
|
||||||
m_client_width != frame_width)
|
m_client_width != frame_width)
|
||||||
{
|
{
|
||||||
if (!!frame_width && !!frame_height)
|
if (!!frame_width && !!frame_height)
|
||||||
|
{
|
||||||
present_surface_dirty_flag = true;
|
present_surface_dirty_flag = true;
|
||||||
|
if (renderer_unavailable)
|
||||||
|
renderer_unavailable = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -2619,7 +2626,8 @@ void VKGSRender::reinitialize_swapchain()
|
||||||
if (!m_swap_chain->init_swapchain(new_width, new_height))
|
if (!m_swap_chain->init_swapchain(new_width, new_height))
|
||||||
{
|
{
|
||||||
LOG_WARNING(RSX, "Swapchain initialization failed. Request ignored [%dx%d]", new_width, new_height);
|
LOG_WARNING(RSX, "Swapchain initialization failed. Request ignored [%dx%d]", new_width, new_height);
|
||||||
present_surface_dirty_flag = false;
|
present_surface_dirty_flag = true;
|
||||||
|
renderer_unavailable = true;
|
||||||
open_command_buffer();
|
open_command_buffer();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2660,11 +2668,12 @@ void VKGSRender::reinitialize_swapchain()
|
||||||
open_command_buffer();
|
open_command_buffer();
|
||||||
|
|
||||||
present_surface_dirty_flag = false;
|
present_surface_dirty_flag = false;
|
||||||
|
renderer_unavailable = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VKGSRender::flip(int buffer)
|
void VKGSRender::flip(int buffer)
|
||||||
{
|
{
|
||||||
if (skip_frame)
|
if (skip_frame || renderer_unavailable)
|
||||||
{
|
{
|
||||||
m_frame->flip(m_context);
|
m_frame->flip(m_context);
|
||||||
rsx::thread::flip(buffer);
|
rsx::thread::flip(buffer);
|
||||||
|
@ -2715,6 +2724,9 @@ void VKGSRender::flip(int buffer)
|
||||||
reinitialize_swapchain();
|
reinitialize_swapchain();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (renderer_unavailable)
|
||||||
|
return;
|
||||||
|
|
||||||
u32 buffer_width = display_buffers[buffer].width;
|
u32 buffer_width = display_buffers[buffer].width;
|
||||||
u32 buffer_height = display_buffers[buffer].height;
|
u32 buffer_height = display_buffers[buffer].height;
|
||||||
u32 buffer_pitch = display_buffers[buffer].pitch;
|
u32 buffer_pitch = display_buffers[buffer].pitch;
|
||||||
|
@ -2896,6 +2908,9 @@ void VKGSRender::flip(int buffer)
|
||||||
|
|
||||||
bool VKGSRender::scaled_image_from_memory(rsx::blit_src_info& src, rsx::blit_dst_info& dst, bool interpolate)
|
bool VKGSRender::scaled_image_from_memory(rsx::blit_src_info& src, rsx::blit_dst_info& dst, bool interpolate)
|
||||||
{
|
{
|
||||||
|
if (renderer_unavailable)
|
||||||
|
return false;
|
||||||
|
|
||||||
auto result = m_texture_cache.blit(src, dst, interpolate, m_rtts, *m_current_command_buffer);
|
auto result = m_texture_cache.blit(src, dst, interpolate, m_rtts, *m_current_command_buffer);
|
||||||
m_current_command_buffer->begin();
|
m_current_command_buffer->begin();
|
||||||
|
|
||||||
|
|
|
@ -170,6 +170,7 @@ private:
|
||||||
std::unique_ptr<vk::framebuffer_holder> m_draw_fbo;
|
std::unique_ptr<vk::framebuffer_holder> m_draw_fbo;
|
||||||
|
|
||||||
bool present_surface_dirty_flag = false;
|
bool present_surface_dirty_flag = false;
|
||||||
|
bool renderer_unavailable = false;
|
||||||
|
|
||||||
u64 m_last_heap_sync_time = 0;
|
u64 m_last_heap_sync_time = 0;
|
||||||
vk::vk_data_heap m_attrib_ring_info;
|
vk::vk_data_heap m_attrib_ring_info;
|
||||||
|
|
Loading…
Reference in New Issue