diff options
author | Gunnar Sletta <gunnar.sletta@jollamobile.com> | 2014-02-18 19:54:32 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-02-21 06:39:34 +0100 |
commit | c6c95915f076577d5194044d793889cb8b690230 (patch) | |
tree | 2d4d3d7968358c209f356ddcbb930f3d2f5e135f | |
parent | f158fa7feaa5d9fc2ae17aa16853acbbb947443a (diff) |
Make sure we update filtering options on atlas textures.
We had had an optimization which tried to reduce state changes,
but filtering is also changed in QSGTexture::updateBindOptions
which Atlas::bind() didn't know anything about. Solution: don't
try to be so clever.
Task-number: QTBUG-35457
Change-Id: I39ac0106396921e1b652db2b2aa5a9923b35e825
Reviewed-by: Shawn Rutledge <shawn.rutledge@digia.com>
-rw-r--r-- | src/quick/scenegraph/util/qsgatlastexture.cpp | 18 | ||||
-rw-r--r-- | src/quick/scenegraph/util/qsgatlastexture_p.h | 4 | ||||
-rw-r--r-- | tests/auto/quick/scenegraph/data/blacknwhite.png | bin | 0 -> 156 bytes | |||
-rw-r--r-- | tests/auto/quick/scenegraph/data/render_ImageFiltering.qml | 73 | ||||
-rw-r--r-- | tests/auto/quick/scenegraph/scenegraph.pro | 3 | ||||
-rw-r--r-- | tests/auto/quick/scenegraph/tst_scenegraph.cpp | 1 |
6 files changed, 82 insertions, 17 deletions
diff --git a/src/quick/scenegraph/util/qsgatlastexture.cpp b/src/quick/scenegraph/util/qsgatlastexture.cpp index fe659c9add..333bc62143 100644 --- a/src/quick/scenegraph/util/qsgatlastexture.cpp +++ b/src/quick/scenegraph/util/qsgatlastexture.cpp @@ -140,7 +140,6 @@ Atlas::Atlas(const QSize &size) : m_allocator(size) , m_texture_id(0) , m_size(size) - , m_filtering(QSGTexture::Linear) , m_allocated(false) { @@ -315,9 +314,8 @@ void Atlas::uploadBgra(Texture *texture) } -bool Atlas::bind(QSGTexture::Filtering filtering) +void Atlas::bind(QSGTexture::Filtering filtering) { - bool forceUpdate = false; if (!m_allocated) { m_allocated = true; @@ -362,13 +360,12 @@ bool Atlas::bind(QSGTexture::Filtering filtering) glDeleteTextures(1, &m_texture_id); m_texture_id = 0; } - forceUpdate = true; } else { glBindTexture(GL_TEXTURE_2D, m_texture_id); } if (m_texture_id == 0) - return false; + return; // Upload all pending images.. for (int i=0; i<m_pending_uploads.size(); ++i) { @@ -403,16 +400,11 @@ bool Atlas::bind(QSGTexture::Filtering filtering) #endif } - if (filtering != m_filtering) { - GLenum f = filtering == QSGTexture::Nearest ? GL_NEAREST : GL_LINEAR; - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, f); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, f); - m_filtering = filtering; - } + GLenum f = filtering == QSGTexture::Nearest ? GL_NEAREST : GL_LINEAR; + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, f); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, f); m_pending_uploads.clear(); - - return forceUpdate; } void Atlas::remove(Texture *t) diff --git a/src/quick/scenegraph/util/qsgatlastexture_p.h b/src/quick/scenegraph/util/qsgatlastexture_p.h index ade7b8f00e..51439cdb26 100644 --- a/src/quick/scenegraph/util/qsgatlastexture_p.h +++ b/src/quick/scenegraph/util/qsgatlastexture_p.h @@ -85,7 +85,7 @@ public: void invalidate(); int textureId() const; - bool bind(QSGTexture::Filtering filteing); + void bind(QSGTexture::Filtering filtering); void upload(Texture *texture); void uploadBgra(Texture *texture); @@ -104,8 +104,6 @@ private: GLuint m_internalFormat; GLuint m_externalFormat; - QSGTexture::Filtering m_filtering; - uint m_allocated : 1; uint m_use_bgra_fallback: 1; diff --git a/tests/auto/quick/scenegraph/data/blacknwhite.png b/tests/auto/quick/scenegraph/data/blacknwhite.png Binary files differnew file mode 100644 index 0000000000..efbc61e79d --- /dev/null +++ b/tests/auto/quick/scenegraph/data/blacknwhite.png diff --git a/tests/auto/quick/scenegraph/data/render_ImageFiltering.qml b/tests/auto/quick/scenegraph/data/render_ImageFiltering.qml new file mode 100644 index 0000000000..f91bc59931 --- /dev/null +++ b/tests/auto/quick/scenegraph/data/render_ImageFiltering.qml @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Jolla Ltd, author: <gunnar.sletta@jollamobile.com> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.2 + +/* + The test verifies that batching does not interfere with overlapping + regions. + + #samples: 8 + PixelPos R G B Error-tolerance + #final: 10 10 0.0 0.0 0.0 0.0 + #final: 20 10 1.0 1.0 1.0 0.0 + #final: 30 10 0.0 0.0 0.0 0.0 + #final: 40 10 0.5 0.5 0.5 0.1 + #final: 50 10 0.0 0.0 0.0 0.0 + #final: 60 10 1.0 1.0 1.0 0.0 + #final: 70 10 0.0 0.0 0.0 0.0 + #final: 80 10 0.5 0.5 0.5 0.1 +*/ + +RenderTestBase +{ + Item { + x: 10 + y: 10 + scale: 10 + Image { x: 0; source: "blacknwhite.png"; smooth: false } + Image { x: 2; source: "blacknwhite.png"; smooth: true } + Image { x: 4; source: "blacknwhite.png"; smooth: false } + Image { x: 6; source: "blacknwhite.png"; smooth: true } + } + + finalStageComplete: true +} diff --git a/tests/auto/quick/scenegraph/scenegraph.pro b/tests/auto/quick/scenegraph/scenegraph.pro index 1aa73ca60a..0ad13a086f 100644 --- a/tests/auto/quick/scenegraph/scenegraph.pro +++ b/tests/auto/quick/scenegraph/scenegraph.pro @@ -12,4 +12,5 @@ DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 OTHER_FILES += \ data/render_OutOfFloatRange.qml \ - data/simple.qml + data/simple.qml \ + data/render_ImageFiltering.qml diff --git a/tests/auto/quick/scenegraph/tst_scenegraph.cpp b/tests/auto/quick/scenegraph/tst_scenegraph.cpp index af5acde5f3..5d393fedb5 100644 --- a/tests/auto/quick/scenegraph/tst_scenegraph.cpp +++ b/tests/auto/quick/scenegraph/tst_scenegraph.cpp @@ -327,6 +327,7 @@ void tst_SceneGraph::render_data() << "data/render_OutOfFloatRange.qml" << "data/render_StackingOrder.qml" << "data/render_Mipmap.qml" + << "data/render_ImageFiltering.qml" ; QRegExp sampleCount("#samples: *(\\d+)"); |