aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quick/items/context2d/qquickcontext2dtexture.cpp19
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;