diff --git a/src/gallium/frontends/dri/loader_dri3_helper.c b/src/gallium/frontends/dri/loader_dri3_helper.c index 2c8caba08fd..0801e8b3d60 100644 --- a/src/gallium/frontends/dri/loader_dri3_helper.c +++ b/src/gallium/frontends/dri/loader_dri3_helper.c @@ -1091,10 +1091,35 @@ loader_dri3_swap_buffers_msc(struct loader_dri3_drawable *draw, * semantic" */ ++draw->send_sbc; - if (target_msc == 0 && divisor == 0 && remainder == 0) + if (target_msc == 0 && divisor == 0 && remainder == 0) { + /* Wait for previous send present request gets its complete event + * to update the window msc before send next present request. + * + * This is to prevent we send too many present requests before we + * get an up to date msc value from server when application + * start or pause for a while. Otherwise most of the sent + * request will be wasted as server just use the latest one and + * skip all the previous ones before a vblank. This also match the + * swap behavior for interval != 0. + * + * For example, client side window msc is 0 at the beginning, + * when swap interval=1, we will send present request with target + * msc = 1, 2, 3, ..., N, before server send back the complete + * event for target msc = 1. + * + * But server side window msc is way bigger than N, so it will + * think all these present requests are outdated and just show the + * Nth request at the next vblank. [1 .. N-1] requests are skipped. + */ + if (draw->swap_interval != 0) { + while (draw->recv_sbc + 1 != draw->send_sbc) { + if (!dri3_wait_for_event_locked(draw, NULL)) + break; + } + } target_msc = draw->msc + abs(draw->swap_interval) * (draw->send_sbc - draw->recv_sbc); - else if (divisor == 0 && remainder > 0) { + } else if (divisor == 0 && remainder > 0) { /* From the GLX_OML_sync_control spec: * "If = 0, the swap will occur when MSC becomes * greater than or equal to ." diff --git a/src/panfrost/ci/panfrost-g57-fails.txt b/src/panfrost/ci/panfrost-g57-fails.txt index 4a2c35a9186..5ba1a1555a4 100644 --- a/src/panfrost/ci/panfrost-g57-fails.txt +++ b/src/panfrost/ci/panfrost-g57-fails.txt @@ -57,8 +57,6 @@ spec@arb_texture_rg@fbo-blending-formats@GL_RG8,Fail spec@arb_texture_rg@fbo-blending-formats@GL_RG,Fail spec@arb_transform_feedback_instanced@draw-auto instanced,Fail spec@egl 1.4@eglterminate then unbind context,Fail -spec@egl_chromium_sync_control@conformance@eglGetSyncValuesCHROMIUM_msc_and_sbc_test,Fail -spec@egl_chromium_sync_control@conformance,Fail spec@egl_khr_gl_image@egl_khr_gl_renderbuffer_image-clear-shared-image gl_depth_component24,Fail spec@egl_khr_gl_image@egl_khr_gl_renderbuffer_image-clear-shared-image gl_rgba,Fail spec@egl_khr_surfaceless_context@viewport,Fail diff --git a/src/panfrost/ci/panfrost-g610-fails.txt b/src/panfrost/ci/panfrost-g610-fails.txt index 586eb748bdd..2d41912850a 100644 --- a/src/panfrost/ci/panfrost-g610-fails.txt +++ b/src/panfrost/ci/panfrost-g610-fails.txt @@ -211,8 +211,6 @@ spec@arb_texture_rg@fbo-blending-formats@GL_RG,Fail spec@arb_transform_feedback_instanced@draw-auto instanced,Fail spec@egl 1.4@egl-ext_egl_image_storage,Fail spec@egl 1.4@eglterminate then unbind context,Fail -spec@egl_chromium_sync_control@conformance@eglGetSyncValuesCHROMIUM_msc_and_sbc_test,Fail -spec@egl_chromium_sync_control@conformance,Fail spec@egl_khr_gl_image@egl_khr_gl_renderbuffer_image-clear-shared-image gl_depth_component24,Fail spec@egl_khr_gl_image@egl_khr_gl_renderbuffer_image-clear-shared-image gl_rgba,Fail spec@egl_khr_surfaceless_context@viewport,Fail