@@ -53,22 +53,12 @@ meta_drm_buffer_gbm_get_bo (MetaDrmBufferGbm *buffer_gbm)
5353}
5454
5555static 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
112134MetaDrmBufferGbm *
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+
133157static uint32_t
134158meta_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}
0 commit comments