[KMS/DRM] Fix for bug #5518: only do async pageflips when hardware supports them.

This commit is contained in:
Manuel Alfayate Corchete 2021-01-31 03:48:29 +01:00
parent 79cd8cab08
commit bfa51c3845
3 changed files with 12 additions and 3 deletions

View File

@ -168,7 +168,7 @@ KMSDRM_GLES_SwapWindow(_THIS, SDL_Window * window) {
to do so, so even if we don't block on EGL, the flip will have completed to do so, so even if we don't block on EGL, the flip will have completed
when we get here again. */ when we get here again. */
if (_this->egl_data->egl_swapinterval == 0) { if (_this->egl_data->egl_swapinterval == 0 && viddata->async_pageflip_support) {
flip_flags |= DRM_MODE_PAGE_FLIP_ASYNC; flip_flags |= DRM_MODE_PAGE_FLIP_ASYNC;
} }

View File

@ -653,6 +653,7 @@ int KMSDRM_InitDisplays (_THIS) {
SDL_VideoData *viddata = ((SDL_VideoData *)_this->driverdata); SDL_VideoData *viddata = ((SDL_VideoData *)_this->driverdata);
drmModeRes *resources = NULL; drmModeRes *resources = NULL;
uint64_t async_pageflip = 0;
int ret = 0; int ret = 0;
int i; int i;
@ -705,6 +706,13 @@ int KMSDRM_InitDisplays (_THIS) {
goto cleanup; goto cleanup;
} }
/* Determine if video hardware supports async pageflips. */
ret = KMSDRM_drmGetCap(viddata->drm_fd, DRM_CAP_ASYNC_PAGE_FLIP, &async_pageflip);
if (ret) {
SDL_LogError(SDL_LOG_CATEGORY_VIDEO, "Could not determine async page flip capability.");
}
viddata->async_pageflip_support = async_pageflip ? SDL_TRUE : SDL_FALSE;
/***********************************/ /***********************************/
/* Block for Vulkan compatibility. */ /* Block for Vulkan compatibility. */
/***********************************/ /***********************************/

View File

@ -41,8 +41,9 @@ typedef struct SDL_VideoData
struct gbm_device *gbm_dev; struct gbm_device *gbm_dev;
SDL_bool video_init; /* Has VideoInit succeeded? */ SDL_bool video_init; /* Has VideoInit succeeded? */
SDL_bool vulkan_mode; /* Are we in Vulkan mode? One VK window is enough to be. */ SDL_bool vulkan_mode; /* Are we in Vulkan mode? One VK window is enough to be. */
SDL_bool async_pageflip_support; /* Does the hardware support async. pageflips? */
SDL_Window **windows; SDL_Window **windows;
int max_windows; int max_windows;