From 405650eff20e116b77a75f1af1857065263080f7 Mon Sep 17 00:00:00 2001 From: Dylan Schooner Date: Thu, 6 Nov 2025 19:43:24 -0500 Subject: [PATCH] Fix fractional scaling issues Signed-off-by: Dylan Schooner --- .../ui/dialogs/skins/draw/SkinOpenGLWindow.cpp | 14 ++++++++++++++ launcher/ui/dialogs/skins/draw/SkinOpenGLWindow.h | 2 ++ 2 files changed, 16 insertions(+) diff --git a/launcher/ui/dialogs/skins/draw/SkinOpenGLWindow.cpp b/launcher/ui/dialogs/skins/draw/SkinOpenGLWindow.cpp index b5aa2dc54..962717a30 100644 --- a/launcher/ui/dialogs/skins/draw/SkinOpenGLWindow.cpp +++ b/launcher/ui/dialogs/skins/draw/SkinOpenGLWindow.cpp @@ -202,6 +202,13 @@ void SkinOpenGLWindow::resizeGL(int w, int h) void SkinOpenGLWindow::paintGL() { + // Adjust the viewport to account for fractional scaling + qreal dpr = devicePixelRatio(); + if (dpr != 1.f) { + QSize scaledSize = size() * dpr; + glViewport(0, 0, scaledSize.width(), scaledSize.height()); + } + // Clear color and depth buffer glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -235,6 +242,13 @@ void SkinOpenGLWindow::paintGL() m_scene->draw(m_modelProgram); m_modelProgram->release(); + + // Redraw the first frame; this is necessary because the pixel ratio for Wayland fractional scaling is not negotiated properly on the + // first frame + if (m_isFirstFrame) { + m_isFirstFrame = false; + update(); + } } void SkinOpenGLWindow::updateScene(SkinModel* skin) diff --git a/launcher/ui/dialogs/skins/draw/SkinOpenGLWindow.h b/launcher/ui/dialogs/skins/draw/SkinOpenGLWindow.h index 17476d3c8..7b88fca9c 100644 --- a/launcher/ui/dialogs/skins/draw/SkinOpenGLWindow.h +++ b/launcher/ui/dialogs/skins/draw/SkinOpenGLWindow.h @@ -74,6 +74,8 @@ class SkinOpenGLWindow : public QOpenGLWindow, protected QOpenGLFunctions { float m_yaw = 90; // Horizontal rotation angle float m_pitch = 0; // Vertical rotation angle + bool m_isFirstFrame = true; + opengl::BoxGeometry* m_background = nullptr; QOpenGLTexture* m_backgroundTexture = nullptr; QColor m_baseColor;