Skip to content

Commit 613c4a0

Browse files
committed
drm-buffer/gbm: Support both surface and standalone buffers
Surface buffers are created with meta_drm_buffer_new_acquire(), taking a gbm_surface acquiring the gbm itself, and meta_drm_buffer_new_take() that takes over ownership of a passed gbm_bo. Original Mutter commit: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/798/diffs?commit_id=282aada13a5d744dd29eedf3255b6a9f6d0e370c
1 parent 1770bba commit 613c4a0

File tree

3 files changed

+69
-32
lines changed

3 files changed

+69
-32
lines changed

src/backends/native/meta-drm-buffer-gbm.c

Lines changed: 53 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -53,22 +53,12 @@ meta_drm_buffer_gbm_get_bo (MetaDrmBufferGbm *buffer_gbm)
5353
}
5454

5555
static gboolean
56-
acquire_swapped_buffer (MetaDrmBufferGbm *buffer_gbm,
57-
gboolean use_modifiers,
58-
GError **error)
56+
init_fb_id (MetaDrmBufferGbm *buffer_gbm,
57+
struct gbm_bo *bo,
58+
gboolean use_modifiers,
59+
GError **error)
5960
{
6061
MetaGpuKmsFBArgs fb_args = { 0, };
61-
struct gbm_bo *bo;
62-
63-
bo = gbm_surface_lock_front_buffer (buffer_gbm->surface);
64-
if (!bo)
65-
{
66-
g_set_error (error,
67-
G_IO_ERROR,
68-
G_IO_ERROR_FAILED,
69-
"gbm_surface_lock_front_buffer failed");
70-
return FALSE;
71-
}
7262

7363
if (gbm_bo_get_handle_for_plane (bo, 0).s32 == -1)
7464
{
@@ -99,37 +89,71 @@ acquire_swapped_buffer (MetaDrmBufferGbm *buffer_gbm,
9989
use_modifiers,
10090
&fb_args,
10191
&buffer_gbm->fb_id, error))
92+
return FALSE;
93+
return TRUE;
94+
}
95+
96+
static gboolean
97+
lock_front_buffer (MetaDrmBufferGbm *buffer_gbm,
98+
gboolean use_modifiers,
99+
GError **error)
100+
{
101+
buffer_gbm->bo = gbm_surface_lock_front_buffer (buffer_gbm->surface);
102+
if (!buffer_gbm->bo)
102103
{
103-
gbm_surface_release_buffer (buffer_gbm->surface, bo);
104+
g_set_error (error,
105+
G_IO_ERROR,
106+
G_IO_ERROR_FAILED,
107+
"gbm_surface_lock_front_buffer failed");
104108
return FALSE;
105109
}
110+
return init_fb_id (buffer_gbm, buffer_gbm->bo, use_modifiers, error);
111+
}
106112

107-
buffer_gbm->bo = bo;
113+
MetaDrmBufferGbm *
114+
meta_drm_buffer_gbm_new_lock_front (MetaGpuKms *gpu_kms,
115+
struct gbm_surface *gbm_surface,
116+
gboolean use_modifiers,
117+
GError **error)
118+
{
119+
MetaDrmBufferGbm *buffer_gbm;
108120

109-
return TRUE;
121+
buffer_gbm = g_object_new (META_TYPE_DRM_BUFFER_GBM, NULL);
122+
buffer_gbm->gpu_kms = gpu_kms;
123+
buffer_gbm->surface = gbm_surface;
124+
125+
if (!lock_front_buffer (buffer_gbm, use_modifiers, error))
126+
{
127+
g_object_unref (buffer_gbm);
128+
return NULL;
129+
}
130+
131+
return buffer_gbm;
110132
}
111133

112134
MetaDrmBufferGbm *
113-
meta_drm_buffer_gbm_new (MetaGpuKms *gpu_kms,
114-
struct gbm_surface *gbm_surface,
115-
gboolean use_modifiers,
116-
GError **error)
135+
meta_drm_buffer_gbm_new_take (MetaGpuKms *gpu_kms,
136+
struct gbm_bo *bo,
137+
gboolean use_modifiers,
138+
GError **error)
117139
{
118140
MetaDrmBufferGbm *buffer_gbm;
119141

120142
buffer_gbm = g_object_new (META_TYPE_DRM_BUFFER_GBM, NULL);
121143
buffer_gbm->gpu_kms = gpu_kms;
122-
buffer_gbm->surface = gbm_surface;
123144

124-
if (!acquire_swapped_buffer (buffer_gbm, use_modifiers, error))
145+
if (!init_fb_id (buffer_gbm, bo, use_modifiers, error))
125146
{
126147
g_object_unref (buffer_gbm);
127148
return NULL;
128149
}
129150

151+
buffer_gbm->bo = bo;
152+
130153
return buffer_gbm;
131154
}
132155

156+
133157
static uint32_t
134158
meta_drm_buffer_gbm_get_fb_id (MetaDrmBuffer *buffer)
135159
{
@@ -150,7 +174,12 @@ meta_drm_buffer_gbm_finalize (GObject *object)
150174
}
151175

152176
if (buffer_gbm->bo)
153-
gbm_surface_release_buffer (buffer_gbm->surface, buffer_gbm->bo);
177+
{
178+
if (buffer_gbm->surface)
179+
gbm_surface_release_buffer (buffer_gbm->surface, buffer_gbm->bo);
180+
else
181+
gbm_bo_destroy (buffer_gbm->bo);
182+
}
154183

155184
G_OBJECT_CLASS (meta_drm_buffer_gbm_parent_class)->finalize (object);
156185
}

src/backends/native/meta-drm-buffer-gbm.h

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,16 @@ G_DECLARE_FINAL_TYPE (MetaDrmBufferGbm,
3333
META, DRM_BUFFER_GBM,
3434
MetaDrmBuffer)
3535

36-
MetaDrmBufferGbm * meta_drm_buffer_gbm_new (MetaGpuKms *gpu_kms,
37-
struct gbm_surface *gbm_surface,
38-
gboolean use_modifiers,
39-
GError **error);
36+
MetaDrmBufferGbm * meta_drm_buffer_gbm_new_lock_front (MetaGpuKms *gpu_kms,
37+
struct gbm_surface *gbm_surface,
38+
gboolean use_modifiers,
39+
GError **error);
40+
41+
42+
MetaDrmBufferGbm * meta_drm_buffer_gbm_new_take (MetaGpuKms *gpu_kms,
43+
struct gbm_bo *gbm_bo,
44+
gboolean use_modifiers,
45+
GError **error);
4046

4147
struct gbm_bo * meta_drm_buffer_gbm_get_bo (MetaDrmBufferGbm *buffer_gbm);
4248

src/backends/native/meta-renderer-native.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1621,13 +1621,14 @@ copy_shared_framebuffer_gpu (CoglOnscreen *onscreen,
16211621
return;
16221622
}
16231623

1624-
buffer_gbm = meta_drm_buffer_gbm_new (secondary_gpu_state->gpu_kms,
1624+
buffer_gbm =
1625+
meta_drm_buffer_gbm_new_lock_front (secondary_gpu_state->gpu_kms,
16251626
secondary_gpu_state->gbm.surface,
16261627
renderer_native->use_modifiers,
16271628
&error);
16281629
if (!buffer_gbm)
16291630
{
1630-
g_warning ("meta_drm_buffer_gbm_new failed: %s",
1631+
g_warning ("meta_drm_buffer_gbm_new_lock_front failed: %s",
16311632
error->message);
16321633
g_error_free (error);
16331634
return;
@@ -2113,13 +2114,14 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
21132114
g_warn_if_fail (onscreen_native->gbm.next_fb == NULL);
21142115
g_clear_object (&onscreen_native->gbm.next_fb);
21152116

2116-
buffer_gbm = meta_drm_buffer_gbm_new (render_gpu,
2117+
buffer_gbm =
2118+
meta_drm_buffer_gbm_new_lock_front (render_gpu,
21172119
onscreen_native->gbm.surface,
21182120
renderer_native->use_modifiers,
21192121
&error);
21202122
if (!buffer_gbm)
21212123
{
2122-
g_warning ("meta_drm_buffer_gbm_new failed: %s",
2124+
g_warning ("meta_drm_buffer_gbm_new_lock_front failed: %s",
21232125
error->message);
21242126
return;
21252127
}

0 commit comments

Comments
 (0)