Skip to content

Commit f44c075

Browse files
committed
wayland: switch to separate queue for wp_image_description_v1
f0883cd fixed the issue that `set_color_management` would be called on every frame, however it didn't fix the problem that the first frame would have no image description set. Due to a lack of blocking here, events would end up happening in the following order: -> wl_surface.commit() -> wp_color_management_surface_v1.set_image_description(...) -> wl_surface.commit() -> wp_color_management_surface_v1.set_image_description(...) This would mean setting image description would always lag behind by 1 surface commit. This would effectively result in the first frame never having any image description set. Fix this by blocking until the compositor processes what's in the queue and responds with the ready event so we can set the image description.
1 parent 7482608 commit f44c075

File tree

2 files changed

+15
-0
lines changed

2 files changed

+15
-0
lines changed

video/out/wayland_common.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2115,6 +2115,7 @@ static void image_description_failed(void *data, struct wp_image_description_v1
21152115
uint32_t cause, const char *msg)
21162116
{
21172117
struct vo_wayland_state *wl = data;
2118+
wl->image_desc_done = true;
21182119
MP_VERBOSE(wl, "Image description failed: %d, %s\n", cause, msg);
21192120
wp_color_management_surface_v1_unset_image_description(wl->color_surface);
21202121
wp_image_description_v1_destroy(image_description);
@@ -2124,6 +2125,7 @@ static void image_description_ready(void *data, struct wp_image_description_v1 *
21242125
uint32_t identity)
21252126
{
21262127
struct vo_wayland_state *wl = data;
2128+
wl->image_desc_done = true;
21272129
wp_color_management_surface_v1_set_image_description(wl->color_surface, image_description, 0);
21282130
MP_TRACE(wl, "Image description set on color surface.\n");
21292131
wp_image_description_v1_destroy(image_description);
@@ -3500,8 +3502,20 @@ static void set_color_management(struct vo_wayland_state *wl)
35003502
wp_image_description_creator_params_v1_set_max_cll(image_creator_params, lrintf(hdr.max_cll));
35013503
wp_image_description_creator_params_v1_set_max_fall(image_creator_params, lrintf(hdr.max_fall));
35023504
}
3505+
35033506
struct wp_image_description_v1 *image_description = wp_image_description_creator_params_v1_create(image_creator_params);
3507+
struct wl_event_queue *cm_queue = wl_display_create_queue(wl->display);
3508+
wl_proxy_set_queue((struct wl_proxy *)image_description, cm_queue);
3509+
wl->image_desc_done = false;
35043510
wp_image_description_v1_add_listener(image_description, &image_description_listener, wl);
3511+
3512+
/* Block here to ensure the compositor is ready to receive the
3513+
* image_description before we do anything else. */
3514+
while (wl->image_desc_done == false)
3515+
if (wl_display_dispatch_queue(wl->display, cm_queue) < 0)
3516+
break;
3517+
3518+
wl_event_queue_destroy(cm_queue);
35053519
#endif
35063520
}
35073521

video/out/wayland_common.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ struct vo_wayland_state {
102102
void *icc_file;
103103
uint32_t icc_size;
104104
struct pl_color_space preferred_csp;
105+
bool image_desc_done;
105106

106107
/* color-representation */
107108
struct wp_color_representation_manager_v1 *color_representation_manager;

0 commit comments

Comments
 (0)