renderer-gl: return RENDERER_LOST if GPU reset

Return WESTON_RENDERER_ERROR_LOST if GPU reset happened in function
gl_renderer_repaint_output() for further process

Signed-off-by: Trigger Huang <Trigger.Huang@amd.com>
This commit is contained in:
Trigger Huang 2026-04-24 12:15:01 +08:00
parent fcde9fc220
commit 8737e8e4d1

View file

@ -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;
}