diff options
Diffstat (limited to 'src/quick/items/context2d')
-rw-r--r-- | src/quick/items/context2d/qquickcontext2dtexture.cpp | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/src/quick/items/context2d/qquickcontext2dtexture.cpp b/src/quick/items/context2d/qquickcontext2dtexture.cpp index a8bf14ba9f..75a8429e98 100644 --- a/src/quick/items/context2d/qquickcontext2dtexture.cpp +++ b/src/quick/items/context2d/qquickcontext2dtexture.cpp @@ -91,6 +91,17 @@ struct GLAcquireContext { } QOpenGLContext *ctx; }; + +class QSGPlainTextureWithSubRect : public QSGPlainTexture +{ +public: + QSGPlainTextureWithSubRect(const QRectF &subRect) : m_subRect(subRect) {} + QRectF normalizedTextureSubRect() const override { return m_subRect; } + +private: + QRectF m_subRect; +}; + #endif QQuickContext2DTexture::QQuickContext2DTexture() : m_context(0) @@ -454,14 +465,18 @@ QVector2D QQuickContext2DFBOTexture::scaleFactor() const QSGTexture *QQuickContext2DFBOTexture::textureForNextFrame(QSGTexture *lastTexture, QQuickWindow *) { - QSGPlainTexture *texture = static_cast<QSGPlainTexture *>(lastTexture); + QSGPlainTextureWithSubRect *texture = static_cast<QSGPlainTextureWithSubRect *>(lastTexture); if (m_onCustomThread) m_mutex.lock(); if (m_fbo) { if (!texture) { - texture = new QSGPlainTexture(); + // Since the FBO might be have a POT size, we need to set a sub rect + qreal normalizedCanvasWidth = m_canvasDevicePixelRatio * qreal(m_canvasSize.width()) / m_fbo->size().width(); + qreal normalizedCanvasHeight = m_canvasDevicePixelRatio * qreal(m_canvasSize.height()) / m_fbo->size().height(); + + texture = new QSGPlainTextureWithSubRect(QRectF(0, 0, normalizedCanvasWidth, normalizedCanvasHeight)); texture->setHasAlphaChannel(true); texture->setOwnsTexture(false); m_dirtyTexture = true; |