Skip to content

Commit

Permalink
sdl: support HiDPI on wayland
Browse files Browse the repository at this point in the history
  • Loading branch information
hch12907 committed Jun 30, 2023
1 parent 42d4b5d commit 1b5d8f3
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 5 deletions.
2 changes: 1 addition & 1 deletion Core/Core.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ bool UpdateScreenScale(int width, int height) {
float g_logical_dpi = System_GetPropertyFloat(SYSPROP_DISPLAY_LOGICAL_DPI);
g_display.dpi_scale_x = g_logical_dpi / g_display.dpi;
g_display.dpi_scale_y = g_logical_dpi / g_display.dpi;
#elif PPSSPP_PLATFORM(WINDOWS) && !PPSSPP_PLATFORM(UWP)
#elif (PPSSPP_PLATFORM(WINDOWS) && !PPSSPP_PLATFORM(UWP)) || PPSSPP_PLATFORM(LINUX)
g_display.dpi = System_GetPropertyFloat(SYSPROP_DISPLAY_DPI);
g_display.dpi_scale_x = 96.0f / g_display.dpi;
g_display.dpi_scale_y = 96.0f / g_display.dpi;
Expand Down
42 changes: 38 additions & 4 deletions SDL/SDLMain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,12 @@ SDLJoystick *joystick = NULL;
#include "SDLGLGraphicsContext.h"
#include "SDLVulkanGraphicsContext.h"

#if PPSSPP_PLATFORM(MAC)
#include "SDL2/SDL_vulkan.h"
#else
#include "SDL_vulkan.h"
#endif

#if PPSSPP_PLATFORM(MAC) || PPSSPP_PLATFORM(IOS)
#include "UI/DarwinFileSystemServices.h"
#endif
Expand All @@ -85,6 +91,7 @@ static bool g_RestartRequested = false;

static int g_DesktopWidth = 0;
static int g_DesktopHeight = 0;
static float g_DesktopDPI = 1.0f;
static float g_RefreshRate = 60.f;
static int g_sampleRate = 44100;

Expand Down Expand Up @@ -173,6 +180,20 @@ static void StopSDLAudioDevice() {
}
}

static void UpdateScreenDPI(SDL_Window *window) {
int drawable_width, window_width;
SDL_GetWindowSize(window, &window_width, NULL);

if (g_Config.iGPUBackend == (int)GPUBackend::OPENGL)
SDL_GL_GetDrawableSize(window, &drawable_width, NULL);
else if (g_Config.iGPUBackend == (int)GPUBackend::VULKAN)
SDL_Vulkan_GetDrawableSize(window, &drawable_width, NULL);

// Round up a little otherwise there would be a gap sometimes
// in fractional scaling
g_DesktopDPI = ((float) drawable_width + 0.5) / window_width;
}

// Simple implementations of System functions


Expand Down Expand Up @@ -493,6 +514,8 @@ float System_GetPropertyFloat(SystemProperty prop) {
switch (prop) {
case SYSPROP_DISPLAY_REFRESH_RATE:
return g_RefreshRate;
case SYSPROP_DISPLAY_DPI:
return g_DesktopDPI * 96.0;
case SYSPROP_DISPLAY_SAFE_INSET_LEFT:
case SYSPROP_DISPLAY_SAFE_INSET_RIGHT:
case SYSPROP_DISPLAY_SAFE_INSET_TOP:
Expand Down Expand Up @@ -776,7 +799,7 @@ int main(int argc, char *argv[]) {
#elif defined(USING_FBDEV) || PPSSPP_PLATFORM(SWITCH)
mode |= SDL_WINDOW_FULLSCREEN_DESKTOP;
#else
mode |= SDL_WINDOW_RESIZABLE;
mode |= SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI;
#endif

if (mode & SDL_WINDOW_FULLSCREEN_DESKTOP) {
Expand Down Expand Up @@ -904,6 +927,8 @@ int main(int argc, char *argv[]) {
#endif
}

UpdateScreenDPI(window);

bool useEmuThread = g_Config.iGPUBackend == (int)GPUBackend::OPENGL;

SDL_SetWindowTitle(window, (app_name_nice + " " + PPSSPP_GIT_VERSION).c_str());
Expand Down Expand Up @@ -1003,8 +1028,8 @@ int main(int argc, char *argv[]) {
}
SDL_Event event, touchEvent;
while (SDL_PollEvent(&event)) {
float mx = event.motion.x * g_display.dpi_scale_x;
float my = event.motion.y * g_display.dpi_scale_y;
float mx = event.motion.x;
float my = event.motion.y;

switch (event.type) {
case SDL_QUIT:
Expand All @@ -1019,19 +1044,28 @@ int main(int argc, char *argv[]) {
int new_width = event.window.data1;
int new_height = event.window.data2;

// The size given by SDL is in point-units, convert these to
// pixels before passing to UpdateScreenScale()
int new_width_px = new_width * g_DesktopDPI;
int new_height_px = new_height * g_DesktopDPI;

windowHidden = false;
Core_NotifyWindowHidden(windowHidden);

Uint32 window_flags = SDL_GetWindowFlags(window);
bool fullscreen = (window_flags & SDL_WINDOW_FULLSCREEN);

// This one calls NativeResized if the size changed.
UpdateScreenScale(new_width, new_height);
UpdateScreenScale(new_width_px, new_height_px);

// Set variable here in case fullscreen was toggled by hotkey
if (g_Config.UseFullScreen() != fullscreen) {
g_Config.bFullScreen = fullscreen;
g_Config.iForceFullScreen = -1;
} else {
// It is possible for the monitor to change DPI, so recalculate
// DPI on each resize event.
UpdateScreenDPI(window);
}

if (!g_Config.bFullScreen) {
Expand Down

0 comments on commit 1b5d8f3

Please sign in to comment.