summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManuel Alfayate Corchete <redwindwanderer@gmail.com>2021-01-31 03:48:29 +0100
committerManuel Alfayate Corchete <redwindwanderer@gmail.com>2021-01-31 03:48:29 +0100
commit61798510f67860377b2f89519e78680ead75ddbd (patch)
treec7b6406e8bbc1ef083859f0dd85f6c882701fae0
parente0b09c94e88e9ca1023297c600c67276a84df2f3 (diff)
downloadsdl-61798510f67860377b2f89519e78680ead75ddbd.tar.gz
[KMS/DRM] Fix for bug #5518: only do async pageflips when hardware supports them.
-rw-r--r--src/video/kmsdrm/SDL_kmsdrmopengles.c2
-rw-r--r--src/video/kmsdrm/SDL_kmsdrmvideo.c8
-rw-r--r--src/video/kmsdrm/SDL_kmsdrmvideo.h5
3 files changed, 12 insertions, 3 deletions
diff --git a/src/video/kmsdrm/SDL_kmsdrmopengles.c b/src/video/kmsdrm/SDL_kmsdrmopengles.c
index 529eeeaf1..0053e5245 100644
--- a/src/video/kmsdrm/SDL_kmsdrmopengles.c
+++ b/src/video/kmsdrm/SDL_kmsdrmopengles.c
@@ -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
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;
}
diff --git a/src/video/kmsdrm/SDL_kmsdrmvideo.c b/src/video/kmsdrm/SDL_kmsdrmvideo.c
index 78ed3b2ce..b5fc16c40 100644
--- a/src/video/kmsdrm/SDL_kmsdrmvideo.c
+++ b/src/video/kmsdrm/SDL_kmsdrmvideo.c
@@ -653,6 +653,7 @@ int KMSDRM_InitDisplays (_THIS) {
SDL_VideoData *viddata = ((SDL_VideoData *)_this->driverdata);
drmModeRes *resources = NULL;
+ uint64_t async_pageflip = 0;
int ret = 0;
int i;
@@ -705,6 +706,13 @@ int KMSDRM_InitDisplays (_THIS) {
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. */
/***********************************/
diff --git a/src/video/kmsdrm/SDL_kmsdrmvideo.h b/src/video/kmsdrm/SDL_kmsdrmvideo.h
index 29cfc1833..31df3b9e4 100644
--- a/src/video/kmsdrm/SDL_kmsdrmvideo.h
+++ b/src/video/kmsdrm/SDL_kmsdrmvideo.h
@@ -41,8 +41,9 @@ typedef struct SDL_VideoData
struct gbm_device *gbm_dev;
- 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 video_init; /* Has VideoInit succeeded? */
+ 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;
int max_windows;