From 9316a8d9790fcec1f39fbd7aadd1215002fc03f6 Mon Sep 17 00:00:00 2001 From: Manuel Alfayate Corchete Date: Tue, 25 Aug 2020 16:18:49 +0200 Subject: [PATCH] kmsdrm: move FENCE FD props setting to SwapWindow(), where it belongs. --- src/video/kmsdrm/SDL_kmsdrmopengles.c | 12 ++++++++++++ src/video/kmsdrm/SDL_kmsdrmvideo.c | 20 ++++---------------- src/video/kmsdrm/SDL_kmsdrmvideo.h | 2 ++ 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/video/kmsdrm/SDL_kmsdrmopengles.c b/src/video/kmsdrm/SDL_kmsdrmopengles.c index d79608cf4..ace179006 100644 --- a/src/video/kmsdrm/SDL_kmsdrmopengles.c +++ b/src/video/kmsdrm/SDL_kmsdrmopengles.c @@ -151,6 +151,18 @@ KMSDRM_GLES_SwapWindow(_THIS, SDL_Window * window) return SDL_SetError("Failed to request prop changes for setting plane buffer and CRTC"); } + /* Set the IN_FENCE and OUT_FENCE props only here, since this is the only place + on which we're interested in managing who and when should access the buffers + that the display plane uses, and that's what these props are for. */ + if (dispdata->kms_in_fence_fd != -1) + { + if (add_crtc_property(dispdata->atomic_req, dispdata->crtc, "OUT_FENCE_PTR", + VOID2U64(&dispdata->kms_out_fence_fd)) < 0) + return SDL_SetError("Failed to set CRTC OUT_FENCE_PTR prop"); + if (add_plane_property(dispdata->atomic_req, dispdata->display_plane, "IN_FENCE_FD", dispdata->kms_in_fence_fd) < 0) + return SDL_SetError("Failed to set plane IN_FENCE_FD prop"); + } + /* Issue the one and only atomic commit where all changes will be requested!. We need e a non-blocking atomic commit for triple buffering, because we must not block on this atomic commit so we can re-enter program loop once more. */ diff --git a/src/video/kmsdrm/SDL_kmsdrmvideo.c b/src/video/kmsdrm/SDL_kmsdrmvideo.c index feae6cebb..dbb7223d4 100644 --- a/src/video/kmsdrm/SDL_kmsdrmvideo.c +++ b/src/video/kmsdrm/SDL_kmsdrmvideo.c @@ -150,7 +150,7 @@ get_driindex(void) #define VOID2U64(x) ((uint64_t)(unsigned long)(x)) static int add_connector_property(drmModeAtomicReq *req, struct connector *connector, - const char *name, uint64_t value) + const char *name, uint64_t value) { unsigned int i; int prop_id = 0; @@ -170,8 +170,8 @@ static int add_connector_property(drmModeAtomicReq *req, struct connector *conne return KMSDRM_drmModeAtomicAddProperty(req, connector->connector->connector_id, prop_id, value); } -static int add_crtc_property(drmModeAtomicReq *req, struct crtc *crtc, - const char *name, uint64_t value) +int add_crtc_property(drmModeAtomicReq *req, struct crtc *crtc, + const char *name, uint64_t value) { unsigned int i; int prop_id = -1; @@ -192,7 +192,7 @@ static int add_crtc_property(drmModeAtomicReq *req, struct crtc *crtc, } int add_plane_property(drmModeAtomicReq *req, struct plane *plane, - const char *name, uint64_t value) + const char *name, uint64_t value) { unsigned int i; int prop_id = -1; @@ -493,18 +493,6 @@ drm_atomic_set_plane_props(struct KMSDRM_PlaneInfo *info) if (add_plane_property(dispdata->atomic_req, info->plane, "CRTC_Y", info->crtc_y) < 0) return SDL_SetError("Failed to set plane CRTC_Y prop"); - /* Set the IN_FENCE and OUT_FENCE props only if we're operating on the display plane, - since that's the only plane for which we manage who and when should access the buffers - it uses. */ - if (info->plane == dispdata->display_plane && dispdata->kms_in_fence_fd != -1) - { - if (add_crtc_property(dispdata->atomic_req, dispdata->crtc, "OUT_FENCE_PTR", - VOID2U64(&dispdata->kms_out_fence_fd)) < 0) - return SDL_SetError("Failed to set CRTC OUT_FENCE_PTR prop"); - if (add_plane_property(dispdata->atomic_req, info->plane, "IN_FENCE_FD", dispdata->kms_in_fence_fd) < 0) - return SDL_SetError("Failed to set plane IN_FENCE_FD prop"); - } - return 0; } diff --git a/src/video/kmsdrm/SDL_kmsdrmvideo.h b/src/video/kmsdrm/SDL_kmsdrmvideo.h index 102c2fdd2..fcc33a79e 100644 --- a/src/video/kmsdrm/SDL_kmsdrmvideo.h +++ b/src/video/kmsdrm/SDL_kmsdrmvideo.h @@ -161,6 +161,8 @@ void drm_atomic_waitpending(_THIS); int drm_atomic_commit(_THIS, SDL_bool blocking); int add_plane_property(drmModeAtomicReq *req, struct plane *plane, const char *name, uint64_t value); +int add_crtc_property(drmModeAtomicReq *req, struct crtc *crtc, + const char *name, uint64_t value); int setup_plane(_THIS, struct plane **plane, uint32_t plane_type); void free_plane(struct plane **plane);