• Mario Kleiner's avatar
    drm/radeon: Prevent too early kms-pageflips triggered by vblank. · f53f81b2
    Mario Kleiner authored
    Since 3.16-rc1 we have this new failure:
    
    When the userspace XOrg ddx schedules vblank events to
    trigger deferred kms-pageflips, e.g., via the OML_sync_control
    extension call glXSwapBuffersMscOML(), or if a glXSwapBuffers()
    is called immediately after completion of a previous swapbuffers
    call, e.g., in a tight rendering loop with minimal rendering,
    it happens frequently that the pageflip ioctl() is executed
    within the same vblank in which a previous kms-pageflip completed,
    or - for deferred swaps - always one vblank earlier than requested
    by the client app.
    
    This causes premature pageflips and detection of failure by
    the ddx, e.g., XOrg log warnings like...
    
    "(WW) RADEON(1): radeon_dri2_flip_event_handler: Pageflip
    completion event has impossible msc 201025 < target_msc 201026"
    
    ... and error/invalid return values of glXWaitForSbcOML() and
    Intel_swap_events extension.
    
    Reason is the new way in which kms-pageflips are programmed
    since 3.16.
    
    This commit changes the time window in which the hw can
    execute pending programmed pageflips. Before, a pending flip
    would get executed anywhere within the vblank interval. Now
    a pending flip only gets executed at the leading edge of
    vblank (start of front porch), making sure that a invocation
    of the pageflip ioctl() within a given vblank interval will
    only lead to pageflip completion in the following vblank.
    
    Tested to death on a DCE-4 card.
    Signed-off-by: default avatarMario Kleiner <mario.kleiner.de@gmail.com>
    Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
    f53f81b2
evergreen.c 172 KB