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: cef12efc15
("glamor: Implement GetSupportedModifiers")
Cc: Louis-Francis Ratté-Boulianne <lfrb@collabora.com>
Cc: Daniel Stone <daniels@collabora.com>
Reviewed-by: Adam Jackson <ajax@redhat.com>
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
This commit is contained in:
parent
71a069fd7f
commit
a42992a4cc
|
@ -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)
|
||||||
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;
|
||||||
|
|
Loading…
Reference in New Issue