[PATCH xserver 13/15] dri3: rework format/modifier caching

Emil Velikov emil.l.velikov at gmail.com
Mon Apr 2 15:41:24 UTC 2018


From: Emil Velikov <emil.velikov at collabora.com>

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 <lfrb at collabora.com>
Cc: Daniel Stone <daniels at collabora.com>
Signed-off-by: Emil Velikov <emil.velikov at collabora.com>
---
 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 ec9afe28a..f5ca07934 100644
--- a/dri3/dri3_screen.c
+++ b/dri3/dri3_screen.c
@@ -117,8 +117,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)
@@ -127,34 +129,36 @@ cache_formats_and_modifiers(ScreenPtr screen)
     if (!info || !info->get_formats || !info->get_modifiers)
         return BadImplementation;
 
-    (*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;
-- 
2.16.0



More information about the xorg-devel mailing list