DRI2SwapBuffers: Fix uninitialized target SBC.
Fixes Piglit test "swapbuffersmsc-return swap_interval 0". Ensure that *swap_target gets initialized on any 'return Success' path, even if the swap request can't be completed by the driver and the server falls back to a simple blit. That path can also be triggered by setting swap_interval to 0, which disables sync to vertical retrace. We originally found this bug because for some reason SDL2 automatically sets swap_interval to 0, when we were trying to test OML_sync_control in an SDL2 test application. We then discovered that the above-mentioned Piglit test has been failing for the same reason since it was introduced. Signed-off-by: Jamey Sharp <jamey@minilop.net> Signed-off-by: Theo Hill <Theo0x48@gmail.com> Reviewed-by: Keith Packard <keithp@keithp.com> Reviewed-by: Eric Anholt <eric@anholt.net> Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
parent
4927af4475
commit
138bf5ac97
|
@ -1092,6 +1092,14 @@ DRI2SwapBuffers(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc,
|
||||||
return BadDrawable;
|
return BadDrawable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* According to spec, return expected swapbuffers count SBC after this swap
|
||||||
|
* will complete. This is ignored unless we return Success, but it must be
|
||||||
|
* initialized on every path where we return Success or the caller will send
|
||||||
|
* an uninitialized value off the stack to the client. So let's initialize
|
||||||
|
* it as early as possible, just to be sure.
|
||||||
|
*/
|
||||||
|
*swap_target = pPriv->swap_count + pPriv->swapsPending + 1;
|
||||||
|
|
||||||
for (i = 0; i < pPriv->bufferCount; i++) {
|
for (i = 0; i < pPriv->bufferCount; i++) {
|
||||||
if (pPriv->buffers[i]->attachment == DRI2BufferFrontLeft)
|
if (pPriv->buffers[i]->attachment == DRI2BufferFrontLeft)
|
||||||
pDestBuffer = (DRI2BufferPtr) pPriv->buffers[i];
|
pDestBuffer = (DRI2BufferPtr) pPriv->buffers[i];
|
||||||
|
@ -1165,11 +1173,6 @@ DRI2SwapBuffers(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc,
|
||||||
|
|
||||||
pPriv->last_swap_target = target_msc;
|
pPriv->last_swap_target = target_msc;
|
||||||
|
|
||||||
/* According to spec, return expected swapbuffers count SBC after this swap
|
|
||||||
* will complete.
|
|
||||||
*/
|
|
||||||
*swap_target = pPriv->swap_count + pPriv->swapsPending;
|
|
||||||
|
|
||||||
DRI2InvalidateDrawableAll(pDraw);
|
DRI2InvalidateDrawableAll(pDraw);
|
||||||
|
|
||||||
return Success;
|
return Success;
|
||||||
|
|
Loading…
Reference in New Issue