diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c index 61736799e..75fa71470 100644 --- a/libweston/renderer-gl/gl-renderer.c +++ b/libweston/renderer-gl/gl-renderer.c @@ -3080,6 +3080,37 @@ blit_shadow_to_output(struct weston_output *output, pixman_region32_fini(&translated_damage); } +static int +gl_renderer_check_reset(struct gl_renderer *gr) +{ + bool has_reset = false; + int i; + + if (!gl_features_has(gr, FEATURE_GRAPHICS_RESET_RECOVERY) || + !gr->get_graphics_reset_status) + return 0; + + /* Assume GPU reset should be finished within 5s. */ + for (i = 0; i < 100000; i++) { + GLenum status; + + status = gr->get_graphics_reset_status(); + if (status == GL_NO_ERROR) + break; + + has_reset = true; + usleep(50); + } + + if (!has_reset) + return 0; + + /* If GPU reset has not completed, nothing we can do. */ + assert(i < 100000); + + return -EAGAIN; +} + /* NOTE: We now allow falling back to ARGB gl visuals when XRGB is * unavailable, so we're assuming the background has no transparency * and that everything with a blend, like drop shadows, will have something @@ -3316,6 +3347,9 @@ gl_renderer_repaint_output(struct weston_output *output, gl_renderer_garbage_collect_programs(gr); + if (gl_renderer_check_reset(gr)) + return WESTON_RENDERER_ERROR_LOST; + out: return WESTON_RENDERER_ERROR_NONE; }