From 326ed5767e5d09ed3bf2177d5de17d4e07edf226 Mon Sep 17 00:00:00 2001 From: Kim Motoyoshi Kalland Date: Mon, 15 Aug 2011 14:46:23 +0200 Subject: Implemented minimum FBO size on the ShaderEffectSource. Task-number: QTBUG-20193 Change-Id: I45020c094c4a4892c055700f084fde7b219cdc10 Reviewed-on: http://codereview.qt.nokia.com/2972 Reviewed-by: Qt Sanity Bot Reviewed-by: Gunnar Sletta --- src/declarative/items/qsgshadereffectsource.cpp | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) (limited to 'src/declarative/items') diff --git a/src/declarative/items/qsgshadereffectsource.cpp b/src/declarative/items/qsgshadereffectsource.cpp index 5114d8c042..d7653b578b 100644 --- a/src/declarative/items/qsgshadereffectsource.cpp +++ b/src/declarative/items/qsgshadereffectsource.cpp @@ -558,8 +558,12 @@ void QSGShaderEffectSource::setSourceRect(const QRectF &rect) /*! \qmlproperty size ShaderEffectSource::textureSize - This property holds the size of the texture. If it is empty, which is the - default, the size of the source rectangle is used. + This property holds the requested size of the texture. If it is empty, + which is the default, the size of the source rectangle is used. + + \note Some platforms have a limit on how small framebuffer objects can be, + which means the actual texture size might be larger than the requested + size. */ QSize QSGShaderEffectSource::textureSize() const @@ -762,7 +766,7 @@ QSGTexture *QSGShaderEffectSource::texture() const QSGNode *QSGShaderEffectSource::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) { - if (!m_sourceItem) { + if (!m_sourceItem || m_sourceItem->width() == 0 || m_sourceItem->height() == 0) { delete oldNode; return 0; } @@ -782,13 +786,22 @@ QSGNode *QSGShaderEffectSource::updatePaintNode(QSGNode *oldNode, UpdatePaintNod tex->setLive(m_live); tex->setItem(QSGItemPrivate::get(m_sourceItem)->itemNode()); - QRectF sourceRect = m_sourceRect.isNull() + QRectF sourceRect = m_sourceRect.width() == 0 || m_sourceRect.height() == 0 ? QRectF(0, 0, m_sourceItem->width(), m_sourceItem->height()) : m_sourceRect; tex->setRect(sourceRect); QSize textureSize = m_textureSize.isEmpty() ? QSize(qCeil(qAbs(sourceRect.width())), qCeil(qAbs(sourceRect.height()))) : m_textureSize; + Q_ASSERT(!textureSize.isEmpty()); + QSGItemPrivate *d = static_cast(QObjectPrivate::get(this)); + const QSize minTextureSize = d->sceneGraphContext()->minimumFBOSize(); + // Keep power-of-two by doubling the size. + while (textureSize.width() < minTextureSize.width()) + textureSize.rwidth() *= 2; + while (textureSize.height() < minTextureSize.height()) + textureSize.rheight() *= 2; + tex->setSize(textureSize); tex->setRecursive(m_recursive); tex->setFormat(GLenum(m_format)); -- cgit v1.2.3