Commit a42992a4 authored by Emil Velikov's avatar Emil Velikov Committed by Adam Jackson

dri3: rework format/modifier caching

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: cef12efc ("glamor: Implement GetSupportedModifiers")
Cc: Louis-Francis Ratté-Boulianne <lfrb@collabora.com>
Cc: Daniel Stone <daniels@collabora.com>
Reviewed-by: Adam Jackson's avatarAdam Jackson <ajax@redhat.com>
Signed-off-by: default avatarEmil Velikov <emil.velikov@collabora.com>
parent 71a069fd
...@@ -159,8 +159,10 @@ cache_formats_and_modifiers(ScreenPtr screen) ...@@ -159,8 +159,10 @@ cache_formats_and_modifiers(ScreenPtr screen)
{ {
dri3_screen_priv_ptr ds = dri3_screen_priv(screen); dri3_screen_priv_ptr ds = dri3_screen_priv(screen);
const dri3_screen_info_rec *info = ds->info; const dri3_screen_info_rec *info = ds->info;
CARD32 *formats = NULL; CARD32 num_formats;
CARD64 *modifiers = NULL; CARD32 *formats;
CARD32 num_modifiers;
CARD64 *modifiers;
int i; int i;
if (ds->formats_cached) if (ds->formats_cached)
...@@ -176,34 +178,36 @@ cache_formats_and_modifiers(ScreenPtr screen) ...@@ -176,34 +178,36 @@ cache_formats_and_modifiers(ScreenPtr screen)
return Success; return Success;
} }
(*info->get_formats) (screen, &ds->num_formats, &formats); if (!info->get_formats(screen, &num_formats, &formats))
ds->formats = calloc(ds->num_formats, sizeof(dri3_dmabuf_format_rec)); 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) if (!ds->formats)
return BadAlloc; 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]; 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]; iter->format = formats[i];
(*info->get_modifiers) (screen, formats[i], iter->num_modifiers = num_modifiers;
&iter->num_modifiers, iter->modifiers = 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);
} }
free(formats);
ds->num_formats = i;
ds->formats_cached = TRUE; ds->formats_cached = TRUE;
return Success; return Success;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment