summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIain Lane <iainl@gnome.org>2018-08-09 14:12:31 +0100
committerIain Lane <iainl@gnome.org>2018-08-09 14:43:21 +0100
commit27e43188680d0eda9c2b026bcdc199eb860a07bd (patch)
tree9cac5fc1fff616045637dbfaa0d09a8dd9b19871
parent252dd524390dcdbdd89534c0014d22a796957f55 (diff)
downloadmutter-wip/laney/drmmodegetresources-handle-failure.tar.gz
gpu-kms: Check for DRM resources when constructingwip/laney/drmmodegetresources-handle-failure
drmModeGetResources() can fail if the DRM driver doesn't implement modesetting. We shouldn't crash in this case, but instead error out. This moves the call into the constructor of the MetaGpuKms, as it is easier to fail constructing directly rather than deal with it later on. Fixes #223.
-rw-r--r--src/backends/native/meta-gpu-kms.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/src/backends/native/meta-gpu-kms.c b/src/backends/native/meta-gpu-kms.c
index 4be5d8550..00e4d14af 100644
--- a/src/backends/native/meta-gpu-kms.c
+++ b/src/backends/native/meta-gpu-kms.c
@@ -68,6 +68,8 @@ struct _MetaGpuKms
int max_buffer_height;
gboolean page_flips_not_supported;
+
+ MetaKmsResources resources;
};
G_DEFINE_TYPE (MetaGpuKms, meta_gpu_kms, META_TYPE_GPU)
@@ -726,20 +728,29 @@ init_outputs (MetaGpuKms *gpu_kms,
setup_output_clones (gpu);
}
-static void
+static gboolean
meta_kms_resources_init (MetaKmsResources *resources,
- int fd)
+ int fd,
+ GError **error)
{
drmModeRes *drm_resources;
unsigned int i;
drm_resources = drmModeGetResources (fd);
+
+ if (drm_resources == NULL) {
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "No resources");
+ return FALSE;
+ }
+
resources->resources = drm_resources;
resources->n_encoders = (unsigned int) drm_resources->count_encoders;
resources->encoders = g_new (drmModeEncoder *, resources->n_encoders);
for (i = 0; i < resources->n_encoders; i++)
resources->encoders[i] = drmModeGetEncoder (fd, drm_resources->encoders[i]);
+
+ return TRUE;
}
static void
@@ -761,9 +772,7 @@ meta_gpu_kms_read_current (MetaGpu *gpu,
MetaGpuKms *gpu_kms = META_GPU_KMS (gpu);
MetaMonitorManager *monitor_manager =
meta_gpu_get_monitor_manager (gpu);
- MetaKmsResources resources;
-
- meta_kms_resources_init (&resources, gpu_kms->fd);
+ MetaKmsResources resources = gpu_kms->resources;
gpu_kms->max_buffer_width = resources.resources->max_width;
gpu_kms->max_buffer_height = resources.resources->max_height;
@@ -812,6 +821,11 @@ meta_gpu_kms_new (MetaMonitorManagerKms *monitor_manager_kms,
gpu_kms->fd = kms_fd;
gpu_kms->file_path = g_strdup (kms_file_path);
+ if (!meta_kms_resources_init (&gpu_kms->resources, gpu_kms->fd, error)) {
+ g_clear_object (&gpu_kms);
+ return NULL;
+ }
+
drmSetClientCap (gpu_kms->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
source = g_source_new (&kms_event_funcs, sizeof (MetaKmsSource));
@@ -841,7 +855,7 @@ meta_gpu_kms_finalize (GObject *object)
meta_launcher_close_restricted (launcher, gpu_kms->fd);
g_clear_pointer (&gpu_kms->file_path, g_free);
- g_source_destroy (gpu_kms->source);
+ g_clear_pointer (&gpu_kms->source, g_source_destroy);
free_resources (gpu_kms);