diff --git a/src/backends/native/meta-onscreen-native.c b/src/backends/native/meta-onscreen-native.c index 53388e3f64077b757740d971916260999951f970..eb49bd45c6efca0dde411b8a0499eca46c4df537 100644 --- a/src/backends/native/meta-onscreen-native.c +++ b/src/backends/native/meta-onscreen-native.c @@ -1071,6 +1071,15 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, update_secondary_gpu_state_post_swap_buffers (onscreen, &egl_context_changed); + /* + * 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); + power_save_mode = meta_monitor_manager_get_power_save_mode (monitor_manager); if (power_save_mode == META_POWER_SAVE_ON) { @@ -1089,15 +1098,6 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen, return; } - /* - * 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); - COGL_TRACE_BEGIN_SCOPED (MetaRendererNativePostKmsUpdate, "Onscreen (post pending update)"); kms_crtc = meta_crtc_kms_get_kms_crtc (META_CRTC_KMS (onscreen_native->crtc)); @@ -2040,57 +2040,15 @@ meta_onscreen_native_new (MetaRendererNative *renderer_native, return onscreen_native; } -static void -destroy_egl_surface (CoglOnscreen *onscreen) -{ - CoglOnscreenEgl *onscreen_egl = COGL_ONSCREEN_EGL (onscreen); - EGLSurface egl_surface; - - egl_surface = cogl_onscreen_egl_get_egl_surface (onscreen_egl); - if (cogl_onscreen_egl_get_egl_surface (onscreen_egl) != EGL_NO_SURFACE) - { - MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen); - MetaEgl *egl = meta_onscreen_native_get_egl (onscreen_native); - CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); - CoglContext *cogl_context = cogl_framebuffer_get_context (framebuffer); - CoglRenderer *cogl_renderer = cogl_context->display->renderer; - CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys; - - meta_egl_destroy_surface (egl, - cogl_renderer_egl->edpy, - egl_surface, - NULL); - cogl_onscreen_egl_set_egl_surface (onscreen_egl, EGL_NO_SURFACE); - } -} - static void meta_onscreen_native_dispose (GObject *object) { CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (object); CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer); CoglContext *cogl_context = cogl_framebuffer_get_context (framebuffer); - CoglDisplay *cogl_display = cogl_context_get_display (cogl_context); - CoglDisplayEGL *cogl_display_egl = cogl_display->winsys; - CoglOnscreenEgl *onscreen_egl = COGL_ONSCREEN_EGL (onscreen); MetaOnscreenNative *onscreen_native = META_ONSCREEN_NATIVE (onscreen); MetaRendererNative *renderer_native = onscreen_native->renderer_native; MetaRendererNativeGpuData *renderer_gpu_data; - EGLSurface egl_surface; - - G_OBJECT_CLASS (meta_onscreen_native_parent_class)->dispose (object); - - egl_surface = cogl_onscreen_egl_get_egl_surface (onscreen_egl); - if (egl_surface != EGL_NO_SURFACE && - (cogl_display_egl->current_draw_surface == egl_surface || - cogl_display_egl->current_read_surface == egl_surface)) - { - if (!_cogl_winsys_egl_make_current (cogl_display, - cogl_display_egl->dummy_surface, - cogl_display_egl->dummy_surface, - cogl_display_egl->egl_context)) - g_warning ("Failed to clear current context"); - } renderer_gpu_data = meta_renderer_native_get_gpu_data (renderer_native, @@ -2100,13 +2058,9 @@ meta_onscreen_native_dispose (GObject *object) case META_RENDERER_NATIVE_MODE_GBM: /* flip state takes a reference on the onscreen so there should * never be outstanding flips when we reach here. */ - g_return_if_fail (onscreen_native->gbm.next_fb == NULL); + g_warn_if_fail (onscreen_native->gbm.next_fb == NULL); free_current_bo (onscreen); - - destroy_egl_surface (onscreen); - - g_clear_pointer (&onscreen_native->gbm.surface, gbm_surface_destroy); break; case META_RENDERER_NATIVE_MODE_SURFACELESS: g_assert_not_reached (); @@ -2115,8 +2069,6 @@ meta_onscreen_native_dispose (GObject *object) case META_RENDERER_NATIVE_MODE_EGL_DEVICE: g_clear_object (&onscreen_native->egl.dumb_fb); - destroy_egl_surface (onscreen); - if (onscreen_native->egl.stream != EGL_NO_STREAM_KHR) { MetaEgl *egl = meta_onscreen_native_get_egl (onscreen_native); @@ -2133,6 +2085,9 @@ meta_onscreen_native_dispose (GObject *object) #endif /* HAVE_EGL_DEVICE */ } + G_OBJECT_CLASS (meta_onscreen_native_parent_class)->dispose (object); + + g_clear_pointer (&onscreen_native->gbm.surface, gbm_surface_destroy); g_clear_pointer (&onscreen_native->secondary_gpu_state, secondary_gpu_state_free); }