Skip to content

Commit 54692a8

Browse files
committed
Qt: Only override with real/fractional scale on Metal renderer
Vulkan/MoltenVK can't handle it.
1 parent 1715143 commit 54692a8

File tree

4 files changed

+17
-8
lines changed

4 files changed

+17
-8
lines changed

src/duckstation-qt/displaywidget.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,13 @@ const std::optional<WindowInfo>& DisplayWidget::getWindowInfo(RenderAPI render_a
5656
if (!m_window_info.has_value())
5757
m_window_info = QtUtils::GetWindowInfoForWidget(this, render_api, error);
5858

59+
m_render_api = m_window_info.has_value() ? render_api : RenderAPI::None;
5960
return m_window_info;
6061
}
6162

6263
void DisplayWidget::clearWindowInfo()
6364
{
65+
m_render_api = RenderAPI::None;
6466
m_window_info.reset();
6567
}
6668

@@ -73,7 +75,7 @@ void DisplayWidget::checkForSizeChange()
7375
const u16 prev_width = m_window_info->surface_width;
7476
const u16 prev_height = m_window_info->surface_height;
7577
const float prev_scale = m_window_info->surface_scale;
76-
QtUtils::UpdateSurfaceSize(this, &m_window_info.value());
78+
QtUtils::UpdateSurfaceSize(this, m_render_api, &m_window_info.value());
7779
if (prev_width != m_window_info->surface_width || prev_height != m_window_info->surface_height ||
7880
prev_scale != m_window_info->surface_scale)
7981
{
@@ -517,6 +519,7 @@ const std::optional<WindowInfo>& AuxiliaryDisplayWidget::getWindowInfo(RenderAPI
517519
if (!m_window_info.has_value())
518520
m_window_info = QtUtils::GetWindowInfoForWidget(this, render_api, error);
519521

522+
m_render_api = m_window_info.has_value() ? render_api : RenderAPI::None;
520523
return m_window_info;
521524
}
522525

@@ -529,7 +532,7 @@ void AuxiliaryDisplayWidget::checkForSizeChange()
529532
const u16 prev_width = m_window_info->surface_width;
530533
const u16 prev_height = m_window_info->surface_height;
531534
const float prev_scale = m_window_info->surface_scale;
532-
QtUtils::UpdateSurfaceSize(this, &m_window_info.value());
535+
QtUtils::UpdateSurfaceSize(this, m_render_api, &m_window_info.value());
533536
if (prev_width != m_window_info->surface_width || prev_height != m_window_info->surface_height ||
534537
prev_scale != m_window_info->surface_scale)
535538
{

src/duckstation-qt/displaywidget.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#pragma once
55

66
#include "util/window_info.h"
7+
#include "util/gpu_types.h"
78

89
#include "common/types.h"
910

@@ -55,6 +56,8 @@ class DisplayWidget final : public QWidget
5556
bool isActuallyFullscreen() const;
5657
void updateCenterPos();
5758

59+
std::vector<int> m_keys_pressed_with_modifiers;
60+
5861
QPoint m_relative_mouse_start_pos{};
5962
QPoint m_relative_mouse_center_pos{};
6063
bool m_relative_mouse_enabled = false;
@@ -64,8 +67,7 @@ class DisplayWidget final : public QWidget
6467
bool m_cursor_hidden = false;
6568
bool m_destroying = false;
6669

67-
std::vector<int> m_keys_pressed_with_modifiers;
68-
70+
RenderAPI m_render_api = RenderAPI::None;
6971
std::optional<WindowInfo> m_window_info;
7072

7173
const char* m_window_position_key = nullptr;
@@ -109,5 +111,6 @@ class AuxiliaryDisplayWidget final : public QWidget
109111

110112
void* m_userdata = nullptr;
111113
std::optional<WindowInfo> m_window_info;
114+
RenderAPI m_render_api = RenderAPI::None;
112115
bool m_destroying = false;
113116
};

src/duckstation-qt/qtwindowinfo.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ std::optional<WindowInfo> QtUtils::GetWindowInfoForWidget(QWidget* widget, Rende
132132
}
133133
#endif
134134

135-
UpdateSurfaceSize(widget, &wi);
135+
UpdateSurfaceSize(widget, render_api, &wi);
136136

137137
// Query refresh rate, we need it for sync.
138138
Error refresh_rate_error;
@@ -156,7 +156,7 @@ std::optional<WindowInfo> QtUtils::GetWindowInfoForWidget(QWidget* widget, Rende
156156
return wi;
157157
}
158158

159-
void QtUtils::UpdateSurfaceSize(QWidget* widget, WindowInfo* wi)
159+
void QtUtils::UpdateSurfaceSize(QWidget* widget, RenderAPI render_api, WindowInfo* wi)
160160
{
161161
// Why this nonsense? Qt's device independent sizes are integer, and fractional scaling is lossy.
162162
// We can't get back the "real" size of the window. So we have to platform natively query the actual client size.
@@ -176,7 +176,10 @@ void QtUtils::UpdateSurfaceSize(QWidget* widget, WindowInfo* wi)
176176
wi->surface_width = static_cast<u16>(size->first);
177177
wi->surface_height = static_cast<u16>(size->second);
178178
wi->surface_scale = static_cast<float>(widget->devicePixelRatio());
179-
if (Core::GetBaseBoolSettingValue("Main", "UseFractionalWindowScale", true))
179+
180+
// Only use "real" fractional window scale for Metal renderer.
181+
// Vulkan returns suboptimal constantly, triggering swap chain recreations.
182+
if (render_api == RenderAPI::Metal && Core::GetBaseBoolSettingValue("Main", "UseFractionalWindowScale", true))
180183
{
181184
if (const std::optional<double> real_device_pixel_ratio = CocoaTools::GetViewRealScalingFactor(wi->window_handle))
182185
{

src/duckstation-qt/qtwindowinfo.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ std::optional<WindowInfo> GetWindowInfoForWidget(QWidget* widget, RenderAPI rend
2121

2222
/// Calculates the pixel size (real geometry) for a widget.
2323
/// Also sets the "real" DPR scale for the widget, ignoring any operating-system level downsampling.
24-
void UpdateSurfaceSize(QWidget* widget, WindowInfo* wi);
24+
void UpdateSurfaceSize(QWidget* widget, RenderAPI render_api, WindowInfo* wi);
2525

2626
/// Changes the screensaver inhibit state.
2727
bool SetScreensaverInhibit(bool inhibit, Error* error);

0 commit comments

Comments
 (0)