diff options
Diffstat (limited to 'dri3/dri3_screen.c')
-rw-r--r-- | dri3/dri3_screen.c | 56 |
1 files changed, 12 insertions, 44 deletions
diff --git a/dri3/dri3_screen.c b/dri3/dri3_screen.c index 3c7e5bf60..bc96e5339 100644 --- a/dri3/dri3_screen.c +++ b/dri3/dri3_screen.c @@ -211,18 +211,17 @@ cache_formats_and_modifiers(ScreenPtr screen) int dri3_get_supported_modifiers(ScreenPtr screen, DrawablePtr drawable, CARD8 depth, CARD8 bpp, - CARD32 *num_intersect_modifiers, - CARD64 **intersect_modifiers, + CARD32 *num_drawable_modifiers, + CARD64 **drawable_modifiers, CARD32 *num_screen_modifiers, CARD64 **screen_modifiers) { dri3_screen_priv_ptr ds = dri3_screen_priv(screen); const dri3_screen_info_rec *info = ds->info; - int i, j; + int i; int ret; uint32_t num_drawable_mods; uint64_t *drawable_mods; - CARD64 *intersect_mods = NULL; CARD64 *screen_mods = NULL; CARD32 format; dri3_dmabuf_format_ptr screen_format = NULL; @@ -248,10 +247,15 @@ dri3_get_supported_modifiers(ScreenPtr screen, DrawablePtr drawable, if (screen_format->num_modifiers == 0) { *num_screen_modifiers = 0; - *num_intersect_modifiers = 0; + *num_drawable_modifiers = 0; return Success; } + /* copy the screen mods so we can return an owned allocation */ + screen_mods = xnfalloc(screen_format->num_modifiers * sizeof(CARD64)); + memcpy(screen_mods, screen_format->modifiers, + screen_format->num_modifiers * sizeof(CARD64)); + if (!info->get_drawable_modifiers || !info->get_drawable_modifiers(drawable, format, &num_drawable_mods, @@ -260,47 +264,11 @@ dri3_get_supported_modifiers(ScreenPtr screen, DrawablePtr drawable, drawable_mods = NULL; } - /* We're allocating slightly more memory than necessary but it reduces - * the complexity of finding the intersection set. - */ - screen_mods = malloc(screen_format->num_modifiers * sizeof(CARD64)); - if (!screen_mods) - return BadAlloc; - if (num_drawable_mods > 0) { - intersect_mods = malloc(screen_format->num_modifiers * sizeof(CARD64)); - if (!intersect_mods) { - free(screen_mods); - return BadAlloc; - } - } - - *num_screen_modifiers = 0; - *num_intersect_modifiers = 0; - for (i = 0; i < screen_format->num_modifiers; i++) { - CARD64 modifier = screen_format->modifiers[i]; - Bool intersect = FALSE; - - for (j = 0; j < num_drawable_mods; j++) { - if (drawable_mods[j] == modifier) { - intersect = TRUE; - break; - } - } - - if (intersect) { - intersect_mods[*num_intersect_modifiers] = modifier; - *num_intersect_modifiers += 1; - } else { - screen_mods[*num_screen_modifiers] = modifier; - *num_screen_modifiers += 1; - } - } - - assert(*num_intersect_modifiers + *num_screen_modifiers == screen_format->num_modifiers); + *num_drawable_modifiers = num_drawable_mods; + *drawable_modifiers = drawable_mods; - *intersect_modifiers = intersect_mods; + *num_screen_modifiers = screen_format->num_modifiers; *screen_modifiers = screen_mods; - free(drawable_mods); return Success; } |