vk/wsi/x11: Send OUT_OF_DATE if the X drawable goes away
authorJason Ekstrand <jason.ekstrand@intel.com>
Fri, 2 Oct 2015 20:44:13 +0000 (13:44 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 2 Oct 2015 20:44:53 +0000 (13:44 -0700)
src/vulkan/anv_wsi_x11.c

index e5d0a2572aa835752470c35e23f26c3c9d93a3c6..03aef4cbf23d38d7a37054802fb3b76f567f2837 100644 (file)
@@ -192,9 +192,18 @@ x11_acquire_next_image(struct anv_swap_chain *anv_chain,
    struct x11_image *image = &chain->images[chain->next_image];
 
    if (image->busy) {
+      xcb_generic_error_t *err;
       xcb_get_geometry_reply_t *geom =
-         xcb_get_geometry_reply(chain->conn, image->geom_cookie, NULL);
-      image->busy = false;
+         xcb_get_geometry_reply(chain->conn, image->geom_cookie, &err);
+      if (!geom) {
+         if (err->error_code == XCB_DRAWABLE) {
+            /* Probably the best thing to do if our drawable goes away */
+            return vk_error(VK_ERROR_OUT_OF_DATE_WSI);
+         } else {
+            return vk_error(VK_ERROR_UNKNOWN);
+         }
+         free(err);
+      }
 
       if (geom->width != chain->extent.width ||
           geom->height != chain->extent.height) {
@@ -202,6 +211,8 @@ x11_acquire_next_image(struct anv_swap_chain *anv_chain,
          return vk_error(VK_ERROR_OUT_OF_DATE_WSI);
       }
       free(geom);
+
+      image->busy = false;
    }
 
    *image_index = chain->next_image;