Przeglądaj źródła

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

Manuel Alfayate Corchete 4 lat temu
rodzic
commit
bfa51c3845

+ 1 - 1
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
        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;
     }
     }
 
 

+ 8 - 0
src/video/kmsdrm/SDL_kmsdrmvideo.c

@@ -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. */
     /***********************************/
     /***********************************/

+ 3 - 2
src/video/kmsdrm/SDL_kmsdrmvideo.h

@@ -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 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;
     SDL_Window **windows;
     int max_windows;
     int max_windows;