mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 09:08:10 +02:00
vulkan/wsi/x11: wait for acquirable images in FIFO mode
In FIFO presentation mode we block either on our present-queue or on Present
events after an image was transmitted.
In case we receive completion events without idle events at some point we
exhaust our acquire-queue and can not block anymore on present-queue.
Ensure that the consumer has at least one image to acquire before blocking
again on present-queue. Otherwise wait for one from the X server.
CC: mesa-stable
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/3344
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Reviewed-by: Simon Ser <contact@emersion.fr>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6513>
(cherry picked from commit ec5e918ef4)
This commit is contained in:
parent
b6e4106024
commit
3d1a71aa2b
2 changed files with 10 additions and 7 deletions
|
|
@ -400,7 +400,7 @@
|
||||||
"description": "vulkan/wsi/x11: wait for acquirable images in FIFO mode",
|
"description": "vulkan/wsi/x11: wait for acquirable images in FIFO mode",
|
||||||
"nominated": true,
|
"nominated": true,
|
||||||
"nomination_type": 0,
|
"nomination_type": 0,
|
||||||
"resolution": 0,
|
"resolution": 1,
|
||||||
"master_sha": null,
|
"master_sha": null,
|
||||||
"because_sha": null
|
"because_sha": null
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -1106,11 +1106,9 @@ x11_manage_fifo_queues(void *state)
|
||||||
|
|
||||||
assert(chain->has_present_queue);
|
assert(chain->has_present_queue);
|
||||||
while (chain->status >= 0) {
|
while (chain->status >= 0) {
|
||||||
/* It should be safe to unconditionally block here. Later in the loop
|
/* We can block here unconditionally because after an image was sent to
|
||||||
* we blocks until the previous present has landed on-screen. At that
|
* the server (later on in this loop) we ensure at least one image is
|
||||||
* point, we should have received IDLE_NOTIFY on all images presented
|
* acquirable by the consumer or wait there on such an event.
|
||||||
* before that point so the client should be able to acquire any image
|
|
||||||
* other than the currently presented one.
|
|
||||||
*/
|
*/
|
||||||
uint32_t image_index = 0;
|
uint32_t image_index = 0;
|
||||||
result = wsi_queue_pull(&chain->present_queue, &image_index, INT64_MAX);
|
result = wsi_queue_pull(&chain->present_queue, &image_index, INT64_MAX);
|
||||||
|
|
@ -1143,7 +1141,12 @@ x11_manage_fifo_queues(void *state)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
if (chain->has_acquire_queue) {
|
if (chain->has_acquire_queue) {
|
||||||
while (chain->last_present_msc < target_msc) {
|
/* Wait for our presentation to occur and ensure we have at least one
|
||||||
|
* image that can be acquired by the client afterwards. This ensures we
|
||||||
|
* can pull on the present-queue on the next loop.
|
||||||
|
*/
|
||||||
|
while (chain->last_present_msc < target_msc ||
|
||||||
|
chain->sent_image_count == chain->base.image_count) {
|
||||||
xcb_generic_event_t *event =
|
xcb_generic_event_t *event =
|
||||||
xcb_wait_for_special_event(chain->conn, chain->special_event);
|
xcb_wait_for_special_event(chain->conn, chain->special_event);
|
||||||
if (!event) {
|
if (!event) {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue