1
0
Fork 0

Compare commits

...

8 commits

Author SHA1 Message Date
Daniel van Vugt
d18752b3b2
onscreen/native: Return GErrors from secondary GPU updates
And return early from `swap_buffers_with_damage` if the error would have
led to flipping a NULL buffer.

This is also the perfect time to remove the `egl_context_changed` parameter
and move `_cogl_winsys_egl_ensure_current` closer to the code that actually
needs it.

Related: https://bugs.launchpad.net/bugs/2069565
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3817>
Signed-off-by: Mingi Sung <sungmg@saltyming.net>
2024-09-14 11:26:06 +09:00
Daniel van Vugt
25416e3f5b
onscreen/native: Set frame result to IDLE on swap failure
So that swap failure messages are not also followed by:

meta_stage_native_redraw_view: runtime check failed: (!META_IS_CRTC_KMS (crtc))

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3817>
Signed-off-by: Mingi Sung <sungmg@saltyming.net>
2024-09-14 11:26:06 +09:00
Daniel van Vugt
c1dc75704c
onscreen/native: Unify the failure paths of swap_buffers_with_damage
They're both the same and a third one will be added soon.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3817>
Signed-off-by: Mingi Sung <sungmg@saltyming.net>
2024-09-14 11:26:06 +09:00
Daniel van Vugt
40203436a6
onscreen/native: Squash adjacent switch statements
Because we can. And it's now clearer that `buffer` is only used in
`META_RENDERER_NATIVE_MODE_GBM`.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3891>
Signed-off-by: Mingi Sung <sungmg@saltyming.net>
2024-09-14 11:25:27 +09:00
Daniel van Vugt
1c938c80c4
onscreen/native: Move next_frame storage to later in the function
It won't be used until later when we flip, and in fact assigning
it early could have led to its own assertion failing on the next frame
in the unlikely event that we return with "Failed to ensure KMS FB ID...

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3891>
Signed-off-by: Mingi Sung <sungmg@saltyming.net>
2024-09-14 11:24:51 +09:00
Daniel van Vugt
7c22a88c97
onscreen/native: Return the framebuffer by result, not parameters
`update_secondary_gpu_state_post_swap_buffers` decides what our front
buffer object will be. There is only one answer. So return it as the
function result instead of making the caller figure it out.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3830>
Signed-off-by: Mingi Sung <sungmg@saltyming.net>
2024-09-14 11:24:20 +09:00
Daniel van Vugt
247e70d9e2
onscreen/native: Remove frame parameter from flip_crtc
It's always equal to `onscreen_native->next_frame` and we can't eliminate
that copy so easily. Removing the parameter removes all ambiguity about
where the next frame will come from.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3829>
Signed-off-by: Mingi Sung <sungmg@saltyming.net>
2024-09-14 11:24:02 +09:00
Jonas Ådahl
ea64b55916
onscreen/native: Track next and presenting buffers via ClutterFrame
Let the ClutterFrame (or rather MetaFrameNative) own both the scanout
object and the framebuffer object, and let the frame itself live for as
long as it's needed. This allows to place fields that is related to a
single frame together, aiming to help reasoning about the lifetime of
the fields that were previously directly stored in MetaOnscreenNative.

Also take the opportunity to rename "current" to "presenting", to make
it clearer that frame's buffer is what is currently presenting to the
user.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3799>
Signed-off-by: Mingi Sung <sungmg@saltyming.net>
2024-09-14 11:12:11 +09:00
3 changed files with 164 additions and 149 deletions

View file

@ -27,6 +27,9 @@ struct _MetaFrameNative
{
ClutterFrame base;
MetaDrmBuffer *buffer;
CoglScanout *scanout;
MetaKmsUpdate *kms_update;
};
@ -35,6 +38,9 @@ meta_frame_native_release (ClutterFrame *frame)
{
MetaFrameNative *frame_native = meta_frame_native_from_frame (frame);
g_clear_object (&frame_native->buffer);
g_clear_object (&frame_native->scanout);
g_return_if_fail (!frame_native->kms_update);
}
@ -76,3 +82,29 @@ meta_frame_native_has_kms_update (MetaFrameNative *frame_native)
{
return !!frame_native->kms_update;
}
void
meta_frame_native_set_buffer (MetaFrameNative *frame_native,
MetaDrmBuffer *buffer)
{
g_set_object (&frame_native->buffer, buffer);
}
MetaDrmBuffer *
meta_frame_native_get_buffer (MetaFrameNative *frame_native)
{
return frame_native->buffer;
}
void
meta_frame_native_set_scanout (MetaFrameNative *frame_native,
CoglScanout *scanout)
{
g_set_object (&frame_native->scanout, scanout);
}
CoglScanout *
meta_frame_native_get_scanout (MetaFrameNative *frame_native)
{
return frame_native->scanout;
}

View file

@ -17,6 +17,7 @@
#pragma once
#include "backends/native/meta-backend-native-types.h"
#include "backends/native/meta-kms-types.h"
#include "clutter/clutter.h"
#include "core/util-private.h"
@ -36,3 +37,13 @@ MetaKmsUpdate * meta_frame_native_steal_kms_update (MetaFrameNative *frame_nativ
META_EXPORT_TEST
gboolean meta_frame_native_has_kms_update (MetaFrameNative *frame_native);
void meta_frame_native_set_buffer (MetaFrameNative *frame_native,
MetaDrmBuffer *buffer);
MetaDrmBuffer * meta_frame_native_get_buffer (MetaFrameNative *frame_native);
void meta_frame_native_set_scanout (MetaFrameNative *frame_native,
CoglScanout *scanout);
CoglScanout * meta_frame_native_get_scanout (MetaFrameNative *frame_native);

View file

@ -102,12 +102,11 @@ struct _MetaOnscreenNative
MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state;
ClutterFrame *presented_frame;
ClutterFrame *next_frame;
struct {
struct gbm_surface *surface;
MetaDrmBuffer *current_fb;
MetaDrmBuffer *next_fb;
CoglScanout *current_scanout;
CoglScanout *next_scanout;
} gbm;
#ifdef HAVE_EGL_DEVICE
@ -144,30 +143,17 @@ init_secondary_gpu_state (MetaRendererNative *renderer_native,
CoglOnscreen *onscreen,
GError **error);
static void
free_current_bo (CoglOnscreen *onscreen)
{
MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen);
g_clear_object (&onscreen_native->gbm.current_fb);
g_clear_object (&onscreen_native->gbm.current_scanout);
}
static void
meta_onscreen_native_swap_drm_fb (CoglOnscreen *onscreen)
{
MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen);
if (!onscreen_native->gbm.next_fb)
if (!onscreen_native->next_frame)
return;
free_current_bo (onscreen);
g_set_object (&onscreen_native->gbm.current_fb, onscreen_native->gbm.next_fb);
g_clear_object (&onscreen_native->gbm.next_fb);
g_set_object (&onscreen_native->gbm.current_scanout,
onscreen_native->gbm.next_scanout);
g_clear_object (&onscreen_native->gbm.next_scanout);
g_clear_pointer (&onscreen_native->presented_frame, clutter_frame_unref);
onscreen_native->presented_frame =
g_steal_pointer (&onscreen_native->next_frame);
}
static void
@ -175,8 +161,7 @@ meta_onscreen_native_clear_next_fb (CoglOnscreen *onscreen)
{
MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen);
g_clear_object (&onscreen_native->gbm.next_fb);
g_clear_object (&onscreen_native->gbm.next_scanout);
g_clear_pointer (&onscreen_native->next_frame, clutter_frame_unref);
}
static void
@ -311,7 +296,7 @@ page_flip_feedback_ready (MetaKmsCrtc *kms_crtc,
frame_info = cogl_onscreen_peek_head_frame_info (onscreen);
frame_info->flags |= COGL_FRAME_INFO_FLAG_SYMBOLIC;
g_warn_if_fail (!onscreen_native->gbm.next_fb);
g_warn_if_fail (!onscreen_native->next_frame);
meta_onscreen_native_notify_frame_complete (onscreen);
}
@ -528,12 +513,15 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
{
MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen);
MetaRendererNative *renderer_native = onscreen_native->renderer_native;
ClutterFrame *frame = onscreen_native->next_frame;
MetaFrameNative *frame_native;
MetaGpuKms *render_gpu = onscreen_native->render_gpu;
MetaCrtcKms *crtc_kms = META_CRTC_KMS (crtc);
MetaKmsCrtc *kms_crtc = meta_crtc_kms_get_kms_crtc (crtc_kms);
MetaRendererNativeGpuData *renderer_gpu_data;
MetaGpuKms *gpu_kms;
MetaDrmBuffer *buffer;
CoglScanout *scanout;
MetaKmsPlaneAssignment *plane_assignment;
graphene_rect_t src_rect;
MtkRectangle dst_rect;
@ -541,6 +529,8 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
COGL_TRACE_BEGIN_SCOPED (MetaOnscreenNativeFlipCrtcs,
"Meta::OnscreenNative::flip_crtc()");
g_return_if_fail (frame);
gpu_kms = META_GPU_KMS (meta_crtc_get_gpu (crtc));
g_assert (meta_gpu_kms_is_crtc_active (gpu_kms, crtc));
@ -550,14 +540,14 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
switch (renderer_gpu_data->mode)
{
case META_RENDERER_NATIVE_MODE_GBM:
buffer = onscreen_native->gbm.next_fb;
frame_native = meta_frame_native_from_frame (frame);
buffer = meta_frame_native_get_buffer (frame_native);
scanout = meta_frame_native_get_scanout (frame_native);
if (onscreen_native->gbm.next_scanout)
if (scanout)
{
cogl_scanout_get_src_rect (onscreen_native->gbm.next_scanout,
&src_rect);
cogl_scanout_get_dst_rect (onscreen_native->gbm.next_scanout,
&dst_rect);
cogl_scanout_get_src_rect (scanout, &src_rect);
cogl_scanout_get_dst_rect (scanout, &dst_rect);
}
else
{
@ -848,22 +838,24 @@ import_shared_framebuffer (CoglOnscreen *onscreen,
}
static MetaDrmBuffer *
copy_shared_framebuffer_gpu (CoglOnscreen *onscreen,
MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state,
MetaRendererNativeGpuData *renderer_gpu_data,
gboolean *egl_context_changed,
MetaDrmBuffer *primary_gpu_fb)
copy_shared_framebuffer_gpu (CoglOnscreen *onscreen,
MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state,
MetaRendererNativeGpuData *renderer_gpu_data,
MetaDrmBuffer *primary_gpu_fb,
GError **error)
{
MetaRendererNative *renderer_native = renderer_gpu_data->renderer_native;
MetaEgl *egl = meta_renderer_native_get_egl (renderer_native);
MetaGles3 *gles3 = meta_renderer_native_get_gles3 (renderer_native);
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *cogl_context = cogl_framebuffer_get_context (framebuffer);
CoglDisplay *cogl_display = cogl_context_get_display (cogl_context);
MetaRenderDevice *render_device;
EGLDisplay egl_display;
GError *error = NULL;
gboolean use_modifiers;
MetaDeviceFile *device_file;
MetaDrmBufferFlags flags;
MetaDrmBufferGbm *buffer_gbm;
MetaDrmBufferGbm *buffer_gbm = NULL;
struct gbm_bo *bo;
COGL_TRACE_BEGIN_SCOPED (CopySharedFramebufferSecondaryGpu,
@ -880,16 +872,12 @@ copy_shared_framebuffer_gpu (CoglOnscreen *onscreen,
secondary_gpu_state->egl_surface,
secondary_gpu_state->egl_surface,
renderer_gpu_data->secondary.egl_context,
&error))
error))
{
g_warning ("Failed to make current: %s", error->message);
g_error_free (error);
return NULL;
g_prefix_error (error, "Failed to make current: ");
goto done;
}
*egl_context_changed = TRUE;
buffer_gbm = META_DRM_BUFFER_GBM (primary_gpu_fb);
bo = meta_drm_buffer_gbm_get_bo (buffer_gbm);
if (!meta_renderer_native_gles3_blit_shared_bo (egl,
@ -898,21 +886,19 @@ copy_shared_framebuffer_gpu (CoglOnscreen *onscreen,
renderer_gpu_data->secondary.egl_context,
secondary_gpu_state->egl_surface,
bo,
&error))
error))
{
g_warning ("Failed to blit shared framebuffer: %s", error->message);
g_error_free (error);
return NULL;
g_prefix_error (error, "Failed to blit shared framebuffer: ");
goto done;
}
if (!meta_egl_swap_buffers (egl,
egl_display,
secondary_gpu_state->egl_surface,
&error))
error))
{
g_warning ("Failed to swap buffers: %s", error->message);
g_error_free (error);
return NULL;
g_prefix_error (error, "Failed to swap buffers: ");
goto done;
}
use_modifiers = meta_renderer_native_use_modifiers (renderer_native);
@ -926,13 +912,11 @@ copy_shared_framebuffer_gpu (CoglOnscreen *onscreen,
meta_drm_buffer_gbm_new_lock_front (device_file,
secondary_gpu_state->gbm.surface,
flags,
&error);
error);
if (!buffer_gbm)
{
g_warning ("meta_drm_buffer_gbm_new_lock_front failed: %s",
error->message);
g_error_free (error);
return NULL;
g_prefix_error (error, "meta_drm_buffer_gbm_new_lock_front failed: ");
goto done;
}
g_object_set_qdata_full (G_OBJECT (buffer_gbm),
@ -940,7 +924,10 @@ copy_shared_framebuffer_gpu (CoglOnscreen *onscreen,
g_object_ref (primary_gpu_fb),
g_object_unref);
return META_DRM_BUFFER (buffer_gbm);
done:
_cogl_winsys_egl_ensure_current (cogl_display);
return buffer_gbm ? META_DRM_BUFFER (buffer_gbm) : NULL;
}
static MetaDrmBufferDumb *
@ -1192,56 +1179,54 @@ update_secondary_gpu_state_pre_swap_buffers (CoglOnscreen *onscreen,
return copy;
}
static void
update_secondary_gpu_state_post_swap_buffers (CoglOnscreen *onscreen,
gboolean *egl_context_changed,
MetaDrmBuffer *primary_gpu_fb,
MetaDrmBuffer **secondary_gpu_fb)
static MetaDrmBuffer *
acquire_front_buffer (CoglOnscreen *onscreen,
MetaDrmBuffer *primary_gpu_fb,
MetaDrmBuffer *secondary_gpu_fb,
GError **error)
{
MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen);
MetaRendererNative *renderer_native = onscreen_native->renderer_native;
MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state;
MetaRendererNativeGpuData *renderer_gpu_data;
MetaDrmBuffer *imported_fb;
COGL_TRACE_BEGIN_SCOPED (MetaRendererNativeGpuStatePostSwapBuffers,
"update_secondary_gpu_state_post_swap_buffers()");
"acquire_front_buffer()");
secondary_gpu_state = onscreen_native->secondary_gpu_state;
if (secondary_gpu_state)
{
MetaRendererNativeGpuData *renderer_gpu_data;
g_autoptr (MetaDrmBuffer) next_fb = NULL;
if (!secondary_gpu_state)
return g_object_ref (primary_gpu_fb);
renderer_gpu_data =
meta_renderer_native_get_gpu_data (renderer_native,
secondary_gpu_state->gpu_kms);
switch (renderer_gpu_data->secondary.copy_mode)
{
case META_SHARED_FRAMEBUFFER_COPY_MODE_ZERO:
next_fb = import_shared_framebuffer (onscreen,
renderer_gpu_data =
meta_renderer_native_get_gpu_data (renderer_native,
secondary_gpu_state->gpu_kms);
switch (renderer_gpu_data->secondary.copy_mode)
{
case META_SHARED_FRAMEBUFFER_COPY_MODE_ZERO:
imported_fb = import_shared_framebuffer (onscreen,
secondary_gpu_state,
primary_gpu_fb);
if (next_fb)
break;
/* The fallback was prepared in pre_swap_buffers and is currently
* in secondary_gpu_fb.
*/
renderer_gpu_data->secondary.copy_mode =
META_SHARED_FRAMEBUFFER_COPY_MODE_PRIMARY;
G_GNUC_FALLTHROUGH;
case META_SHARED_FRAMEBUFFER_COPY_MODE_PRIMARY:
next_fb = g_object_ref (*secondary_gpu_fb);
break;
case META_SHARED_FRAMEBUFFER_COPY_MODE_SECONDARY_GPU:
next_fb = copy_shared_framebuffer_gpu (onscreen,
secondary_gpu_state,
renderer_gpu_data,
egl_context_changed,
primary_gpu_fb);
break;
}
g_set_object (secondary_gpu_fb, next_fb);
if (imported_fb)
return imported_fb;
/* The fallback was prepared in pre_swap_buffers and is currently
* in secondary_gpu_fb.
*/
renderer_gpu_data->secondary.copy_mode =
META_SHARED_FRAMEBUFFER_COPY_MODE_PRIMARY;
G_GNUC_FALLTHROUGH;
case META_SHARED_FRAMEBUFFER_COPY_MODE_PRIMARY:
return g_object_ref (secondary_gpu_fb);
case META_SHARED_FRAMEBUFFER_COPY_MODE_SECONDARY_GPU:
return copy_shared_framebuffer_gpu (onscreen,
secondary_gpu_state,
renderer_gpu_data,
primary_gpu_fb,
error);
}
g_assert_not_reached ();
return NULL;
}
static void
@ -1303,7 +1288,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
{
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *cogl_context = cogl_framebuffer_get_context (framebuffer);
CoglDisplay *cogl_display = cogl_context_get_display (cogl_context);
CoglRenderer *cogl_renderer = cogl_context->display->renderer;
CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys;
MetaRendererNativeGpuData *renderer_gpu_data = cogl_renderer_egl->platform;
@ -1321,15 +1305,16 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
MetaKmsUpdate *kms_update;
CoglOnscreenClass *parent_class;
gboolean create_timestamp_query = TRUE;
gboolean egl_context_changed = FALSE;
MetaPowerSave power_save_mode;
g_autoptr (GError) error = NULL;
MetaDrmBufferFlags buffer_flags;
MetaDrmBufferGbm *buffer_gbm;
g_autoptr (MetaDrmBuffer) primary_gpu_fb = NULL;
g_autoptr (MetaDrmBuffer) secondary_gpu_fb = NULL;
g_autoptr (MetaDrmBuffer) buffer = NULL;
MetaKmsCrtc *kms_crtc;
MetaKmsDevice *kms_device;
COGL_TRACE_SCOPED_ANCHOR (MetaRendererNativePostKmsUpdate);
COGL_TRACE_BEGIN_SCOPED (MetaRendererNativeSwapBuffers,
"Meta::OnscreenNative::swap_buffers_with_damage()");
@ -1383,46 +1368,28 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
g_warning ("Failed to lock front buffer on %s: %s",
meta_device_file_get_path (render_device_file),
error->message);
frame_info->flags |= COGL_FRAME_INFO_FLAG_SYMBOLIC;
meta_onscreen_native_notify_frame_complete (onscreen);
return;
goto swap_failed;
}
primary_gpu_fb = META_DRM_BUFFER (g_steal_pointer (&buffer_gbm));
break;
case META_RENDERER_NATIVE_MODE_SURFACELESS:
g_assert_not_reached ();
break;
#ifdef HAVE_EGL_DEVICE
case META_RENDERER_NATIVE_MODE_EGL_DEVICE:
break;
#endif
}
buffer = acquire_front_buffer (onscreen,
primary_gpu_fb,
secondary_gpu_fb,
&error);
if (buffer == NULL)
{
g_warning ("Failed to acquire front buffer: %s", error->message);
goto swap_failed;
}
update_secondary_gpu_state_post_swap_buffers (onscreen,
&egl_context_changed,
primary_gpu_fb,
&secondary_gpu_fb);
meta_frame_native_set_buffer (frame_native, buffer);
switch (renderer_gpu_data->mode)
{
case META_RENDERER_NATIVE_MODE_GBM:
g_warn_if_fail (onscreen_native->gbm.next_fb == NULL);
if (onscreen_native->secondary_gpu_state)
g_set_object (&onscreen_native->gbm.next_fb, secondary_gpu_fb);
else
g_set_object (&onscreen_native->gbm.next_fb, primary_gpu_fb);
if (!meta_drm_buffer_ensure_fb_id (onscreen_native->gbm.next_fb, &error))
if (!meta_drm_buffer_ensure_fb_id (buffer, &error))
{
g_warning ("Failed to ensure KMS FB ID on %s: %s",
meta_device_file_get_path (render_device_file),
error->message);
frame_info->flags |= COGL_FRAME_INFO_FLAG_SYMBOLIC;
meta_onscreen_native_notify_frame_complete (onscreen);
return;
goto swap_failed;
}
break;
case META_RENDERER_NATIVE_MODE_SURFACELESS:
@ -1433,14 +1400,8 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
#endif
}
/*
* If we changed EGL context, cogl will have the wrong idea about what is
* current, making it fail to set it when it needs to. Avoid that by making
* EGL_NO_CONTEXT current now, making cogl eventually set the correct
* context.
*/
if (egl_context_changed)
_cogl_winsys_egl_ensure_current (cogl_display);
g_warn_if_fail (!onscreen_native->next_frame);
onscreen_native->next_frame = clutter_frame_ref (frame);
kms_crtc = meta_crtc_kms_get_kms_crtc (META_CRTC_KMS (onscreen_native->crtc));
kms_device = meta_kms_crtc_get_device (kms_crtc);
@ -1474,8 +1435,8 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
return;
}
COGL_TRACE_BEGIN_SCOPED (MetaRendererNativePostKmsUpdate,
"Meta::OnscreenNative::swap_buffers_with_damage#post_pending_update()");
COGL_TRACE_BEGIN_ANCHORED (MetaRendererNativePostKmsUpdate,
"Meta::OnscreenNative::swap_buffers_with_damage#post_pending_update()");
switch (renderer_gpu_data->mode)
{
@ -1539,6 +1500,12 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
meta_kms_device_post_update (kms_device, kms_update,
META_KMS_UPDATE_FLAG_NONE);
clutter_frame_set_result (frame, CLUTTER_FRAME_RESULT_PENDING_PRESENTED);
return;
swap_failed:
frame_info->flags |= COGL_FRAME_INFO_FLAG_SYMBOLIC;
meta_onscreen_native_notify_frame_complete (onscreen);
clutter_frame_set_result (frame, CLUTTER_FRAME_RESULT_IDLE);
}
gboolean
@ -1606,11 +1573,15 @@ scanout_result_feedback (const MetaKmsFeedback *kms_feedback,
G_IO_ERROR_PERMISSION_DENIED))
{
ClutterStageView *view = CLUTTER_STAGE_VIEW (onscreen_native->view);
ClutterFrame *next_frame = onscreen_native->next_frame;
MetaFrameNative *next_frame_native =
meta_frame_native_from_frame (next_frame);
CoglScanout *scanout =
meta_frame_native_get_scanout (next_frame_native);
g_warning ("Direct scanout page flip failed: %s", error->message);
cogl_scanout_notify_failed (onscreen_native->gbm.next_scanout,
onscreen);
cogl_scanout_notify_failed (scanout, onscreen);
clutter_stage_view_add_redraw_clip (view, NULL);
clutter_stage_view_schedule_update_now (view);
}
@ -1675,12 +1646,13 @@ meta_onscreen_native_direct_scanout (CoglOnscreen *onscreen,
render_gpu);
g_warn_if_fail (renderer_gpu_data->mode == META_RENDERER_NATIVE_MODE_GBM);
g_warn_if_fail (!onscreen_native->gbm.next_fb);
g_warn_if_fail (!onscreen_native->gbm.next_scanout);
g_set_object (&onscreen_native->gbm.next_scanout, scanout);
g_set_object (&onscreen_native->gbm.next_fb,
META_DRM_BUFFER (cogl_scanout_get_buffer (scanout)));
g_warn_if_fail (!onscreen_native->next_frame);
onscreen_native->next_frame = clutter_frame_ref (frame);
meta_frame_native_set_scanout (frame_native, scanout);
meta_frame_native_set_buffer (frame_native,
META_DRM_BUFFER (cogl_scanout_get_buffer (scanout)));
frame_info->cpu_time_before_buffer_swap_us = g_get_monotonic_time ();
@ -2865,15 +2837,15 @@ meta_onscreen_native_dispose (GObject *object)
meta_onscreen_native_detach (onscreen_native);
g_clear_pointer (&onscreen_native->next_frame, clutter_frame_unref);
g_clear_pointer (&onscreen_native->presented_frame, clutter_frame_unref);
renderer_gpu_data =
meta_renderer_native_get_gpu_data (renderer_native,
onscreen_native->render_gpu);
switch (renderer_gpu_data->mode)
{
case META_RENDERER_NATIVE_MODE_GBM:
g_clear_object (&onscreen_native->gbm.next_fb);
g_clear_object (&onscreen_native->gbm.next_scanout);
free_current_bo (onscreen);
break;
case META_RENDERER_NATIVE_MODE_SURFACELESS:
g_assert_not_reached ();