early-access version 3330
This commit is contained in:
parent
ebe91be572
commit
53381ff153
@ -1,7 +1,7 @@
|
|||||||
yuzu emulator early access
|
yuzu emulator early access
|
||||||
=============
|
=============
|
||||||
|
|
||||||
This is the source code for early-access 3329.
|
This is the source code for early-access 3330.
|
||||||
|
|
||||||
## Legal Notice
|
## Legal Notice
|
||||||
|
|
||||||
|
@ -11,6 +11,8 @@
|
|||||||
|
|
||||||
#ifdef __cpp_lib_jthread
|
#ifdef __cpp_lib_jthread
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
#include <condition_variable>
|
||||||
#include <stop_token>
|
#include <stop_token>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
|
||||||
@ -21,11 +23,23 @@ void CondvarWait(Condvar& cv, Lock& lock, std::stop_token token, Pred&& pred) {
|
|||||||
cv.wait(lock, token, std::move(pred));
|
cv.wait(lock, token, std::move(pred));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename Rep, typename Period>
|
||||||
|
bool StoppableTimedWait(std::stop_token token, const std::chrono::duration<Rep, Period>& rel_time) {
|
||||||
|
std::condition_variable_any cv;
|
||||||
|
std::mutex m;
|
||||||
|
|
||||||
|
// Perform the timed wait.
|
||||||
|
std::unique_lock lk{m};
|
||||||
|
return !cv.wait_for(lk, token, rel_time, [&] { return token.stop_requested(); });
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Common
|
} // namespace Common
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
|
#include <chrono>
|
||||||
|
#include <condition_variable>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
@ -318,6 +332,28 @@ void CondvarWait(Condvar& cv, Lock& lock, std::stop_token token, Pred pred) {
|
|||||||
cv.wait(lock, [&] { return pred() || token.stop_requested(); });
|
cv.wait(lock, [&] { return pred() || token.stop_requested(); });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename Rep, typename Period>
|
||||||
|
bool StoppableTimedWait(std::stop_token token, const std::chrono::duration<Rep, Period>& rel_time) {
|
||||||
|
if (token.stop_requested()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool stop_requested = false;
|
||||||
|
std::condition_variable cv;
|
||||||
|
std::mutex m;
|
||||||
|
|
||||||
|
std::stop_callback cb(token, [&] {
|
||||||
|
// Wake up the waiting thread.
|
||||||
|
std::unique_lock lk{m};
|
||||||
|
stop_requested = true;
|
||||||
|
cv.notify_one();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Perform the timed wait.
|
||||||
|
std::unique_lock lk{m};
|
||||||
|
return !cv.wait_for(lk, rel_time, [&] { return stop_requested; });
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Common
|
} // namespace Common
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
#include "common/param_package.h"
|
#include "common/param_package.h"
|
||||||
|
#include "common/polyfill_thread.h"
|
||||||
#include "common/settings_input.h"
|
#include "common/settings_input.h"
|
||||||
#include "common/thread.h"
|
#include "common/thread.h"
|
||||||
#include "input_common/drivers/gc_adapter.h"
|
#include "input_common/drivers/gc_adapter.h"
|
||||||
@ -217,8 +218,7 @@ void GCAdapter::AdapterScanThread(std::stop_token stop_token) {
|
|||||||
Common::SetCurrentThreadName("ScanGCAdapter");
|
Common::SetCurrentThreadName("ScanGCAdapter");
|
||||||
usb_adapter_handle = nullptr;
|
usb_adapter_handle = nullptr;
|
||||||
pads = {};
|
pads = {};
|
||||||
while (!stop_token.stop_requested() && !Setup()) {
|
while (!Setup() && Common::StoppableTimedWait(stop_token, std::chrono::seconds{2})) {
|
||||||
std::this_thread::sleep_for(std::chrono::seconds(2));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
#include "common/param_package.h"
|
#include "common/param_package.h"
|
||||||
#include "common/polyfill_ranges.h"
|
#include "common/polyfill_ranges.h"
|
||||||
|
#include "common/polyfill_thread.h"
|
||||||
#include "common/settings.h"
|
#include "common/settings.h"
|
||||||
#include "common/thread.h"
|
#include "common/thread.h"
|
||||||
#include "input_common/drivers/joycon.h"
|
#include "input_common/drivers/joycon.h"
|
||||||
@ -67,7 +68,8 @@ void Joycons::Setup() {
|
|||||||
void Joycons::ScanThread(std::stop_token stop_token) {
|
void Joycons::ScanThread(std::stop_token stop_token) {
|
||||||
constexpr u16 nintendo_vendor_id = 0x057e;
|
constexpr u16 nintendo_vendor_id = 0x057e;
|
||||||
Common::SetCurrentThreadName("JoyconScanThread");
|
Common::SetCurrentThreadName("JoyconScanThread");
|
||||||
while (!stop_token.stop_requested()) {
|
|
||||||
|
do {
|
||||||
SDL_hid_device_info* devs = SDL_hid_enumerate(nintendo_vendor_id, 0x0);
|
SDL_hid_device_info* devs = SDL_hid_enumerate(nintendo_vendor_id, 0x0);
|
||||||
SDL_hid_device_info* cur_dev = devs;
|
SDL_hid_device_info* cur_dev = devs;
|
||||||
|
|
||||||
@ -81,8 +83,7 @@ void Joycons::ScanThread(std::stop_token stop_token) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SDL_hid_free_enumeration(devs);
|
SDL_hid_free_enumeration(devs);
|
||||||
std::this_thread::sleep_for(std::chrono::seconds(5));
|
} while (Common::StoppableTimedWait(stop_token, std::chrono::seconds{5}));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Joycons::IsDeviceNew(SDL_hid_device_info* device_info) const {
|
bool Joycons::IsDeviceNew(SDL_hid_device_info* device_info) const {
|
||||||
|
@ -575,7 +575,7 @@ void QtSoftwareKeyboardDialog::MoveAndResizeWindow(QPoint pos, QSize size) {
|
|||||||
QDialog::resize(size);
|
QDialog::resize(size);
|
||||||
|
|
||||||
// High DPI
|
// High DPI
|
||||||
const float dpi_scale = qApp->screenAt(pos)->logicalDotsPerInch() / 96.0f;
|
const float dpi_scale = screen()->logicalDotsPerInch() / 96.0f;
|
||||||
|
|
||||||
RescaleKeyboardElements(size.width(), size.height(), dpi_scale);
|
RescaleKeyboardElements(size.width(), size.height(), dpi_scale);
|
||||||
}
|
}
|
||||||
|
@ -680,8 +680,10 @@ void GMainWindow::SoftwareKeyboardShowNormal() {
|
|||||||
const auto y = layout.screen.top;
|
const auto y = layout.screen.top;
|
||||||
const auto w = layout.screen.GetWidth();
|
const auto w = layout.screen.GetWidth();
|
||||||
const auto h = layout.screen.GetHeight();
|
const auto h = layout.screen.GetHeight();
|
||||||
|
const auto scale_ratio = devicePixelRatioF();
|
||||||
|
|
||||||
software_keyboard->ShowNormalKeyboard(render_window->mapToGlobal(QPoint(x, y)), QSize(w, h));
|
software_keyboard->ShowNormalKeyboard(render_window->mapToGlobal(QPoint(x, y) / scale_ratio),
|
||||||
|
QSize(w, h) / scale_ratio);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GMainWindow::SoftwareKeyboardShowTextCheck(
|
void GMainWindow::SoftwareKeyboardShowTextCheck(
|
||||||
@ -714,9 +716,11 @@ void GMainWindow::SoftwareKeyboardShowInline(
|
|||||||
(1.0f - appear_parameters.key_top_scale_y))));
|
(1.0f - appear_parameters.key_top_scale_y))));
|
||||||
const auto w = static_cast<int>(layout.screen.GetWidth() * appear_parameters.key_top_scale_x);
|
const auto w = static_cast<int>(layout.screen.GetWidth() * appear_parameters.key_top_scale_x);
|
||||||
const auto h = static_cast<int>(layout.screen.GetHeight() * appear_parameters.key_top_scale_y);
|
const auto h = static_cast<int>(layout.screen.GetHeight() * appear_parameters.key_top_scale_y);
|
||||||
|
const auto scale_ratio = devicePixelRatioF();
|
||||||
|
|
||||||
software_keyboard->ShowInlineKeyboard(std::move(appear_parameters),
|
software_keyboard->ShowInlineKeyboard(std::move(appear_parameters),
|
||||||
render_window->mapToGlobal(QPoint(x, y)), QSize(w, h));
|
render_window->mapToGlobal(QPoint(x, y) / scale_ratio),
|
||||||
|
QSize(w, h) / scale_ratio);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GMainWindow::SoftwareKeyboardHideInline() {
|
void GMainWindow::SoftwareKeyboardHideInline() {
|
||||||
@ -796,10 +800,11 @@ void GMainWindow::WebBrowserOpenWebPage(const std::string& main_url,
|
|||||||
}
|
}
|
||||||
|
|
||||||
const auto& layout = render_window->GetFramebufferLayout();
|
const auto& layout = render_window->GetFramebufferLayout();
|
||||||
web_browser_view.resize(layout.screen.GetWidth(), layout.screen.GetHeight());
|
const auto scale_ratio = devicePixelRatioF();
|
||||||
web_browser_view.move(layout.screen.left, layout.screen.top + menuBar()->height());
|
web_browser_view.resize(layout.screen.GetWidth() / scale_ratio,
|
||||||
web_browser_view.setZoomFactor(static_cast<qreal>(layout.screen.GetWidth()) /
|
layout.screen.GetHeight() / scale_ratio);
|
||||||
static_cast<qreal>(Layout::ScreenUndocked::Width));
|
web_browser_view.move(layout.screen.left / scale_ratio,
|
||||||
|
(layout.screen.top / scale_ratio) + menuBar()->height());
|
||||||
|
|
||||||
web_browser_view.setFocus();
|
web_browser_view.setFocus();
|
||||||
web_browser_view.show();
|
web_browser_view.show();
|
||||||
@ -4399,6 +4404,55 @@ void GMainWindow::changeEvent(QEvent* event) {
|
|||||||
#undef main
|
#undef main
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void SetHighDPIAttributes() {
|
||||||
|
#ifdef _WIN32
|
||||||
|
// For Windows, we want to avoid scaling artifacts on fractional scaling ratios.
|
||||||
|
// This is done by setting the optimal scaling policy for the primary screen.
|
||||||
|
|
||||||
|
// Create a temporary QApplication.
|
||||||
|
int temp_argc = 0;
|
||||||
|
char** temp_argv = nullptr;
|
||||||
|
QApplication temp{temp_argc, temp_argv};
|
||||||
|
|
||||||
|
// Get the current screen geometry.
|
||||||
|
const QScreen* primary_screen = QGuiApplication::primaryScreen();
|
||||||
|
if (primary_screen == nullptr) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const QRect screen_rect = primary_screen->geometry();
|
||||||
|
const int real_width = screen_rect.width();
|
||||||
|
const int real_height = screen_rect.height();
|
||||||
|
const float real_ratio = primary_screen->logicalDotsPerInch() / 96.0f;
|
||||||
|
|
||||||
|
// Recommended minimum width and height for proper window fit.
|
||||||
|
// Any screen with a lower resolution than this will still have a scale of 1.
|
||||||
|
constexpr float minimum_width = 1350.0f;
|
||||||
|
constexpr float minimum_height = 900.0f;
|
||||||
|
|
||||||
|
const float width_ratio = std::max(1.0f, real_width / minimum_width);
|
||||||
|
const float height_ratio = std::max(1.0f, real_height / minimum_height);
|
||||||
|
|
||||||
|
// Get the lower of the 2 ratios and truncate, this is the maximum integer scale.
|
||||||
|
const float max_ratio = std::trunc(std::min(width_ratio, height_ratio));
|
||||||
|
|
||||||
|
if (max_ratio > real_ratio) {
|
||||||
|
QApplication::setHighDpiScaleFactorRoundingPolicy(
|
||||||
|
Qt::HighDpiScaleFactorRoundingPolicy::Round);
|
||||||
|
} else {
|
||||||
|
QApplication::setHighDpiScaleFactorRoundingPolicy(
|
||||||
|
Qt::HighDpiScaleFactorRoundingPolicy::Floor);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
// Other OSes should be better than Windows at fractional scaling.
|
||||||
|
QApplication::setHighDpiScaleFactorRoundingPolicy(
|
||||||
|
Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
|
||||||
|
QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char* argv[]) {
|
int main(int argc, char* argv[]) {
|
||||||
std::unique_ptr<Config> config = std::make_unique<Config>();
|
std::unique_ptr<Config> config = std::make_unique<Config>();
|
||||||
bool has_broken_vulkan = false;
|
bool has_broken_vulkan = false;
|
||||||
@ -4454,11 +4508,16 @@ int main(int argc, char* argv[]) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Disables the "?" button on all dialogs.
|
SetHighDPIAttributes();
|
||||||
|
|
||||||
|
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
|
||||||
|
// Disables the "?" button on all dialogs. Disabled by default on Qt6.
|
||||||
QCoreApplication::setAttribute(Qt::AA_DisableWindowContextHelpButton);
|
QCoreApplication::setAttribute(Qt::AA_DisableWindowContextHelpButton);
|
||||||
|
#endif
|
||||||
|
|
||||||
// Enables the core to make the qt created contexts current on std::threads
|
// Enables the core to make the qt created contexts current on std::threads
|
||||||
QCoreApplication::setAttribute(Qt::AA_DontCheckOpenGLContextThreadAffinity);
|
QCoreApplication::setAttribute(Qt::AA_DontCheckOpenGLContextThreadAffinity);
|
||||||
|
|
||||||
QApplication app(argc, argv);
|
QApplication app(argc, argv);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
@ -163,7 +163,7 @@ void OverlayDialog::MoveAndResizeWindow() {
|
|||||||
const auto height = static_cast<float>(parentWidget()->height());
|
const auto height = static_cast<float>(parentWidget()->height());
|
||||||
|
|
||||||
// High DPI
|
// High DPI
|
||||||
const float dpi_scale = parentWidget()->windowHandle()->screen()->logicalDotsPerInch() / 96.0f;
|
const float dpi_scale = screen()->logicalDotsPerInch() / 96.0f;
|
||||||
|
|
||||||
const auto title_text_font_size = BASE_TITLE_FONT_SIZE * (height / BASE_HEIGHT) / dpi_scale;
|
const auto title_text_font_size = BASE_TITLE_FONT_SIZE * (height / BASE_HEIGHT) / dpi_scale;
|
||||||
const auto body_text_font_size =
|
const auto body_text_font_size =
|
||||||
|
Loading…
Reference in New Issue
Block a user