diff options
author | Mario Kleiner <[email protected]> | 2014-12-05 08:42:32 +0100 |
---|---|---|
committer | Emil Velikov <[email protected]> | 2014-12-14 15:35:15 +0000 |
commit | da8cde2f21672a76e7a7cf3345d0d9ed1543ebaa (patch) | |
tree | 571fae5212db38611a1f70cd11ed29dfd3948d6f /src | |
parent | d332e5046e3b8cd92a819f2d9c9ca976f0f4eb0c (diff) |
glx/dri3: Don't fail on glXSwapBuffersMscOML(dpy, window, 0, 0, 0) (v2)
glXSwapBuffersMscOML() with target_msc=divisor=remainder=0 gets
translated into target_msc=divisor=0 but remainder=1 by the mesa
api. This is done for server DRI2 where there needs to be a way
to tell the server-side DRI2ScheduleSwap implementation if a call
to glXSwapBuffers() or glXSwapBuffersMscOML(dpy,window,0,0,0) was
done. remainder = 1 was (ab)used as a flag to tell the server to
select proper semantic. The DRI3/Present backend ignored this
signalling, treated any target_msc=0 as glXSwapBuffers() request,
and called xcb_present_pixmap with invalid divisor=0, remainder=1
combo. The present extension responded kindly to this with a
BadValue error and dropped the request, but mesa's DRI3/Present
backend doesn't check for error codes. From there on stuff went
downhill quickly for the calling OpenGL client...
This patch fixes the problem.
v2: Change comments to be more clear, with reference to
relevant spec, as suggested by Eric Anholt.
Cc: "10.3 10.4" <[email protected]>
Signed-off-by: Mario Kleiner <[email protected]>
Reviewed-by: Axel Davy <[email protected]>
Reviewed-by: Eric Anholt <[email protected]>
(cherry picked from commit 0d7f4c8658e00d30a1b0c3f2d803378eaa0717c7)
Diffstat (limited to 'src')
-rw-r--r-- | src/glx/dri3_glx.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c index 9b30c96742a..c542df39e0f 100644 --- a/src/glx/dri3_glx.c +++ b/src/glx/dri3_glx.c @@ -1517,11 +1517,24 @@ dri3_swap_buffers(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor, dri3_fence_reset(c, back); /* Compute when we want the frame shown by taking the last known successful - * MSC and adding in a swap interval for each outstanding swap request + * MSC and adding in a swap interval for each outstanding swap request. + * target_msc=divisor=remainder=0 means "Use glXSwapBuffers() semantic" */ ++priv->send_sbc; - if (target_msc == 0) + if (target_msc == 0 && divisor == 0 && remainder == 0) target_msc = priv->msc + priv->swap_interval * (priv->send_sbc - priv->recv_sbc); + else if (divisor == 0 && remainder > 0) { + /* From the GLX_OML_sync_control spec: + * + * "If <divisor> = 0, the swap will occur when MSC becomes + * greater than or equal to <target_msc>." + * + * Note that there's no mention of the remainder. The Present extension + * throws BadValue for remainder != 0 with divisor == 0, so just drop + * the passed in value. + */ + remainder = 0; + } /* From the GLX_EXT_swap_control spec: * |