anv/wsi_wayland: Fix FIFO mode
authorJason Ekstrand <jason.ekstrand@intel.com>
Mon, 28 Sep 2015 22:56:14 +0000 (15:56 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Mon, 28 Sep 2015 22:58:34 +0000 (15:58 -0700)
Previously, there were a number of things we were doing wrong:

 1) We weren't flushing the wl_display so dead-looping clients weren't
    guaranteed to work.
 2) We were sending the frame event after calling wl_surface.commit() so it
    wasn't getting assigned to the correct frame
 3) We weren't actually setting fifo_ready to false.

Unfortunately, we never noticed because (3) was hiding the other two.  This
commit fixes all three and clients that use FIFO mode are now properly
refresh-rate limited.

src/vulkan/anv_wsi_wayland.c

index 11f2dae97592c21fd95e3bdd350da8a61fb5e5f1..a601ad1851f3ea6e7139f914b5c9b992b93f3c0d 100644 (file)
@@ -516,14 +516,17 @@ wsi_wl_queue_present(struct anv_swap_chain *anv_chain,
    assert(image_index < chain->image_count);
    wl_surface_attach(chain->surface, chain->images[image_index].buffer, 0, 0);
    wl_surface_damage(chain->surface, 0, 0, INT32_MAX, INT32_MAX);
-   wl_surface_commit(chain->surface);
 
    if (chain->present_mode == VK_PRESENT_MODE_FIFO_WSI) {
       struct wl_callback *frame = wl_surface_frame(chain->surface);
       wl_proxy_set_queue((struct wl_proxy *)frame, chain->queue);
       wl_callback_add_listener(frame, &frame_listener, chain);
+      chain->fifo_ready = false;
    }
 
+   wl_surface_commit(chain->surface);
+   wl_display_flush(chain->display->display);
+
    return VK_SUCCESS;
 }