MetaRendererNative: Properly handle EGLOutput acquire errors
Whenever an EGLOutput consumer is temporary unable to handle eglStreamConsumerAcquire() operations (e.g. during a VT-switch), an EGL_RESOURCE_BUSY_EXT error is generated. This change adds the appropriate error handling to flip_egl_stream() in order to recover from such errors. https://bugzilla.gnome.org/show_bug.cgi?id=779112
This commit is contained in:
parent
58043cbc8b
commit
4fdc551209
@ -520,7 +520,7 @@ flip_closure_destroyed (MetaRendererView *view)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_EGL_DEVICE
|
#ifdef HAVE_EGL_DEVICE
|
||||||
static void
|
static gboolean
|
||||||
flip_egl_stream (MetaRendererNative *renderer_native,
|
flip_egl_stream (MetaRendererNative *renderer_native,
|
||||||
MetaOnscreenNative *onscreen_native,
|
MetaOnscreenNative *onscreen_native,
|
||||||
GClosure *flip_closure)
|
GClosure *flip_closure)
|
||||||
@ -536,29 +536,34 @@ flip_egl_stream (MetaRendererNative *renderer_native,
|
|||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
|
|
||||||
if (renderer_native->egl.no_egl_output_drm_flip_event)
|
if (renderer_native->egl.no_egl_output_drm_flip_event)
|
||||||
return;
|
return FALSE;
|
||||||
|
|
||||||
acquire_attribs = (EGLAttrib[]) {
|
acquire_attribs = (EGLAttrib[]) {
|
||||||
EGL_DRM_FLIP_EVENT_DATA_NV,
|
EGL_DRM_FLIP_EVENT_DATA_NV,
|
||||||
(EGLAttrib) flip_closure,
|
(EGLAttrib) flip_closure,
|
||||||
EGL_NONE
|
EGL_NONE
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!meta_egl_stream_consumer_acquire_attrib (egl,
|
if (!meta_egl_stream_consumer_acquire_attrib (egl,
|
||||||
egl_renderer->edpy,
|
egl_renderer->edpy,
|
||||||
onscreen_native->egl.stream,
|
onscreen_native->egl.stream,
|
||||||
acquire_attribs,
|
acquire_attribs,
|
||||||
&error))
|
&error))
|
||||||
{
|
{
|
||||||
g_warning ("Failed to flip EGL stream (%s), relying on clock from now on",
|
if (error->domain != META_EGL_ERROR ||
|
||||||
error->message);
|
error->code != EGL_RESOURCE_BUSY_EXT)
|
||||||
g_error_free (error);
|
{
|
||||||
|
g_warning ("Failed to flip EGL stream (%s), relying on clock from "
|
||||||
|
"now on", error->message);
|
||||||
renderer_native->egl.no_egl_output_drm_flip_event = TRUE;
|
renderer_native->egl.no_egl_output_drm_flip_event = TRUE;
|
||||||
return;
|
}
|
||||||
|
g_error_free (error);
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_closure_ref (flip_closure);
|
g_closure_ref (flip_closure);
|
||||||
|
|
||||||
return;
|
return TRUE;
|
||||||
}
|
}
|
||||||
#endif /* HAVE_EGL_DEVICE */
|
#endif /* HAVE_EGL_DEVICE */
|
||||||
|
|
||||||
@ -598,7 +603,9 @@ meta_onscreen_native_flip_crtc (MetaOnscreenNative *onscreen_native,
|
|||||||
break;
|
break;
|
||||||
#ifdef HAVE_EGL_DEVICE
|
#ifdef HAVE_EGL_DEVICE
|
||||||
case META_RENDERER_NATIVE_MODE_EGL_DEVICE:
|
case META_RENDERER_NATIVE_MODE_EGL_DEVICE:
|
||||||
flip_egl_stream (renderer_native, onscreen_native, flip_closure);
|
if (flip_egl_stream (renderer_native,
|
||||||
|
onscreen_native,
|
||||||
|
flip_closure))
|
||||||
onscreen_native->pending_flips++;
|
onscreen_native->pending_flips++;
|
||||||
*fb_in_use = TRUE;
|
*fb_in_use = TRUE;
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user