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)
{
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;
......
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