diff options
author | Justin McPherson <justin.mcpherson@nokia.com> | 2012-02-28 15:08:43 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-03-06 06:34:32 +0100 |
commit | eab48686b2ec6df8cd179c9472eda4e8c3505cef (patch) | |
tree | 2724c250d2724740f7a26bb0763ca0124d2047de /src/quick/items/context2d/qquickcontext2dtexture.cpp | |
parent | be4c74948371ddf6f1ed260783b43b5a3d9e60a7 (diff) |
Use NPOT support if available.
In QQuickContext2DTexture.
Change-Id: If0311450658a837b7e2665c041ec2846e3c8c2dd
Reviewed-by: Yunqiao Yin <charles.yin@nokia.com>
Diffstat (limited to 'src/quick/items/context2d/qquickcontext2dtexture.cpp')
-rw-r--r-- | src/quick/items/context2d/qquickcontext2dtexture.cpp | 82 |
1 files changed, 36 insertions, 46 deletions
diff --git a/src/quick/items/context2d/qquickcontext2dtexture.cpp b/src/quick/items/context2d/qquickcontext2dtexture.cpp index 28460e2164..7d9f65a3c6 100644 --- a/src/quick/items/context2d/qquickcontext2dtexture.cpp +++ b/src/quick/items/context2d/qquickcontext2dtexture.cpp @@ -75,10 +75,8 @@ Q_GLOBAL_STATIC(QThread, globalCanvasThreadRenderInstance) QQuickContext2DTexture::QQuickContext2DTexture() : m_context(0) , m_item(0) - , m_canvasSize(QSize(1, 1)) - , m_tileSize(QSize(1, 1)) - , m_canvasWindow(QRect(0, 0, 1, 1)) , m_dirtyCanvas(false) + , m_canvasWindowChanged(false) , m_dirtyTexture(false) , m_threadRendering(false) , m_smooth(false) @@ -144,6 +142,7 @@ bool QQuickContext2DTexture::setCanvasWindow(const QRect& r) { if (m_canvasWindow != r) { m_canvasWindow = r; + m_canvasWindowChanged = true; return true; } return false; @@ -331,7 +330,7 @@ QRect QQuickContext2DTexture::createTiles(const QRect& window) return QRect(); } - QRect r = tiledRect(window, m_tileSize); + QRect r = tiledRect(window, adjustedTileSize(m_tileSize)); const int tw = m_tileSize.width(); const int th = m_tileSize.height(); @@ -379,6 +378,30 @@ void QQuickContext2DTexture::clearTiles() m_tiles.clear(); } +QSize QQuickContext2DTexture::adjustedTileSize(const QSize &ts) +{ + return ts; +} + +static inline QSize npotAdjustedSize(const QSize &size) +{ + static bool checked = false; + static bool npotSupported = false; + + if (!checked) { + npotSupported = QOpenGLContext::currentContext()->functions()->hasOpenGLFeature(QOpenGLFunctions::NPOTTextures); + checked = true; + } + + if (npotSupported) { + return QSize(qMax(QT_MINIMUM_FBO_SIZE, size.width()), + qMax(QT_MINIMUM_FBO_SIZE, size.height())); + } + + return QSize(qMax(QT_MINIMUM_FBO_SIZE, qt_next_power_of_two(size.width())), + qMax(QT_MINIMUM_FBO_SIZE, qt_next_power_of_two(size.height()))); +} + QQuickContext2DFBOTexture::QQuickContext2DFBOTexture() : QQuickContext2DTexture() , m_fbo(0) @@ -395,47 +418,9 @@ QQuickContext2DFBOTexture::~QQuickContext2DFBOTexture() delete m_paint_device; } -bool QQuickContext2DFBOTexture::setCanvasSize(const QSize &size) +QSize QQuickContext2DFBOTexture::adjustedTileSize(const QSize &ts) { - QSize s = QSize(qMax(QT_MINIMUM_FBO_SIZE, qt_next_power_of_two(size.width())) - , qMax(QT_MINIMUM_FBO_SIZE, qt_next_power_of_two(size.height()))); - - if (m_canvasSize != s) { - m_canvasSize = s; - m_dirtyCanvas = true; - return true; - } - return false; -} - -bool QQuickContext2DFBOTexture::setTileSize(const QSize &size) -{ - QSize s = QSize(qMax(QT_MINIMUM_FBO_SIZE, qt_next_power_of_two(size.width())) - , qMax(QT_MINIMUM_FBO_SIZE, qt_next_power_of_two(size.height()))); - if (m_tileSize != s) { - m_tileSize = s; - m_dirtyCanvas = true; - return true; - } - return false; -} - -bool QQuickContext2DFBOTexture::setCanvasWindow(const QRect& canvasWindow) -{ - QSize s = QSize(qMax(QT_MINIMUM_FBO_SIZE, qt_next_power_of_two(canvasWindow.size().width())) - , qMax(QT_MINIMUM_FBO_SIZE, qt_next_power_of_two(canvasWindow.size().height()))); - - - bool doChanged = false; - if (m_fboSize != s) { - m_fboSize = s; - doChanged = true; - } - - if (m_canvasWindow != canvasWindow) - m_canvasWindow = canvasWindow; - - return doChanged; + return npotAdjustedSize(ts); } void QQuickContext2DFBOTexture::bind() @@ -550,9 +535,13 @@ QPaintDevice* QQuickContext2DFBOTexture::beginPainting() m_fbo = 0; m_multisampledFbo = 0; return 0; - } else if (!m_fbo || m_fbo->size() != m_fboSize) { + } else if (!m_fbo || m_canvasWindowChanged) { delete m_fbo; delete m_multisampledFbo; + + m_fboSize = npotAdjustedSize(m_canvasWindow.size()); + m_canvasWindowChanged = false; + if (doMultisampling()) { { QOpenGLFramebufferObjectFormat format; @@ -719,9 +708,10 @@ QPaintDevice* QQuickContext2DImageTexture::beginPainting() if (m_canvasWindow.size().isEmpty()) return 0; - if (m_image.size() != m_canvasWindow.size()) { + if (m_canvasWindowChanged) { m_image = QImage(m_canvasWindow.size(), QImage::Format_ARGB32_Premultiplied); m_image.fill(0x00000000); + m_canvasWindowChanged = false; } return &m_image; |