mirror of https://github.com/encounter/SDL.git
If a CRTC doesn't have a mode configured, use the preferred or largest mode as the default mode
Fixes https://github.com/libsdl-org/SDL/issues/6421
This commit is contained in:
parent
ea4ea27a59
commit
da9ba3a2a1
|
@ -666,8 +666,8 @@ KMSDRM_CrtcGetVrr(uint32_t drm_fd, uint32_t crtc_id)
|
||||||
/* Gets a DRM connector, builds an SDL_Display with it, and adds it to the
|
/* Gets a DRM connector, builds an SDL_Display with it, and adds it to the
|
||||||
list of SDL Displays in _this->displays[] */
|
list of SDL Displays in _this->displays[] */
|
||||||
static void
|
static void
|
||||||
KMSDRM_AddDisplay (_THIS, drmModeConnector *connector, drmModeRes *resources) {
|
KMSDRM_AddDisplay (_THIS, drmModeConnector *connector, drmModeRes *resources)
|
||||||
|
{
|
||||||
SDL_VideoData *viddata = ((SDL_VideoData *)_this->driverdata);
|
SDL_VideoData *viddata = ((SDL_VideoData *)_this->driverdata);
|
||||||
SDL_DisplayData *dispdata = NULL;
|
SDL_DisplayData *dispdata = NULL;
|
||||||
SDL_VideoDisplay display = {0};
|
SDL_VideoDisplay display = {0};
|
||||||
|
@ -770,14 +770,37 @@ KMSDRM_AddDisplay (_THIS, drmModeConnector *connector, drmModeRes *resources) {
|
||||||
drmModeModeInfo *mode = &connector->modes[i];
|
drmModeModeInfo *mode = &connector->modes[i];
|
||||||
|
|
||||||
if (!SDL_memcmp(mode, &crtc->mode, sizeof(crtc->mode))) {
|
if (!SDL_memcmp(mode, &crtc->mode, sizeof(crtc->mode))) {
|
||||||
mode_index = i;
|
mode_index = i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mode_index == -1) {
|
if (mode_index == -1) {
|
||||||
ret = SDL_SetError("Failed to find index of mode attached to the CRTC.");
|
int current_area, largest_area = 0;
|
||||||
goto cleanup;
|
|
||||||
|
/* Find the preferred mode or the highest resolution mode */
|
||||||
|
for (i = 0; i < connector->count_modes; i++) {
|
||||||
|
drmModeModeInfo *mode = &connector->modes[i];
|
||||||
|
|
||||||
|
if (mode->type & DRM_MODE_TYPE_PREFERRED) {
|
||||||
|
mode_index = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
current_area = mode->hdisplay * mode->vdisplay;
|
||||||
|
if (current_area > largest_area) {
|
||||||
|
mode_index = i;
|
||||||
|
largest_area = current_area;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (mode_index != -1) {
|
||||||
|
crtc->mode = connector->modes[mode_index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mode_index == -1) {
|
||||||
|
ret = SDL_SetError("Failed to find index of mode attached to the CRTC.");
|
||||||
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************/
|
/*********************************************/
|
||||||
|
|
Loading…
Reference in New Issue