OSDN Git Service

vl/dri3: add support for resizing
authorLeo Liu <leo.liu@amd.com>
Mon, 25 Apr 2016 19:49:28 +0000 (15:49 -0400)
committerLeo Liu <leo.liu@amd.com>
Mon, 16 May 2016 20:28:51 +0000 (16:28 -0400)
When drawable size changed, PresentConfigureNotify event will be
emitted, by handling the event to re-allocate resized buffer.

Signed-off-by: Leo Liu <leo.liu@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
src/gallium/auxiliary/vl/vl_winsys_dri3.c

index a370315..8bdfe82 100644 (file)
@@ -91,7 +91,9 @@ dri3_handle_present_event(struct vl_dri3_screen *scrn,
 {
    switch (ge->evtype) {
    case XCB_PRESENT_CONFIGURE_NOTIFY: {
-      /* TODO */
+      xcb_present_configure_notify_event_t *ce = (void *) ge;
+      scrn->width = ce->width;
+      scrn->height = ce->height;
       break;
    }
    case XCB_PRESENT_COMPLETE_NOTIFY: {
@@ -249,12 +251,19 @@ dri3_get_back_buffer(struct vl_dri3_screen *scrn)
       return NULL;
    buffer = scrn->back_buffers[scrn->cur_back];
 
-   if (!buffer) {
-      buffer = dri3_alloc_back_buffer(scrn);
-      if (!buffer)
+   if (!buffer || buffer->width != scrn->width ||
+       buffer->height != scrn->height) {
+      struct vl_dri3_buffer *new_buffer;
+
+      new_buffer = dri3_alloc_back_buffer(scrn);
+      if (!new_buffer)
          return NULL;
 
+      if (buffer)
+         dri3_free_back_buffer(scrn, buffer);
+
       vl_compositor_reset_dirty_area(&scrn->dirty_areas[scrn->cur_back]);
+      buffer = new_buffer;
       scrn->back_buffers[scrn->cur_back] = buffer;
    }