From 3532766c3e8012442d6173d3f37e9716a778790c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Fri, 1 Feb 2019 19:23:06 +0100 Subject: [PATCH] output/kms: Make drmModeEncoderPtr array local It was only used within one function, where it was always created, but still was kept around indefinitely for no reason. Lets get rid of it from the MetaOututKms struct. https://gitlab.gnome.org/GNOME/mutter/issues/548 https://gitlab.gnome.org/GNOME/mutter/merge_requests/525 --- src/backends/native/meta-output-kms.c | 40 +++++++++++++-------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/src/backends/native/meta-output-kms.c b/src/backends/native/meta-output-kms.c index f3cc543c4..50b58b76f 100644 --- a/src/backends/native/meta-output-kms.c +++ b/src/backends/native/meta-output-kms.c @@ -41,10 +41,6 @@ typedef struct _MetaOutputKms drmModeConnector *connector; - unsigned int n_encoders; - drmModeEncoderPtr *encoders; - drmModeEncoderPtr current_encoder; - /* * Bitmasks of encoder position in the resources array (used during clone * setup). @@ -409,14 +405,9 @@ static void meta_output_destroy_notify (MetaOutput *output) { MetaOutputKms *output_kms; - unsigned i; output_kms = output->driver_private; - for (i = 0; i < output_kms->n_encoders; i++) - drmModeFreeEncoder (output_kms->encoders[i]); - g_free (output_kms->encoders); - g_slice_free (MetaOutputKms, output_kms); } @@ -568,6 +559,9 @@ meta_create_kms_output (MetaGpuKms *gpu_kms, unsigned int crtc_mask; int fd; uint32_t id; + unsigned int n_encoders; + drmModeEncoderPtr *encoders; + drmModeEncoderPtr current_encoder = NULL; output = g_object_new (META_TYPE_OUTPUT, NULL); @@ -624,16 +618,16 @@ meta_create_kms_output (MetaGpuKms *gpu_kms, return NULL; } - output_kms->n_encoders = connector->count_encoders; - output_kms->encoders = g_new0 (drmModeEncoderPtr, output_kms->n_encoders); + n_encoders = connector->count_encoders; + encoders = g_new0 (drmModeEncoderPtr, n_encoders); fd = meta_gpu_kms_get_fd (gpu_kms); crtc_mask = ~(unsigned int) 0; - for (i = 0; i < output_kms->n_encoders; i++) + for (i = 0; i < n_encoders; i++) { - output_kms->encoders[i] = drmModeGetEncoder (fd, connector->encoders[i]); - if (!output_kms->encoders[i]) + encoders[i] = drmModeGetEncoder (fd, connector->encoders[i]); + if (!encoders[i]) continue; /* We only list CRTCs as supported if they are supported by all encoders @@ -641,10 +635,10 @@ meta_create_kms_output (MetaGpuKms *gpu_kms, This is what xf86-video-modesetting does (see drmmode_output_init()) */ - crtc_mask &= output_kms->encoders[i]->possible_crtcs; + crtc_mask &= encoders[i]->possible_crtcs; - if (output_kms->encoders[i]->encoder_id == connector->encoder_id) - output_kms->current_encoder = output_kms->encoders[i]; + if (encoders[i]->encoder_id == connector->encoder_id) + current_encoder = encoders[i]; } crtcs = g_array_new (FALSE, FALSE, sizeof (MetaCrtc*)); @@ -662,13 +656,13 @@ meta_create_kms_output (MetaGpuKms *gpu_kms, output->n_possible_crtcs = crtcs->len; output->possible_crtcs = (void*)g_array_free (crtcs, FALSE); - if (output_kms->current_encoder && output_kms->current_encoder->crtc_id != 0) + if (current_encoder && current_encoder->crtc_id != 0) { for (l = meta_gpu_get_crtcs (gpu); l; l = l->next) { MetaCrtc *crtc = l->data; - if (crtc->crtc_id == output_kms->current_encoder->crtc_id) + if (crtc->crtc_id == current_encoder->crtc_id) { meta_output_assign_crtc (output, crtc); break; @@ -737,9 +731,9 @@ meta_create_kms_output (MetaGpuKms *gpu_kms, output_kms->enc_clone_mask = 0xff; output_kms->encoder_mask = 0; - for (i = 0; i < output_kms->n_encoders; i++) + for (i = 0; i < n_encoders; i++) { - drmModeEncoder *output_encoder = output_kms->encoders[i]; + drmModeEncoder *output_encoder = encoders[i]; unsigned int j; for (j = 0; j < resources->n_encoders; j++) @@ -757,5 +751,9 @@ meta_create_kms_output (MetaGpuKms *gpu_kms, output_kms->enc_clone_mask &= output_encoder->possible_clones; } + for (i = 0; i < n_encoders; i++) + drmModeFreeEncoder (encoders[i]); + g_free (encoders); + return output; }