diff --git a/src/backends/native/meta-gpu-kms.c b/src/backends/native/meta-gpu-kms.c index 11951f557..8ee00344d 100644 --- a/src/backends/native/meta-gpu-kms.c +++ b/src/backends/native/meta-gpu-kms.c @@ -47,6 +47,12 @@ typedef struct _MetaKmsSource MetaGpuKms *gpu_kms; } MetaKmsSource; +typedef struct _MetaGpuKmsFlipClosureContainer +{ + GClosure *flip_closure; + MetaGpuKms *gpu_kms; +} MetaGpuKmsFlipClosureContainer; + struct _MetaGpuKms { MetaGpu parent; @@ -199,11 +205,26 @@ meta_gpu_kms_is_crtc_active (MetaGpuKms *gpu_kms, return TRUE; } -typedef struct _GpuClosureContainer +MetaGpuKmsFlipClosureContainer * +meta_gpu_kms_wrap_flip_closure (MetaGpuKms *gpu_kms, + GClosure *flip_closure) { - GClosure *flip_closure; - MetaGpuKms *gpu_kms; -} GpuClosureContainer; + MetaGpuKmsFlipClosureContainer *closure_container; + + closure_container = g_new0 (MetaGpuKmsFlipClosureContainer, 1); + *closure_container = (MetaGpuKmsFlipClosureContainer) { + .flip_closure = flip_closure, + .gpu_kms = gpu_kms + }; + + return closure_container; +} + +void +meta_gpu_kms_flip_closure_container_free (MetaGpuKmsFlipClosureContainer *closure_container) +{ + g_free (closure_container); +} gboolean meta_gpu_kms_flip_crtc (MetaGpuKms *gpu_kms, @@ -229,14 +250,11 @@ meta_gpu_kms_flip_crtc (MetaGpuKms *gpu_kms, if (!gpu_kms->page_flips_not_supported) { - GpuClosureContainer *closure_container; + MetaGpuKmsFlipClosureContainer *closure_container; int kms_fd = meta_gpu_kms_get_fd (gpu_kms); - closure_container = g_new0 (GpuClosureContainer, 1); - *closure_container = (GpuClosureContainer) { - .flip_closure = flip_closure, - .gpu_kms = gpu_kms - }; + closure_container = meta_gpu_kms_wrap_flip_closure (gpu_kms, + flip_closure); ret = drmModePageFlip (kms_fd, crtc->crtc_id, @@ -245,7 +263,7 @@ meta_gpu_kms_flip_crtc (MetaGpuKms *gpu_kms, closure_container); if (ret != 0 && ret != -EACCES) { - g_free (closure_container); + meta_gpu_kms_flip_closure_container_free (closure_container); g_warning ("Failed to flip: %s", strerror (-ret)); gpu_kms->page_flips_not_supported = TRUE; } @@ -276,12 +294,12 @@ page_flip_handler (int fd, unsigned int usec, void *user_data) { - GpuClosureContainer *closure_container = user_data; + MetaGpuKmsFlipClosureContainer *closure_container = user_data; GClosure *flip_closure = closure_container->flip_closure; MetaGpuKms *gpu_kms = closure_container->gpu_kms; invoke_flip_closure (flip_closure, gpu_kms); - g_free (closure_container); + meta_gpu_kms_flip_closure_container_free (closure_container); } gboolean diff --git a/src/backends/native/meta-gpu-kms.h b/src/backends/native/meta-gpu-kms.h index 6c7d5a312..ef1f17ce8 100644 --- a/src/backends/native/meta-gpu-kms.h +++ b/src/backends/native/meta-gpu-kms.h @@ -32,6 +32,8 @@ #define META_TYPE_GPU_KMS (meta_gpu_kms_get_type ()) G_DECLARE_FINAL_TYPE (MetaGpuKms, meta_gpu_kms, META, GPU_KMS, MetaGpu) +typedef struct _MetaGpuKmsFlipClosureContainer MetaGpuKmsFlipClosureContainer; + typedef struct _MetaKmsResources { drmModeRes *resources; @@ -84,4 +86,9 @@ gboolean meta_drm_mode_equal (const drmModeModeInfo *one, float meta_calculate_drm_mode_refresh_rate (const drmModeModeInfo *mode); +MetaGpuKmsFlipClosureContainer * meta_gpu_kms_wrap_flip_closure (MetaGpuKms *gpu_kms, + GClosure *flip_closure); + +void meta_gpu_kms_flip_closure_container_free (MetaGpuKmsFlipClosureContainer *closure_container); + #endif /* META_GPU_KMS_H */ diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c index cb8e03abe..772ce07f1 100644 --- a/src/backends/native/meta-renderer-native.c +++ b/src/backends/native/meta-renderer-native.c @@ -1271,6 +1271,7 @@ flip_egl_stream (MetaOnscreenNative *onscreen_native, MetaRendererNativeGpuData *renderer_gpu_data; EGLDisplay *egl_display; MetaEgl *egl = meta_onscreen_native_get_egl (onscreen_native); + MetaGpuKmsFlipClosureContainer *closure_container; EGLAttrib *acquire_attribs; GError *error = NULL; @@ -1280,9 +1281,12 @@ flip_egl_stream (MetaOnscreenNative *onscreen_native, if (renderer_gpu_data->egl.no_egl_output_drm_flip_event) return FALSE; + closure_container = + meta_gpu_kms_wrap_flip_closure (onscreen_native->render_gpu, flip_closure); + acquire_attribs = (EGLAttrib[]) { EGL_DRM_FLIP_EVENT_DATA_NV, - (EGLAttrib) flip_closure, + (EGLAttrib) closure_container, EGL_NONE }; @@ -1301,6 +1305,7 @@ flip_egl_stream (MetaOnscreenNative *onscreen_native, renderer_gpu_data->egl.no_egl_output_drm_flip_event = TRUE; } g_error_free (error); + meta_gpu_kms_flip_closure_container_free (closure_container); return FALSE; }