xwayland: Send PresentCompleteModeSuboptimalCopy if dmabuf feedback was resent
If the dmabuf protocol's feedback object gave us a new list of modifiers, send PresentCompleteModeSuboptimalCopy to the client to inform them that they need to call GetSupportedModifiers. Reviewed-by: Michel Dänzer <mdaenzer@redhat.com>
This commit is contained in:
parent
9865a2321f
commit
d67383a695
|
@ -608,6 +608,7 @@ xwl_dmabuf_feedback_done(void *data, struct zwp_linux_dmabuf_feedback_v1 *dmabuf
|
||||||
struct xwl_dmabuf_feedback *xwl_feedback = data;
|
struct xwl_dmabuf_feedback *xwl_feedback = data;
|
||||||
|
|
||||||
xwl_feedback->feedback_done = true;
|
xwl_feedback->feedback_done = true;
|
||||||
|
xwl_feedback->unprocessed_feedback_pending = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -296,6 +296,7 @@ xwl_present_flip_notify_vblank(present_vblank_ptr vblank, uint64_t ust, uint64_t
|
||||||
{
|
{
|
||||||
WindowPtr window = vblank->window;
|
WindowPtr window = vblank->window;
|
||||||
struct xwl_present_window *xwl_present_window = xwl_present_window_priv(window);
|
struct xwl_present_window *xwl_present_window = xwl_present_window_priv(window);
|
||||||
|
uint8_t mode = PresentCompleteModeFlip;
|
||||||
|
|
||||||
DebugPresent(("\tn %" PRIu64 " %p %" PRIu64 " %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 "\n",
|
DebugPresent(("\tn %" PRIu64 " %p %" PRIu64 " %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 "\n",
|
||||||
vblank->event_id, vblank, vblank->exec_msc, vblank->target_msc,
|
vblank->event_id, vblank, vblank->exec_msc, vblank->target_msc,
|
||||||
|
@ -321,7 +322,10 @@ xwl_present_flip_notify_vblank(present_vblank_ptr vblank, uint64_t ust, uint64_t
|
||||||
|
|
||||||
xwl_present_window->flip_active = vblank;
|
xwl_present_window->flip_active = vblank;
|
||||||
|
|
||||||
present_vblank_notify(vblank, PresentCompleteKindPixmap, PresentCompleteModeFlip, ust, crtc_msc);
|
if (vblank->reason == PRESENT_FLIP_REASON_BUFFER_FORMAT)
|
||||||
|
mode = PresentCompleteModeSuboptimalCopy;
|
||||||
|
|
||||||
|
present_vblank_notify(vblank, PresentCompleteKindPixmap, mode, ust, crtc_msc);
|
||||||
|
|
||||||
if (vblank->abort_flip)
|
if (vblank->abort_flip)
|
||||||
xwl_present_flips_stop(window);
|
xwl_present_flips_stop(window);
|
||||||
|
@ -559,6 +563,27 @@ xwl_present_flush(WindowPtr window)
|
||||||
glamor_block_handler(window->drawable.pScreen);
|
glamor_block_handler(window->drawable.pScreen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
xwl_present_maybe_set_reason(struct xwl_window *xwl_window, PresentFlipReason *reason)
|
||||||
|
{
|
||||||
|
struct xwl_screen *xwl_screen = xwl_window->xwl_screen;
|
||||||
|
|
||||||
|
if (!reason || xwl_screen->dmabuf_protocol_version < 4)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (xwl_window->feedback.unprocessed_feedback_pending) {
|
||||||
|
xwl_window->feedback.unprocessed_feedback_pending = 0;
|
||||||
|
|
||||||
|
*reason = PRESENT_FLIP_REASON_BUFFER_FORMAT;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (xwl_screen->default_feedback.unprocessed_feedback_pending) {
|
||||||
|
xwl_screen->default_feedback.unprocessed_feedback_pending = 0;
|
||||||
|
|
||||||
|
*reason = PRESENT_FLIP_REASON_BUFFER_FORMAT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static Bool
|
static Bool
|
||||||
xwl_present_check_flip(RRCrtcPtr crtc,
|
xwl_present_check_flip(RRCrtcPtr crtc,
|
||||||
WindowPtr present_window,
|
WindowPtr present_window,
|
||||||
|
@ -579,6 +604,8 @@ xwl_present_check_flip(RRCrtcPtr crtc,
|
||||||
if (!xwl_window)
|
if (!xwl_window)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
xwl_present_maybe_set_reason(xwl_window, reason);
|
||||||
|
|
||||||
if (!crtc)
|
if (!crtc)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
|
|
@ -80,6 +80,13 @@ struct xwl_dmabuf_feedback {
|
||||||
int feedback_done;
|
int feedback_done;
|
||||||
int dev_formats_len;
|
int dev_formats_len;
|
||||||
struct xwl_device_formats *dev_formats;
|
struct xwl_device_formats *dev_formats;
|
||||||
|
/*
|
||||||
|
* This flag is used to identify if the feedback
|
||||||
|
* has been resent. If this is true, then the xwayland
|
||||||
|
* clients need to be sent PresentCompleteModeSuboptimalCopy
|
||||||
|
* to tell them to re-request modifiers.
|
||||||
|
*/
|
||||||
|
int unprocessed_feedback_pending;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct xwl_window {
|
struct xwl_window {
|
||||||
|
|
Loading…
Reference in New Issue