diff options
author | Laszlo Agocs <laszlo.agocs@qt.io> | 2019-10-02 16:42:33 +0200 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@qt.io> | 2019-10-03 09:38:11 +0200 |
commit | 5bc1ae578ed79ef295e86901e4620d9c37687ed7 (patch) | |
tree | 39bce8d408bf813e018b7f802c53f112d8d4b935 /src/quick/scenegraph/qsgdefaultglyphnode_p.cpp | |
parent | ee9319f63c2e9d307bcda41669aaed9934d013ad (diff) |
Fix device pixel ratio with QRhi for native text
Calculating values based on the dpr is not possible in the sync phase,
because the strictly correct dpr (that takes redirections into textures
into account) is not known until QQuickWindowPrivate::renderSceneGraph().
The text material implementation attempts to dig out something directly
from the context's associated surface, but this does not match the way
QQuickWindow calculates the value (although it would work without causing
any trouble in many cases).
This is of course incompatible with the QRhi-based abstraction since
neither the context nor the associated window (if there is one even) is
known to materials.
To solve this, create a proper solution that makes the
QQuickWindow-calculated dpr available already in the sync phase (so in
updatePaintNode() implementations): have QQuickWindow calculate
calculate the dpr in syncSceneGraph(), and pass it down via the
rendercontext.
Only the rhi-based code path is touched in this patch. The direct OpenGL
path could be fixed in a similar manner (by migrating to
rc->devicePixelRatio() in the sync phase and state.devicePixelRatio() in
the render phase), but that is left as a future exercise.
Task-number: QTBUG-78610
Change-Id: Id9d9d4b1fd5b9730a64834fbbf61c74af4a8ed07
Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
Diffstat (limited to 'src/quick/scenegraph/qsgdefaultglyphnode_p.cpp')
-rw-r--r-- | src/quick/scenegraph/qsgdefaultglyphnode_p.cpp | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/src/quick/scenegraph/qsgdefaultglyphnode_p.cpp b/src/quick/scenegraph/qsgdefaultglyphnode_p.cpp index 4eba40b7a1..be6ef25feb 100644 --- a/src/quick/scenegraph/qsgdefaultglyphnode_p.cpp +++ b/src/quick/scenegraph/qsgdefaultglyphnode_p.cpp @@ -751,15 +751,15 @@ void QSGTextMaskMaterial::updateCache(QFontEngine::GlyphFormat glyphFormat) void *cacheKey; if (m_rhi) { cacheKey = m_rhi; - // ### no idea what the QWindow is (esp. since we are not even - // rendering at this point), and anyway is the original logic correct - // even... - devicePixelRatio = qGuiApp->devicePixelRatio(); + // Get the dpr the modern way. This value retrieved via the + // rendercontext matches what RenderState::devicePixelRatio() + // exposes to the material shaders later on. + devicePixelRatio = m_rc->currentDevicePixelRatio(); } else { ctx = const_cast<QOpenGLContext *>(QOpenGLContext::currentContext()); Q_ASSERT(ctx != nullptr); cacheKey = ctx; - devicePixelRatio = qsg_device_pixel_ratio(ctx); + devicePixelRatio = qsg_device_pixel_ratio(ctx); // this is technically incorrect, see other branch above } QTransform glyphCacheTransform = QTransform::fromScale(devicePixelRatio, devicePixelRatio); |