[RFC v3 07/22] egl/x11: Reallocate buffer when the window moves to a different CRTC

Louis-Francis Ratté-Boulianne lfrb at collabora.com
Wed Sep 27 05:28:37 UTC 2017


The optimal modifier depends on the current CRTC as some modifiers
might not allow direct scanout. When the window is moved to a
different CRTC, available modifiers should be re-fetched and the
buffers re-allocated.

Signed-off-by: Louis-Francis Ratté-Boulianne <lfrb at collabora.com>
---
 src/loader/loader_dri3_helper.c | 35 +++++++++++++++++++----------------
 src/loader/loader_dri3_helper.h |  1 +
 2 files changed, 20 insertions(+), 16 deletions(-)

diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c
index f6bc1c52e8..6472f217d1 100644
--- a/src/loader/loader_dri3_helper.c
+++ b/src/loader/loader_dri3_helper.c
@@ -24,6 +24,7 @@
 #include <fcntl.h>
 #include <stdlib.h>
 #include <unistd.h>
+#include <string.h>
 
 #include <X11/xshmfence.h>
 #include <xcb/xcb.h>
@@ -408,6 +409,14 @@ dri3_handle_present_event(struct loader_dri3_drawable *draw,
       }
       break;
    }
+   case XCB_PRESENT_EVENT_WINDOW_CRTC_NOTIFY: {
+      int b;
+      for (b = 0; b < sizeof(draw->buffers) / sizeof(draw->buffers[0]); b++) {
+         if (draw->buffers[b])
+            draw->buffers[b]->crtc_changed = true;
+      }
+      break;
+   }
    }
    free(ge);
 }
@@ -1047,7 +1056,6 @@ dri3_alloc_render_buffer(struct loader_dri3_drawable *draw, unsigned int format,
          uint64_t *modifiers[2] = {NULL, NULL};
          uint32_t counts[2] = {0, 0};
          uint32_t n = 0;
-         uint32_t *mod_parts;
          int i;
 
          mod_cookie = xcb_dri3_get_supported_modifiers(draw->conn,
@@ -1067,11 +1075,9 @@ dri3_alloc_render_buffer(struct loader_dri3_drawable *draw, unsigned int format,
                goto no_image;
             }
 
-            mod_parts = xcb_dri3_get_supported_modifiers_drawable_modifiers(mod_reply);
-            for (i = 0; i < counts[n]; i++) {
-               modifiers[n][i] = (uint64_t) mod_parts[i * 2] << 32;
-               modifiers[n][i] |= (uint64_t) mod_parts[i * 2 + 1] & 0xffffff;
-            }
+            memcpy(modifiers[n],
+                   xcb_dri3_get_supported_modifiers_drawable_modifiers(mod_reply),
+                   counts[n] * sizeof(uint64_t));
             n++;
          }
 
@@ -1084,11 +1090,9 @@ dri3_alloc_render_buffer(struct loader_dri3_drawable *draw, unsigned int format,
                goto no_image;
             }
 
-            mod_parts = xcb_dri3_get_supported_modifiers_screen_modifiers(mod_reply);
-            for (i = 0; i < counts[n]; i++) {
-               modifiers[n][i] = (uint64_t) mod_parts[i * 2] << 32;
-               modifiers[n][i] |= (uint64_t) mod_parts[i * 2 + 1] & 0xffffff;
-            }
+            memcpy(modifiers[n],
+                   xcb_dri3_get_supported_modifiers_screen_modifiers(mod_reply),
+                   counts[n] * sizeof(uint64_t));
             n++;
          }
 
@@ -1192,8 +1196,7 @@ dri3_alloc_render_buffer(struct loader_dri3_drawable *draw, unsigned int format,
                                    buffer->strides[2], buffer->offsets[2],
                                    buffer->strides[3], buffer->offsets[3],
                                    depth, buffer->cpp * 8,
-                                   buffer->modifier >> 32,
-                                   buffer->modifier & 0xffffffff,
+                                   buffer->modifier,
                                    buffer_fds);
    }
    else
@@ -1278,7 +1281,8 @@ dri3_update_drawable(__DRIdrawable *driDrawable,
          xcb_present_select_input_checked(draw->conn, draw->eid, draw->drawable,
                                           XCB_PRESENT_EVENT_MASK_CONFIGURE_NOTIFY |
                                           XCB_PRESENT_EVENT_MASK_COMPLETE_NOTIFY |
-                                          XCB_PRESENT_EVENT_MASK_IDLE_NOTIFY);
+                                          XCB_PRESENT_EVENT_MASK_IDLE_NOTIFY |
+                                          XCB_PRESENT_EVENT_MASK_WINDOW_CRTC_NOTIFY);
 
       present_capabilities_cookie =
          xcb_present_query_capabilities(draw->conn, draw->drawable);
@@ -1391,7 +1395,6 @@ loader_dri3_create_image_from_buffers(xcb_connection_t *c,
    int                                  *fds;
    uint32_t                             *strides_in, *offsets_in;
    int                                   strides[4], offsets[4];
-   uint64_t                              modifier;
    unsigned                              error;
    int                                   i;
 
@@ -1549,7 +1552,7 @@ dri3_get_buffer(__DRIdrawable *driDrawable,
     * old one is the wrong size
     */
    if (!buffer || buffer->width != draw->width ||
-       buffer->height != draw->height) {
+       buffer->height != draw->height || buffer->crtc_changed) {
       struct loader_dri3_buffer *new_buffer;
 
       /* Allocate the new buffers
diff --git a/src/loader/loader_dri3_helper.h b/src/loader/loader_dri3_helper.h
index 03c874fe0d..7de42e0660 100644
--- a/src/loader/loader_dri3_helper.h
+++ b/src/loader/loader_dri3_helper.h
@@ -70,6 +70,7 @@ struct loader_dri3_buffer {
    uint32_t     flags;
    uint32_t     width, height;
    uint64_t     last_swap;
+   bool         crtc_changed;
 };
 
 
-- 
2.13.0



More information about the xorg-devel mailing list