aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLionel Landwerlin <[email protected]>2019-07-15 09:01:20 +0300
committerJuan A. Suarez Romero <[email protected]>2019-07-18 08:27:58 +0000
commita612f0210a0f8e934b04d721d06b9b9ca9937cd6 (patch)
tree14f2676f45db674062de125a83914d0300fc4e5b
parent7a072f1f396473e7ae29139576a1206a84a25771 (diff)
vulkan/wsi: update swapchain status on vkQueuePresent
With the following chain of events : vkQueuePresent() <- Surface resize vkQueuePresent() We should be able to report SUBOPTIMAL or OUT_OF_DATE on the second vkQueuePresent() call. Currently we only look at X11 events in the vkAcquireNextImage() path so we're not able to report this. This change checks the queue of events and process any available ones to update the swapchain status. v2: Be consistent about reporting the current error state of the swapchain (Jason) Signed-off-by: Lionel Landwerlin <[email protected]> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111097 Cc: <[email protected]> Reviewed-by: Jason Ekstrand <[email protected]> (cherry picked from commit 6f880f128f9862a047a5ba543c2843e14517b1e6)
-rw-r--r--src/vulkan/wsi/wsi_common_x11.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c
index 46f1c08b453..6fa4dab1240 100644
--- a/src/vulkan/wsi/wsi_common_x11.c
+++ b/src/vulkan/wsi/wsi_common_x11.c
@@ -974,6 +974,19 @@ x11_present_to_x11(struct x11_swapchain *chain, uint32_t image_index,
options |= XCB_PRESENT_OPTION_SUBOPTIMAL;
#endif
+ /* Poll for any available event and update the swapchain status. This could
+ * update the status of the swapchain to SUBOPTIMAL or OUT_OF_DATE if the
+ * associated X11 surface has been resized.
+ */
+ xcb_generic_event_t *event;
+ while ((event = xcb_poll_for_special_event(chain->conn, chain->special_event))) {
+ VkResult result = x11_handle_dri3_present_event(chain, (void *)event);
+ free(event);
+ if (result < 0)
+ return x11_swapchain_result(chain, result);
+ x11_swapchain_result(chain, result);
+ }
+
xshmfence_reset(image->shm_fence);
++chain->send_sbc;
@@ -1009,6 +1022,10 @@ x11_acquire_next_image(struct wsi_swapchain *anv_chain,
struct x11_swapchain *chain = (struct x11_swapchain *)anv_chain;
uint64_t timeout = info->timeout;
+ /* If the swapchain is in an error state, don't go any further. */
+ if (chain->status < 0)
+ return chain->status;
+
if (chain->threaded) {
return x11_acquire_next_image_from_queue(chain, image_index, timeout);
} else {
@@ -1023,6 +1040,10 @@ x11_queue_present(struct wsi_swapchain *anv_chain,
{
struct x11_swapchain *chain = (struct x11_swapchain *)anv_chain;
+ /* If the swapchain is in an error state, don't go any further. */
+ if (chain->status < 0)
+ return chain->status;
+
if (chain->threaded) {
wsi_queue_push(&chain->present_queue, image_index);
return chain->status;