From a42992a4cca49cedd3930f5694c7a16e4f614b36 Mon Sep 17 00:00:00 2001 From: Emil Velikov Date: Mon, 2 Apr 2018 16:41:24 +0100 Subject: dri3: rework format/modifier caching MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cut down the unnecessary malloc/memcpy/free by utilising the explicit copy provided by the client. But above all: do so, after ensuring we get valid data from the implementation. Fixes: cef12efc15c ("glamor: Implement GetSupportedModifiers") Cc: Louis-Francis Ratté-Boulianne Cc: Daniel Stone Reviewed-by: Adam Jackson Signed-off-by: Emil Velikov --- dri3/dri3_screen.c | 50 +++++++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/dri3/dri3_screen.c b/dri3/dri3_screen.c index a9d2e01db..23e33f401 100644 --- a/dri3/dri3_screen.c +++ b/dri3/dri3_screen.c @@ -159,8 +159,10 @@ cache_formats_and_modifiers(ScreenPtr screen) { dri3_screen_priv_ptr ds = dri3_screen_priv(screen); const dri3_screen_info_rec *info = ds->info; - CARD32 *formats = NULL; - CARD64 *modifiers = NULL; + CARD32 num_formats; + CARD32 *formats; + CARD32 num_modifiers; + CARD64 *modifiers; int i; if (ds->formats_cached) @@ -176,34 +178,36 @@ cache_formats_and_modifiers(ScreenPtr screen) return Success; } - (*info->get_formats) (screen, &ds->num_formats, &formats); - ds->formats = calloc(ds->num_formats, sizeof(dri3_dmabuf_format_rec)); + if (!info->get_formats(screen, &num_formats, &formats)) + return BadAlloc; + + if (!num_formats) { + ds->num_formats = 0; + ds->formats_cached = TRUE; + return Success; + } + + ds->formats = calloc(num_formats, sizeof(dri3_dmabuf_format_rec)); if (!ds->formats) return BadAlloc; - for (i = 0; i < ds->num_formats; i++) { + for (i = 0; i < num_formats; i++) { dri3_dmabuf_format_ptr iter = &ds->formats[i]; + if (!info->get_modifiers(screen, formats[i], + &num_modifiers, + &modifiers)) + continue; + + if (!num_modifiers) + continue; + iter->format = formats[i]; - (*info->get_modifiers) (screen, formats[i], - &iter->num_modifiers, - &modifiers); - - iter->modifiers = malloc(iter->num_modifiers * sizeof(CARD64)); - if (iter->modifiers == NULL) - goto error; - - memcpy(iter->modifiers, modifiers, - iter->num_modifiers * sizeof(CARD64)); - goto done; - -error: - iter->num_modifiers = 0; - free(iter->modifiers); -done: - free(modifiers); + iter->num_modifiers = num_modifiers; + iter->modifiers = modifiers; } - free(formats); + + ds->num_formats = i; ds->formats_cached = TRUE; return Success; -- cgit v1.2.3