diff --git a/src/common/window_info.h b/src/common/window_info.h index 993e03782..258bd1783 100644 --- a/src/common/window_info.h +++ b/src/common/window_info.h @@ -29,6 +29,7 @@ struct WindowInfo void* window_handle = nullptr; u32 surface_width = 0; u32 surface_height = 0; + float surface_scale = 1.0f; SurfaceFormat surface_format = SurfaceFormat::RGB8; // Needed for macOS. diff --git a/src/duckstation-libretro/libretro_host_interface.cpp b/src/duckstation-libretro/libretro_host_interface.cpp index a1c98e4c5..e2c3b7d81 100644 --- a/src/duckstation-libretro/libretro_host_interface.cpp +++ b/src/duckstation-libretro/libretro_host_interface.cpp @@ -767,6 +767,7 @@ void LibretroHostInterface::SwitchToHardwareRenderer() wi.display_connection = &g_libretro_host_interface.m_hw_render_callback; wi.surface_width = avi.geometry.base_width; wi.surface_height = avi.geometry.base_height; + wi.surface_scale = 1.0f; if (!display || !display->CreateRenderDevice(wi, {}, g_libretro_host_interface.m_settings.gpu_use_debug_device)) { Log_ErrorPrintf("Failed to create hardware host display"); diff --git a/src/duckstation-qt/qtdisplaywidget.cpp b/src/duckstation-qt/qtdisplaywidget.cpp index 82a6eb0f3..013b5a2ac 100644 --- a/src/duckstation-qt/qtdisplaywidget.cpp +++ b/src/duckstation-qt/qtdisplaywidget.cpp @@ -86,6 +86,7 @@ std::optional QtDisplayWidget::getWindowInfo() const wi.surface_width = scaledWindowWidth(); wi.surface_height = scaledWindowHeight(); + wi.surface_scale = devicePixelRatioFromScreen(); wi.surface_format = WindowInfo::SurfaceFormat::RGB8; return wi; diff --git a/src/duckstation-sdl/sdl_host_interface.cpp b/src/duckstation-sdl/sdl_host_interface.cpp index 2c7cd8728..e7a56a027 100644 --- a/src/duckstation-sdl/sdl_host_interface.cpp +++ b/src/duckstation-sdl/sdl_host_interface.cpp @@ -47,36 +47,6 @@ ALWAYS_INLINE static TinyString GetWindowTitle() return TinyString::FromFormat("DuckStation %s (%s)", g_scm_tag_str, g_scm_branch_str); } -float SDLHostInterface::GetDPIScaleFactor(SDL_Window* window) -{ -#ifdef __APPLE__ - static constexpr float DEFAULT_DPI = 72.0f; -#else - static constexpr float DEFAULT_DPI = 96.0f; -#endif - - if (!window) - { - SDL_Window* dummy_window = SDL_CreateWindow("", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 1, 1, - SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_HIDDEN); - if (!dummy_window) - return 1.0f; - - const float scale = GetDPIScaleFactor(dummy_window); - - SDL_DestroyWindow(dummy_window); - - return scale; - } - - int display_index = SDL_GetWindowDisplayIndex(window); - float display_dpi = DEFAULT_DPI; - if (SDL_GetDisplayDPI(display_index, &display_dpi, nullptr, nullptr) != 0) - return 1.0f; - - return display_dpi / DEFAULT_DPI; -} - bool SDLHostInterface::CreateSDLWindow() { static constexpr u32 DEFAULT_WINDOW_WIDTH = 900; @@ -92,7 +62,7 @@ bool SDLHostInterface::CreateSDLWindow() #ifndef __APPLE__ { // scale by default monitor's DPI - float scale = GetDPIScaleFactor(nullptr); + float scale = SDLUtil::GetDPIScaleFactor(nullptr); window_width = static_cast(std::round(static_cast(window_width) * scale)); window_height = static_cast(std::round(static_cast(window_height) * scale)); } @@ -214,7 +184,7 @@ void SDLHostInterface::DestroyDisplay() void SDLHostInterface::CreateImGuiContext() { - const float framebuffer_scale = GetDPIScaleFactor(m_window); + const float framebuffer_scale = SDLUtil::GetDPIScaleFactor(m_window); ImGui::CreateContext(); ImGui::GetIO().IniFilename = nullptr; @@ -229,7 +199,7 @@ void SDLHostInterface::CreateImGuiContext() void SDLHostInterface::UpdateFramebufferScale() { - const float framebuffer_scale = GetDPIScaleFactor(m_window); + const float framebuffer_scale = SDLUtil::GetDPIScaleFactor(m_window); ImGui::GetIO().DisplayFramebufferScale.x = framebuffer_scale; ImGui::GetIO().DisplayFramebufferScale.y = framebuffer_scale; } diff --git a/src/duckstation-sdl/sdl_host_interface.h b/src/duckstation-sdl/sdl_host_interface.h index be42d6991..d5c165c17 100644 --- a/src/duckstation-sdl/sdl_host_interface.h +++ b/src/duckstation-sdl/sdl_host_interface.h @@ -60,8 +60,6 @@ protected: private: bool HasSystem() const { return static_cast(m_system); } - static float GetDPIScaleFactor(SDL_Window* window); - bool CreateSDLWindow(); void DestroySDLWindow(); bool CreateDisplay(); diff --git a/src/duckstation-sdl/sdl_util.cpp b/src/duckstation-sdl/sdl_util.cpp index 82a1b33cf..b70976878 100644 --- a/src/duckstation-sdl/sdl_util.cpp +++ b/src/duckstation-sdl/sdl_util.cpp @@ -32,6 +32,7 @@ std::optional GetWindowInfoForSDLWindow(SDL_Window* window) WindowInfo wi; wi.surface_width = static_cast(window_width); wi.surface_height = static_cast(window_height); + wi.surface_scale = GetDPIScaleFactor(window); wi.surface_format = WindowInfo::SurfaceFormat::RGB8; switch (syswm.subsystem) @@ -65,4 +66,34 @@ std::optional GetWindowInfoForSDLWindow(SDL_Window* window) return wi; } + +float GetDPIScaleFactor(SDL_Window* window) +{ +#ifdef __APPLE__ + static constexpr float DEFAULT_DPI = 72.0f; +#else + static constexpr float DEFAULT_DPI = 96.0f; +#endif + + if (!window) + { + SDL_Window* dummy_window = SDL_CreateWindow("", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 1, 1, + SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_HIDDEN); + if (!dummy_window) + return 1.0f; + + const float scale = GetDPIScaleFactor(dummy_window); + + SDL_DestroyWindow(dummy_window); + + return scale; + } + + int display_index = SDL_GetWindowDisplayIndex(window); + float display_dpi = DEFAULT_DPI; + if (SDL_GetDisplayDPI(display_index, &display_dpi, nullptr, nullptr) != 0) + return 1.0f; + + return display_dpi / DEFAULT_DPI; +} } // namespace SDLUtil \ No newline at end of file diff --git a/src/duckstation-sdl/sdl_util.h b/src/duckstation-sdl/sdl_util.h index ce00e7818..685df5e25 100644 --- a/src/duckstation-sdl/sdl_util.h +++ b/src/duckstation-sdl/sdl_util.h @@ -7,4 +7,5 @@ struct SDL_Window; namespace SDLUtil { std::optional GetWindowInfoForSDLWindow(SDL_Window* window); +float GetDPIScaleFactor(SDL_Window* window); } \ No newline at end of file