Skip to content
  • Tomasz Figa's avatar
    egl/dri2: Implement swapInterval fallback in a conformant way (v2) · 23a09b4f
    Tomasz Figa authored
    
    
    dri2_fallback_swap_interval() currently used to stub out swap interval
    support in Android backend does nothing besides returning EGL_FALSE.
    This causes at least one known application (Android Snapchat) to fail
    due to an unexpected error and my loose interpretation of the EGL 1.5
    specification justifies it. Relevant quote below:
    
        The function
    
            EGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval);
    
        specifies the minimum number of video frame periods per buffer swap
        for the draw surface of the current context, for the current rendering
        API. [...]
    
        The parameter interval specifies the minimum number of video frames
        that are displayed before a buffer swap will occur. The interval
        specified by the function applies to the draw surface bound to the
        context that is current on the calling thread. [...] interval is
        silently clamped to minimum and maximum implementation dependent
        values before being stored; these values are defined by EGLConfig
        attributes EGL_MIN_SWAP_INTERVAL and EGL_MAX_SWAP_INTERVAL
        respectively.
    
        The default swap interval is 1.
    
    Even though it does not specify the exact behavior if the platform does
    not support changing the swap interval, the default assumed state is the
    swap interval of 1, which I interpret as a value that eglSwapInterval()
    should succeed if called with, even if there is no ability to change the
    interval (but there is no change requested). Moreover, since the
    behavior is defined to clamp the requested value to minimum and maximum
    and at least the default value of 1 must be present in the range, the
    implementation might be expected to have a valid range, which in case of
    the feature being unsupported, would correspond to {1} and any request
    might be expected to be clamped to this value.
    
    Fix this by defaulting dri2_dpy's min_swap_interval, max_swap_interval
    and default_swap_interval to 1 in dri2_setup_screen() and let platforms,
    which support this functionality set their own values after this
    function returns. Thanks to patches merged earlier, we can also remove
    the dri2_fallback_swap_interval() completely, as with a singular range
    it would not be called anyway.
    
    v2: Remove dri2_fallback_swap_interval() completely thanks to higher
        layer already clamping the requested interval and not calling the
        driver layer if the clamped value is the same as current.
    
    Signed-off-by: default avatarTomasz Figa <tfiga@chromium.org>
    Reviewed-by: default avatarEmil Velikov <emil.velikov@collabora.com>
    Reviewed-by: default avatarChad Versace <chadversary@chromium.org>
    Reviewed-by: default avatarTapani Pälli <tapani.palli@intel.com>
    23a09b4f