backend/native: Create MetaRenderDevice on_gpu_added when it does not exists

Fixes GNOME/mutter#2481

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2676>
This commit is contained in:
Łukasz Spintzyk 2022-10-26 09:22:24 +02:00
parent 986d3be7ac
commit c57a500ccb
3 changed files with 27 additions and 9 deletions

View File

@ -33,7 +33,9 @@ MetaBarrierManagerNative *meta_backend_native_get_barrier_manager (MetaBackendNa
META_EXPORT_TEST META_EXPORT_TEST
MetaDevicePool * meta_backend_native_get_device_pool (MetaBackendNative *native); MetaDevicePool * meta_backend_native_get_device_pool (MetaBackendNative *native);
MetaRenderDevice * meta_backend_native_take_render_device (MetaBackendNative *backend_native,
const char *device_path); MetaRenderDevice * meta_backend_native_take_render_device (MetaBackendNative *backend_native,
const char *device_path,
GError **error);
#endif /* META_BACKEND_NATIVE_PRIVATE_H */ #endif /* META_BACKEND_NATIVE_PRIVATE_H */

View File

@ -991,9 +991,21 @@ void meta_backend_native_resume (MetaBackendNative *native)
clutter_seat_ensure_a11y_state (CLUTTER_SEAT (seat)); clutter_seat_ensure_a11y_state (CLUTTER_SEAT (seat));
} }
static MetaRenderDevice *
meta_backend_native_create_render_device (MetaBackendNative *backend_native,
const char *device_path,
GError **error)
{
g_autoptr (MetaRenderDevice) render_device = NULL;
render_device = create_render_device (backend_native, device_path, error);
return g_steal_pointer (&render_device);
}
MetaRenderDevice * MetaRenderDevice *
meta_backend_native_take_render_device (MetaBackendNative *backend_native, meta_backend_native_take_render_device (MetaBackendNative *backend_native,
const char *device_path) const char *device_path,
GError **error)
{ {
MetaRenderDevice *render_device; MetaRenderDevice *render_device;
@ -1001,7 +1013,12 @@ meta_backend_native_take_render_device (MetaBackendNative *backend_native,
device_path, device_path,
NULL, NULL,
(gpointer *) &render_device)) (gpointer *) &render_device))
return render_device; {
return render_device;
}
else else
return NULL; {
return meta_backend_native_create_render_device (backend_native,
device_path, error);
}
} }

View File

@ -1781,11 +1781,10 @@ meta_renderer_native_create_renderer_gpu_data (MetaRendererNative *renderer_nat
device_path = meta_gpu_kms_get_file_path (gpu_kms); device_path = meta_gpu_kms_get_file_path (gpu_kms);
render_device = meta_backend_native_take_render_device (backend_native, render_device = meta_backend_native_take_render_device (backend_native,
device_path); device_path,
error);
if (!render_device) if (!render_device)
{ {
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND,
"No render device found for %s", device_path);
return NULL; return NULL;
} }