mirror of
https://github.com/Relintai/sdl2_frt.git
synced 2024-12-25 09:17:12 +01:00
[KMS/DRM] Don't use primary plane for scaling because that's unsupported on most LEGACY-only HW.
This commit is contained in:
parent
e23666f63e
commit
d079130c24
@ -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,
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user