From d079130c24221d25a89b57f40f6452d62780cb17 Mon Sep 17 00:00:00 2001 From: Manuel Alfayate Corchete Date: Thu, 7 Jan 2021 18:44:34 +0100 Subject: [PATCH] [KMS/DRM] Don't use primary plane for scaling because that's unsupported on most LEGACY-only HW. --- .../SDL_kmsdrm_legacy_opengles.c | 27 ----------------- .../kmsdrm_legacy/SDL_kmsdrm_legacy_video.c | 29 ++++++++++++++++++- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/video/kmsdrm_legacy/SDL_kmsdrm_legacy_opengles.c b/src/video/kmsdrm_legacy/SDL_kmsdrm_legacy_opengles.c index bc3d58ae0..c4acd755e 100644 --- a/src/video/kmsdrm_legacy/SDL_kmsdrm_legacy_opengles.c +++ b/src/video/kmsdrm_legacy/SDL_kmsdrm_legacy_opengles.c @@ -135,33 +135,6 @@ KMSDRM_LEGACY_GLES_SwapWindow(_THIS, SDL_Window * window) { return 0; } - if (!windata->bo) { - /***************************************************************************/ - /* This is fundamental. */ - /* We can't display an fb smaller than the resolution currently configured */ - /* on the CRTC, because the CRTC would be scanning out of bounds. */ - /* So instead of using drmModeSetCrtc() to tell CRTC to scan the fb */ - /* directly, we use a plane (overlay or primary, doesn't mind if we */ - /* activated the UNVERSAL PLANES cap) to scale the buffer to the */ - /* resolution currently configured on the CRTC. */ - /* */ - /* We can't do this sooner, on CreateWindow(), because we don't have a */ - /* framebuffer there yet, and DRM doesn't like 0 or -1 as the fb_id. */ - /***************************************************************************/ - ret = KMSDRM_LEGACY_drmModeSetPlane(viddata->drm_fd, dispdata->plane_id, - dispdata->crtc->crtc_id, fb_info->fb_id, 0, - windata->output_x, 0, - windata->output_w, windata->output_h, - 0, 0, - windata->src_w << 16, windata->src_h << 16); - - if (ret) { - SDL_LogError(SDL_LOG_CATEGORY_VIDEO, "Could not set PLANE"); - } - - return 0; - } - /* Issue pageflip on the next front buffer. The pageflip will be done during the next vblank. */ ret = KMSDRM_LEGACY_drmModePageFlip(viddata->drm_fd, dispdata->crtc->crtc_id, diff --git a/src/video/kmsdrm_legacy/SDL_kmsdrm_legacy_video.c b/src/video/kmsdrm_legacy/SDL_kmsdrm_legacy_video.c index 5a9993d0d..b7607a357 100644 --- a/src/video/kmsdrm_legacy/SDL_kmsdrm_legacy_video.c +++ b/src/video/kmsdrm_legacy/SDL_kmsdrm_legacy_video.c @@ -411,7 +411,6 @@ VideoBootStrap KMSDRM_LEGACY_bootstrap = { KMSDRM_LEGACY_CreateDevice }; - static void KMSDRM_LEGACY_FBDestroyCallback(struct gbm_bo *bo, void *data) { @@ -1192,6 +1191,15 @@ KMSDRM_LEGACY_CreateWindow(_THIS, SDL_Window * window) See previous comment on why. */ window->flags |= SDL_WINDOW_OPENGL; + /* We need that the fb that SDL gives us has the same size as the videomode + currently configure on the CRTC, because the LEGACY interface doesn't + support scaling on the primary plane on most hardware (and overlay + planes are not present in all hw), so the CRTC reads the PRIMARY PLANE + without any scaling, and that's all. + So AR-correctin is also impossible on the LEGACY interface. */ + window->w = dispdata->mode.hdisplay; + window->h = dispdata->mode.vdisplay; + /* Reopen FD, create gbm dev, setup display plane, etc,. but only when we come here for the first time, and only if it's not a VK window. */ @@ -1266,6 +1274,25 @@ KMSDRM_LEGACY_CreateWindow(_THIS, SDL_Window * window) if ((ret = KMSDRM_LEGACY_CreateSurfaces(_this, window))) { goto cleanup; } + + /***************************************************************************/ + /* This is fundamental. */ + /* We can't display an fb smaller than the resolution currently configured */ + /* on the CRTC, because the CRTC would be scanning out of bounds, and */ + /* drmModeSetCrtc() would fail. */ + /* A possible solution would be scaling on the primary plane with */ + /* drmModeSetPlane(), but primary plane scaling is not supported in most */ + /* LEGACY-only hardware, so never use drmModeSetPlane(). */ + /***************************************************************************/ + + ret = KMSDRM_LEGACY_drmModeSetCrtc(viddata->drm_fd, dispdata->crtc->crtc_id, + /*fb_info->fb_id*/ -1, 0, 0, &dispdata->connector->connector_id, 1, + &dispdata->mode); + + if (ret) { + SDL_LogError(SDL_LOG_CATEGORY_VIDEO, "Could not set CRTC"); + goto cleanup; + } } /* Add window to the internal list of tracked windows. Note, while it may