diff --git a/cogl/cogl/cogl-onscreen.h b/cogl/cogl/cogl-onscreen.h index f22a8979e468c78b4069c207df94fb638ed7c3f9..33928d31ef7c2961f32b0090e6653ae18e60e737 100644 --- a/cogl/cogl/cogl-onscreen.h +++ b/cogl/cogl/cogl-onscreen.h @@ -45,8 +45,6 @@ G_BEGIN_DECLS -typedef struct _CoglScanout CoglScanout; - #define COGL_TYPE_ONSCREEN (cogl_onscreen_get_type ()) COGL_EXPORT G_DECLARE_DERIVABLE_TYPE (CoglOnscreen, cogl_onscreen, @@ -85,15 +83,6 @@ struct _CoglOnscreenClass int (* get_buffer_age) (CoglOnscreen *onscreen); }; -#define COGL_SCANOUT_ERROR (cogl_scanout_error_quark ()) -COGL_EXPORT GQuark -cogl_scanout_error_quark (void); - -typedef enum _CoglScanoutError -{ - COGL_SCANOUT_ERROR_INHIBITED, -} CoglScanoutError; - /** * cogl_onscreen_show: * @onscreen: The onscreen framebuffer to make visible diff --git a/cogl/cogl/cogl-types.h b/cogl/cogl/cogl-types.h index e46c948807c4e478283a76cb5d18959d796c2c56..30749da1c8bd37da1e4494587f85164a638cf3a0 100644 --- a/cogl/cogl/cogl-types.h +++ b/cogl/cogl/cogl-types.h @@ -425,4 +425,20 @@ typedef enum COGL_STEREO_RIGHT } CoglStereoMode; +typedef struct _CoglScanout CoglScanout; + +#define COGL_SCANOUT_ERROR (cogl_scanout_error_quark ()) + +/** + * CoglScanoutError: + * @COGL_SCANOUT_ERROR_INHIBITED: Scanout inhibited + */ +typedef enum _CoglScanoutError +{ + COGL_SCANOUT_ERROR_INHIBITED, +} CoglScanoutError; + +COGL_EXPORT GQuark +cogl_scanout_error_quark (void); + G_END_DECLS diff --git a/src/wayland/meta-wayland-buffer.c b/src/wayland/meta-wayland-buffer.c index 40386ad79ed982c926bf9e1c9cb827001390164a..be7039c2e2108485a33cf55e5d5ebd69322942b0 100644 --- a/src/wayland/meta-wayland-buffer.c +++ b/src/wayland/meta-wayland-buffer.c @@ -897,6 +897,16 @@ try_acquire_egl_image_scanout (MetaWaylandBuffer *buffer, #endif } +static void +scanout_destroyed (gpointer data, + GObject *where_the_object_was) +{ + MetaWaylandBuffer *buffer = data; + + meta_wayland_buffer_dec_use_count (buffer); + g_object_unref (buffer); +} + CoglScanout * meta_wayland_buffer_try_acquire_scanout (MetaWaylandBuffer *buffer, CoglOnscreen *onscreen) @@ -928,13 +938,7 @@ meta_wayland_buffer_try_acquire_scanout (MetaWaylandBuffer *buffer, break; case META_WAYLAND_BUFFER_TYPE_DMA_BUF: { - MetaWaylandDmaBufBuffer *dma_buf; - - dma_buf = meta_wayland_dma_buf_from_buffer (buffer); - if (!dma_buf) - return NULL; - - scanout = meta_wayland_dma_buf_try_acquire_scanout (dma_buf, onscreen); + scanout = meta_wayland_dma_buf_try_acquire_scanout (buffer, onscreen); break; } case META_WAYLAND_BUFFER_TYPE_UNKNOWN: @@ -942,9 +946,15 @@ meta_wayland_buffer_try_acquire_scanout (MetaWaylandBuffer *buffer, return NULL; } - if (scanout) - g_signal_connect (scanout, "scanout-failed", - G_CALLBACK (on_scanout_failed), buffer); + if (!scanout) + return NULL; + + g_signal_connect (scanout, "scanout-failed", + G_CALLBACK (on_scanout_failed), buffer); + + g_object_ref (buffer); + meta_wayland_buffer_inc_use_count (buffer); + g_object_weak_ref (G_OBJECT (scanout), scanout_destroyed, buffer); return scanout; } diff --git a/src/wayland/meta-wayland-dma-buf.c b/src/wayland/meta-wayland-dma-buf.c index f713c5968f7c94af47391eb8e04478e5e75e7d72..ef8c540be008359ef3dc854f7958948c6b9fb5ec 100644 --- a/src/wayland/meta-wayland-dma-buf.c +++ b/src/wayland/meta-wayland-dma-buf.c @@ -605,23 +605,32 @@ import_scanout_gbm_bo (MetaWaylandDmaBufBuffer *dma_buf, #endif CoglScanout * -meta_wayland_dma_buf_try_acquire_scanout (MetaWaylandDmaBufBuffer *dma_buf, - CoglOnscreen *onscreen) +meta_wayland_dma_buf_try_acquire_scanout (MetaWaylandBuffer *buffer, + CoglOnscreen *onscreen) { #ifdef HAVE_NATIVE_BACKEND - MetaContext *context = - meta_wayland_compositor_get_context (dma_buf->manager->compositor); - MetaBackend *backend = meta_context_get_backend (context); - MetaRenderer *renderer = meta_backend_get_renderer (backend); - MetaRendererNative *renderer_native = META_RENDERER_NATIVE (renderer); - int n_planes; + MetaWaylandDmaBufBuffer *dma_buf; + MetaContext *context; + MetaBackend *backend; + MetaRenderer *renderer; + MetaRendererNative *renderer_native; MetaDeviceFile *device_file; MetaGpuKms *gpu_kms; struct gbm_bo *gbm_bo; - gboolean use_modifier; + g_autoptr (MetaDrmBufferGbm) fb = NULL; g_autoptr (GError) error = NULL; MetaDrmBufferFlags flags; - g_autoptr (MetaDrmBufferGbm) fb = NULL; + gboolean use_modifier; + int n_planes; + + dma_buf = meta_wayland_dma_buf_from_buffer (buffer); + if (!dma_buf) + return NULL; + + context = meta_wayland_compositor_get_context (dma_buf->manager->compositor); + backend = meta_context_get_backend (context); + renderer = meta_backend_get_renderer (backend); + renderer_native = META_RENDERER_NATIVE (renderer); for (n_planes = 0; n_planes < META_WAYLAND_DMA_BUF_MAX_FDS; n_planes++) { diff --git a/src/wayland/meta-wayland-dma-buf.h b/src/wayland/meta-wayland-dma-buf.h index 1c03acb3283169651522bd7040fe23b6bf339c73..026e4837de1f7c82dcabb060b81c2f9e940685bb 100644 --- a/src/wayland/meta-wayland-dma-buf.h +++ b/src/wayland/meta-wayland-dma-buf.h @@ -64,5 +64,5 @@ meta_wayland_dma_buf_create_source (MetaWaylandBuffer *buffer, gpointer user_data); CoglScanout * -meta_wayland_dma_buf_try_acquire_scanout (MetaWaylandDmaBufBuffer *dma_buf, - CoglOnscreen *onscreen); +meta_wayland_dma_buf_try_acquire_scanout (MetaWaylandBuffer *buffer, + CoglOnscreen *onscreen); diff --git a/src/wayland/meta-wayland-surface.c b/src/wayland/meta-wayland-surface.c index d31791bb97057e7f36941ac8967d0efa7a00a981..213bccd64c36841a6b3ade35e2a96f0a29ef6482 100644 --- a/src/wayland/meta-wayland-surface.c +++ b/src/wayland/meta-wayland-surface.c @@ -2253,39 +2253,18 @@ meta_wayland_surface_get_buffer_height (MetaWaylandSurface *surface) return 0; } -static void -scanout_destroyed (gpointer data, - GObject *where_the_object_was) -{ - MetaWaylandBuffer *buffer = data; - - meta_wayland_buffer_dec_use_count (buffer); - g_object_unref (buffer); -} - CoglScanout * meta_wayland_surface_try_acquire_scanout (MetaWaylandSurface *surface, CoglOnscreen *onscreen) { - CoglScanout *scanout; - MetaWaylandBuffer *buffer; - if (!surface->buffer) return NULL; if (surface->buffer->use_count == 0) return NULL; - scanout = meta_wayland_buffer_try_acquire_scanout (surface->buffer, - onscreen); - if (!scanout) - return NULL; - - buffer = g_object_ref (surface->buffer); - meta_wayland_buffer_inc_use_count (buffer); - g_object_weak_ref (G_OBJECT (scanout), scanout_destroyed, buffer); - - return scanout; + return meta_wayland_buffer_try_acquire_scanout (surface->buffer, + onscreen); } MetaCrtc *