aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/scenegraph/util/qsgatlastexture_p.h
diff options
context:
space:
mode:
authorGunnar Sletta <gunnar.sletta@digia.com>2013-08-14 07:27:07 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-02 14:24:36 +0200
commitb480fa83a632b2ae5606e2870b47358328b479a2 (patch)
treebdd3e1b68a5a15a3950e13a50db911a93cdf279a /src/quick/scenegraph/util/qsgatlastexture_p.h
parent9be35c270082d1614886874e17cc3f90a7a3f489 (diff)
New scenegraph renderer and atlas textures.
The renderer tries to batch primitives together where possible, isolate non-changing subparts of the scene from changing subparts and retain vertexdata on the GPU as much as possible. Atlas textures are crucial in enabling batching. The renderer and atlas texture are described in detail in the doc page "Qt Quick Scene Graph Renderer". Change-Id: Ia476c7f0f42e1fc57a2cef528e93ee88cf8f7055 Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
Diffstat (limited to 'src/quick/scenegraph/util/qsgatlastexture_p.h')
-rw-r--r--src/quick/scenegraph/util/qsgatlastexture_p.h156
1 files changed, 156 insertions, 0 deletions
diff --git a/src/quick/scenegraph/util/qsgatlastexture_p.h b/src/quick/scenegraph/util/qsgatlastexture_p.h
new file mode 100644
index 0000000000..f8edd96f47
--- /dev/null
+++ b/src/quick/scenegraph/util/qsgatlastexture_p.h
@@ -0,0 +1,156 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtQuick module 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$
+**
+****************************************************************************/
+
+#ifndef QSGATLASTEXTURE_P_H
+#define QSGATLASTEXTURE_P_H
+
+#include <QtCore/QSize>
+
+#include <QtGui/qopengl.h>
+
+#include <QtQuick/QSGTexture>
+#include <QtQuick/private/qsgtexture_p.h>
+#include <QtQuick/private/qsgareaallocator_p.h>
+
+namespace QSGAtlasTexture
+{
+
+class Texture;
+class Atlas;
+
+class Manager : public QObject
+{
+ Q_OBJECT
+
+public:
+ Manager();
+ ~Manager();
+
+ QSGTexture *create(const QImage &image);
+ void invalidate();
+
+private:
+ Atlas *m_atlas;
+ Atlas *m_secondary_atlas;
+
+ QSize m_atlas_size;
+ int m_atlas_size_limit;
+};
+
+class Atlas
+{
+public:
+ Atlas(const QSize &size);
+ ~Atlas();
+
+ void initialize();
+
+ int textureId() const;
+ bool bind(QSGTexture::Filtering filteing);
+
+ void upload(Texture *texture);
+ void uploadBgra(Texture *texture);
+
+ Texture *create(const QImage &image);
+ void remove(Texture *t);
+
+ QSize size() const { return m_size; }
+
+private:
+
+ QSGAreaAllocator m_allocator;
+ GLuint m_texture_id;
+ QSize m_size;
+ QList<Texture *> m_pending_uploads;
+
+ GLuint m_internalFormat;
+ GLuint m_externalFormat;
+
+ QSGTexture::Filtering m_filtering;
+
+ uint m_allocated : 1;
+ uint m_use_bgra_fallback: 1;
+
+ uint m_debug_overlay : 1;
+};
+
+class Texture : public QSGTexture
+{
+ Q_OBJECT
+public:
+ Texture(Atlas *atlas, const QRect &textureRect, const QImage &image);
+ ~Texture();
+
+ int textureId() const { return m_atlas->textureId(); }
+ QSize textureSize() const { return m_allocated_rect_without_padding.size(); }
+ bool hasAlphaChannel() const { return m_image.hasAlphaChannel(); }
+ bool hasMipmaps() const { return false; }
+ bool isAtlasTexture() const { return true; }
+
+ QRectF normalizedTextureSubRect() const { return m_texture_coords_rect; }
+
+ QRect atlasSubRect() const { return m_allocated_rect; }
+ QRect atlasSubRectWithoutPadding() const { return m_allocated_rect_without_padding; }
+
+ bool isTexture() const { return true; }
+
+ QSGTexture *removedFromAtlas() const;
+
+ const QImage &image() const { return m_image; }
+
+ void bind();
+
+private:
+ QRect m_allocated_rect_without_padding;
+ QRect m_allocated_rect;
+ QRectF m_texture_coords_rect;
+
+ QImage m_image;
+
+ Atlas *m_atlas;
+
+ mutable QSGPlainTexture *m_nonatlas_texture;
+
+};
+
+}
+
+#endif