Merge pull request #2529 from lioncash/boot
yuzu/bootmanager: Minor interface tidying
This commit is contained in:
		
						commit
						2ba4aa8a3b
					
				@ -20,7 +20,7 @@ static Common::Rectangle<T> MaxRectangle(Common::Rectangle<T> window_area,
 | 
			
		||||
                                static_cast<T>(std::round(scale * screen_aspect_ratio))};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
FramebufferLayout DefaultFrameLayout(unsigned width, unsigned height) {
 | 
			
		||||
FramebufferLayout DefaultFrameLayout(u32 width, u32 height) {
 | 
			
		||||
    ASSERT(width > 0);
 | 
			
		||||
    ASSERT(height > 0);
 | 
			
		||||
    // The drawing code needs at least somewhat valid values for both screens
 | 
			
		||||
@ -29,22 +29,23 @@ FramebufferLayout DefaultFrameLayout(unsigned width, unsigned height) {
 | 
			
		||||
 | 
			
		||||
    const float emulation_aspect_ratio{static_cast<float>(ScreenUndocked::Height) /
 | 
			
		||||
                                       ScreenUndocked::Width};
 | 
			
		||||
    Common::Rectangle<unsigned> screen_window_area{0, 0, width, height};
 | 
			
		||||
    Common::Rectangle<unsigned> screen = MaxRectangle(screen_window_area, emulation_aspect_ratio);
 | 
			
		||||
    const auto window_aspect_ratio = static_cast<float>(height) / width;
 | 
			
		||||
 | 
			
		||||
    float window_aspect_ratio = static_cast<float>(height) / width;
 | 
			
		||||
    const Common::Rectangle<u32> screen_window_area{0, 0, width, height};
 | 
			
		||||
    Common::Rectangle<u32> screen = MaxRectangle(screen_window_area, emulation_aspect_ratio);
 | 
			
		||||
 | 
			
		||||
    if (window_aspect_ratio < emulation_aspect_ratio) {
 | 
			
		||||
        screen = screen.TranslateX((screen_window_area.GetWidth() - screen.GetWidth()) / 2);
 | 
			
		||||
    } else {
 | 
			
		||||
        screen = screen.TranslateY((height - screen.GetHeight()) / 2);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    res.screen = screen;
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
FramebufferLayout FrameLayoutFromResolutionScale(u16 res_scale) {
 | 
			
		||||
    int width, height;
 | 
			
		||||
FramebufferLayout FrameLayoutFromResolutionScale(u32 res_scale) {
 | 
			
		||||
    u32 width, height;
 | 
			
		||||
 | 
			
		||||
    if (Settings::values.use_docked_mode) {
 | 
			
		||||
        width = ScreenDocked::WidthDocked * res_scale;
 | 
			
		||||
 | 
			
		||||
@ -8,15 +8,22 @@
 | 
			
		||||
 | 
			
		||||
namespace Layout {
 | 
			
		||||
 | 
			
		||||
enum ScreenUndocked : unsigned { Width = 1280, Height = 720 };
 | 
			
		||||
enum ScreenDocked : unsigned { WidthDocked = 1920, HeightDocked = 1080 };
 | 
			
		||||
enum ScreenUndocked : u32 {
 | 
			
		||||
    Width = 1280,
 | 
			
		||||
    Height = 720,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum ScreenDocked : u32 {
 | 
			
		||||
    WidthDocked = 1920,
 | 
			
		||||
    HeightDocked = 1080,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/// Describes the layout of the window framebuffer
 | 
			
		||||
struct FramebufferLayout {
 | 
			
		||||
    unsigned width{ScreenUndocked::Width};
 | 
			
		||||
    unsigned height{ScreenUndocked::Height};
 | 
			
		||||
    u32 width{ScreenUndocked::Width};
 | 
			
		||||
    u32 height{ScreenUndocked::Height};
 | 
			
		||||
 | 
			
		||||
    Common::Rectangle<unsigned> screen;
 | 
			
		||||
    Common::Rectangle<u32> screen;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the ration of pixel size of the screen, compared to the native size of the undocked
 | 
			
		||||
@ -33,12 +40,12 @@ struct FramebufferLayout {
 | 
			
		||||
 * @param height Window framebuffer height in pixels
 | 
			
		||||
 * @return Newly created FramebufferLayout object with default screen regions initialized
 | 
			
		||||
 */
 | 
			
		||||
FramebufferLayout DefaultFrameLayout(unsigned width, unsigned height);
 | 
			
		||||
FramebufferLayout DefaultFrameLayout(u32 width, u32 height);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Convenience method to get frame layout by resolution scale
 | 
			
		||||
 * @param res_scale resolution scale factor
 | 
			
		||||
 */
 | 
			
		||||
FramebufferLayout FrameLayoutFromResolutionScale(u16 res_scale);
 | 
			
		||||
FramebufferLayout FrameLayoutFromResolutionScale(u32 res_scale);
 | 
			
		||||
 | 
			
		||||
} // namespace Layout
 | 
			
		||||
 | 
			
		||||
@ -26,6 +26,8 @@
 | 
			
		||||
 | 
			
		||||
EmuThread::EmuThread(GRenderWindow* render_window) : render_window(render_window) {}
 | 
			
		||||
 | 
			
		||||
EmuThread::~EmuThread() = default;
 | 
			
		||||
 | 
			
		||||
void EmuThread::run() {
 | 
			
		||||
    render_window->MakeCurrent();
 | 
			
		||||
 | 
			
		||||
@ -185,7 +187,7 @@ private:
 | 
			
		||||
    bool do_painting;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
GRenderWindow::GRenderWindow(QWidget* parent, EmuThread* emu_thread)
 | 
			
		||||
GRenderWindow::GRenderWindow(GMainWindow* parent, EmuThread* emu_thread)
 | 
			
		||||
    : QWidget(parent), emu_thread(emu_thread) {
 | 
			
		||||
    setWindowTitle(QStringLiteral("yuzu %1 | %2-%3")
 | 
			
		||||
                       .arg(QString::fromUtf8(Common::g_build_name),
 | 
			
		||||
@ -194,8 +196,7 @@ GRenderWindow::GRenderWindow(QWidget* parent, EmuThread* emu_thread)
 | 
			
		||||
    setAttribute(Qt::WA_AcceptTouchEvents);
 | 
			
		||||
 | 
			
		||||
    InputCommon::Init();
 | 
			
		||||
    connect(this, &GRenderWindow::FirstFrameDisplayed, static_cast<GMainWindow*>(parent),
 | 
			
		||||
            &GMainWindow::OnLoadComplete);
 | 
			
		||||
    connect(this, &GRenderWindow::FirstFrameDisplayed, parent, &GMainWindow::OnLoadComplete);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GRenderWindow::~GRenderWindow() {
 | 
			
		||||
@ -247,9 +248,9 @@ void GRenderWindow::PollEvents() {}
 | 
			
		||||
void GRenderWindow::OnFramebufferSizeChanged() {
 | 
			
		||||
    // Screen changes potentially incur a change in screen DPI, hence we should update the
 | 
			
		||||
    // framebuffer size
 | 
			
		||||
    qreal pixelRatio = GetWindowPixelRatio();
 | 
			
		||||
    unsigned width = child->QPaintDevice::width() * pixelRatio;
 | 
			
		||||
    unsigned height = child->QPaintDevice::height() * pixelRatio;
 | 
			
		||||
    const qreal pixel_ratio = GetWindowPixelRatio();
 | 
			
		||||
    const u32 width = child->QPaintDevice::width() * pixel_ratio;
 | 
			
		||||
    const u32 height = child->QPaintDevice::height() * pixel_ratio;
 | 
			
		||||
    UpdateCurrentFramebufferLayout(width, height);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -266,7 +267,7 @@ void GRenderWindow::ForwardKeyReleaseEvent(QKeyEvent* event) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GRenderWindow::BackupGeometry() {
 | 
			
		||||
    geometry = ((QWidget*)this)->saveGeometry();
 | 
			
		||||
    geometry = QWidget::saveGeometry();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GRenderWindow::RestoreGeometry() {
 | 
			
		||||
@ -283,10 +284,11 @@ void GRenderWindow::restoreGeometry(const QByteArray& geometry) {
 | 
			
		||||
QByteArray GRenderWindow::saveGeometry() {
 | 
			
		||||
    // If we are a top-level widget, store the current geometry
 | 
			
		||||
    // otherwise, store the last backup
 | 
			
		||||
    if (parent() == nullptr)
 | 
			
		||||
        return ((QWidget*)this)->saveGeometry();
 | 
			
		||||
    else
 | 
			
		||||
        return geometry;
 | 
			
		||||
    if (parent() == nullptr) {
 | 
			
		||||
        return QWidget::saveGeometry();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return geometry;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
qreal GRenderWindow::GetWindowPixelRatio() const {
 | 
			
		||||
@ -294,10 +296,10 @@ qreal GRenderWindow::GetWindowPixelRatio() const {
 | 
			
		||||
    return windowHandle() ? windowHandle()->screen()->devicePixelRatio() : 1.0f;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::pair<unsigned, unsigned> GRenderWindow::ScaleTouch(const QPointF pos) const {
 | 
			
		||||
std::pair<u32, u32> GRenderWindow::ScaleTouch(const QPointF pos) const {
 | 
			
		||||
    const qreal pixel_ratio = GetWindowPixelRatio();
 | 
			
		||||
    return {static_cast<unsigned>(std::max(std::round(pos.x() * pixel_ratio), qreal{0.0})),
 | 
			
		||||
            static_cast<unsigned>(std::max(std::round(pos.y() * pixel_ratio), qreal{0.0}))};
 | 
			
		||||
    return {static_cast<u32>(std::max(std::round(pos.x() * pixel_ratio), qreal{0.0})),
 | 
			
		||||
            static_cast<u32>(std::max(std::round(pos.y() * pixel_ratio), qreal{0.0}))};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GRenderWindow::closeEvent(QCloseEvent* event) {
 | 
			
		||||
@ -353,7 +355,7 @@ void GRenderWindow::focusOutEvent(QFocusEvent* event) {
 | 
			
		||||
    InputCommon::GetKeyboard()->ReleaseAllKeys();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GRenderWindow::OnClientAreaResized(unsigned width, unsigned height) {
 | 
			
		||||
void GRenderWindow::OnClientAreaResized(u32 width, u32 height) {
 | 
			
		||||
    NotifyClientAreaSizeChanged(std::make_pair(width, height));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -394,7 +396,7 @@ void GRenderWindow::InitRenderTarget() {
 | 
			
		||||
    context->setShareContext(shared_context.get());
 | 
			
		||||
    context->setFormat(fmt);
 | 
			
		||||
    context->create();
 | 
			
		||||
    fmt.setSwapInterval(false);
 | 
			
		||||
    fmt.setSwapInterval(0);
 | 
			
		||||
 | 
			
		||||
    child = new GGLWidgetInternal(this, shared_context.get());
 | 
			
		||||
    container = QWidget::createWindowContainer(child, this);
 | 
			
		||||
@ -424,23 +426,29 @@ void GRenderWindow::InitRenderTarget() {
 | 
			
		||||
    BackupGeometry();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GRenderWindow::CaptureScreenshot(u16 res_scale, const QString& screenshot_path) {
 | 
			
		||||
void GRenderWindow::CaptureScreenshot(u32 res_scale, const QString& screenshot_path) {
 | 
			
		||||
    auto& renderer = Core::System::GetInstance().Renderer();
 | 
			
		||||
 | 
			
		||||
    if (!res_scale)
 | 
			
		||||
    if (res_scale == 0) {
 | 
			
		||||
        res_scale = VideoCore::GetResolutionScaleFactor(renderer);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const Layout::FramebufferLayout layout{Layout::FrameLayoutFromResolutionScale(res_scale)};
 | 
			
		||||
    screenshot_image = QImage(QSize(layout.width, layout.height), QImage::Format_RGB32);
 | 
			
		||||
    renderer.RequestScreenshot(screenshot_image.bits(),
 | 
			
		||||
                               [=] {
 | 
			
		||||
                                   screenshot_image.mirrored(false, true).save(screenshot_path);
 | 
			
		||||
                                   LOG_INFO(Frontend, "The screenshot is saved.");
 | 
			
		||||
                               },
 | 
			
		||||
                               layout);
 | 
			
		||||
    renderer.RequestScreenshot(
 | 
			
		||||
        screenshot_image.bits(),
 | 
			
		||||
        [=] {
 | 
			
		||||
            const std::string std_screenshot_path = screenshot_path.toStdString();
 | 
			
		||||
            if (screenshot_image.mirrored(false, true).save(screenshot_path)) {
 | 
			
		||||
                LOG_INFO(Frontend, "Screenshot saved to \"{}\"", std_screenshot_path);
 | 
			
		||||
            } else {
 | 
			
		||||
                LOG_ERROR(Frontend, "Failed to save screenshot to \"{}\"", std_screenshot_path);
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        layout);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void GRenderWindow::OnMinimalClientAreaChangeRequest(std::pair<unsigned, unsigned> minimal_size) {
 | 
			
		||||
void GRenderWindow::OnMinimalClientAreaChangeRequest(std::pair<u32, u32> minimal_size) {
 | 
			
		||||
    setMinimumSize(minimal_size.first, minimal_size.second);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -27,11 +27,12 @@ namespace VideoCore {
 | 
			
		||||
enum class LoadCallbackStage;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class EmuThread : public QThread {
 | 
			
		||||
class EmuThread final : public QThread {
 | 
			
		||||
    Q_OBJECT
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    explicit EmuThread(GRenderWindow* render_window);
 | 
			
		||||
    ~EmuThread() override;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Start emulation (on new thread)
 | 
			
		||||
@ -114,7 +115,7 @@ class GRenderWindow : public QWidget, public Core::Frontend::EmuWindow {
 | 
			
		||||
    Q_OBJECT
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    GRenderWindow(QWidget* parent, EmuThread* emu_thread);
 | 
			
		||||
    GRenderWindow(GMainWindow* parent, EmuThread* emu_thread);
 | 
			
		||||
    ~GRenderWindow() override;
 | 
			
		||||
 | 
			
		||||
    // EmuWindow implementation
 | 
			
		||||
@ -133,17 +134,17 @@ public:
 | 
			
		||||
    QByteArray saveGeometry();                        // overridden
 | 
			
		||||
 | 
			
		||||
    qreal GetWindowPixelRatio() const;
 | 
			
		||||
    std::pair<unsigned, unsigned> ScaleTouch(const QPointF pos) const;
 | 
			
		||||
    std::pair<u32, u32> ScaleTouch(QPointF pos) const;
 | 
			
		||||
 | 
			
		||||
    void closeEvent(QCloseEvent* event) override;
 | 
			
		||||
    bool event(QEvent* event) override;
 | 
			
		||||
    void focusOutEvent(QFocusEvent* event) override;
 | 
			
		||||
 | 
			
		||||
    void OnClientAreaResized(unsigned width, unsigned height);
 | 
			
		||||
    void OnClientAreaResized(u32 width, u32 height);
 | 
			
		||||
 | 
			
		||||
    void InitRenderTarget();
 | 
			
		||||
 | 
			
		||||
    void CaptureScreenshot(u16 res_scale, const QString& screenshot_path);
 | 
			
		||||
    void CaptureScreenshot(u32 res_scale, const QString& screenshot_path);
 | 
			
		||||
 | 
			
		||||
public slots:
 | 
			
		||||
    void moveContext(); // overridden
 | 
			
		||||
@ -162,7 +163,7 @@ private:
 | 
			
		||||
    void TouchUpdateEvent(const QTouchEvent* event);
 | 
			
		||||
    void TouchEndEvent();
 | 
			
		||||
 | 
			
		||||
    void OnMinimalClientAreaChangeRequest(std::pair<unsigned, unsigned> minimal_size) override;
 | 
			
		||||
    void OnMinimalClientAreaChangeRequest(std::pair<u32, u32> minimal_size) override;
 | 
			
		||||
 | 
			
		||||
    QWidget* container = nullptr;
 | 
			
		||||
    GGLWidgetInternal* child = nullptr;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user