SDL: wayland: Add unscaled resolutions to the display mode list

From d785dab5fd284e3420fa09c3a004740dd05ed934 Mon Sep 17 00:00:00 2001
From: Ethan Lee <[EMAIL REDACTED]>
Date: Mon, 12 Apr 2021 23:37:53 -0400
Subject: [PATCH] wayland: Add unscaled resolutions to the display mode list

---
 src/video/wayland/SDL_waylandvideo.c | 27 ++++++++++++++++++++++++---
 1 file changed, 24 insertions(+), 3 deletions(-)

diff --git a/src/video/wayland/SDL_waylandvideo.c b/src/video/wayland/SDL_waylandvideo.c
index 0608f0fd6..e6dec5e53 100644
--- a/src/video/wayland/SDL_waylandvideo.c
+++ b/src/video/wayland/SDL_waylandvideo.c
@@ -265,12 +265,32 @@ display_handle_mode(void *data,
 {
     SDL_VideoDisplay *display = data;
     SDL_WaylandOutputData* driverdata = display->driverdata;
+    SDL_DisplayMode mode;
 
     if (flags & WL_OUTPUT_MODE_CURRENT) {
         driverdata->width = width;
         driverdata->height = height;
         driverdata->refresh = refresh;
     }
+
+    /* Note that the width/height are NOT multiplied by scale_factor!
+     * This is intentional and is designed to get the unscaled modes, which is
+     * important for high-DPI games intending to use the display mode as the
+     * target drawable size. The scaled desktop mode will be added at the end
+     * when display_handle_done is called (see below).
+     */
+    SDL_zero(mode);
+    mode.format = SDL_PIXELFORMAT_RGB888;
+    if (driverdata->transform & WL_OUTPUT_TRANSFORM_90) {
+        mode.w = height;
+        mode.h = width;
+    } else {
+        mode.w = width;
+        mode.h = height;
+    }
+    mode.refresh_rate = refresh / 1000; /* mHz to Hz */
+    mode.driverdata = driverdata->output;
+    SDL_AddDisplayMode(display, &mode);
 }
 
 static void
@@ -288,13 +308,14 @@ display_handle_done(void *data,
 
     SDL_zero(mode);
     mode.format = SDL_PIXELFORMAT_RGB888;
-    mode.w = driverdata->width / driverdata->scale_factor;
-    mode.h = driverdata->height / driverdata->scale_factor;
     if (driverdata->transform & WL_OUTPUT_TRANSFORM_90) {
        mode.w = driverdata->height / driverdata->scale_factor;
        mode.h = driverdata->width / driverdata->scale_factor;
+    } else {
+        mode.w = driverdata->width / driverdata->scale_factor;
+        mode.h = driverdata->height / driverdata->scale_factor;
     }
-    mode.refresh_rate = driverdata->refresh / 1000; // mHz to Hz
+    mode.refresh_rate = driverdata->refresh / 1000; /* mHz to Hz */
     mode.driverdata = driverdata->output;
     SDL_AddDisplayMode(display, &mode);
     display->current_mode = mode;