summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
authorMike Krus <mike.krus@kdab.com>2020-04-27 11:56:17 +0100
committerPaul Lemire <paul.lemire@kdab.com>2020-05-06 15:29:54 +0200
commit764924da8ab3255c1b8d1ad5b39f85675f4b855e (patch)
treec7b3e9d94318fd347ef2717feb5b539f5c18ff13 /src/core
parent9838d91e2d433f13c57bdae48e31ba0b909988aa (diff)
Fix build for Qt6
- updated dependencies, excluding qtgamepad for now - fixed issues with Q_PROPERTY not supporting forward declarations - fixed for changes in QtQuick private API - fixed for changes in QtOpenGLVersionFunctions API - fixed for removal of QT_OPENGL_ES* macros - fixed for changes in QtConcurrent API - fixed RHI based build Change-Id: I42ccd2f101b7f0a78e2860c6d551722bf6710a11 Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/core')
-rw-r--r--src/core/geometry/qattribute.h2
-rw-r--r--src/core/geometry/qgeometry.h2
-rw-r--r--src/core/nodes/qcomponent.h1
-rw-r--r--src/core/nodes/qnode.h1
-rw-r--r--src/core/resources/qframeallocator.cpp322
-rw-r--r--src/core/resources/qframeallocator_p.h112
-rw-r--r--src/core/resources/qframeallocator_p_p.h138
-rw-r--r--src/core/resources/qhandle_p.h7
-rw-r--r--src/core/resources/resources.pri3
-rw-r--r--src/core/transforms/qarmature.h2
-rw-r--r--src/core/transforms/qskeleton.h2
-rw-r--r--src/core/transforms/qskeletonloader.h2
12 files changed, 588 insertions, 6 deletions
diff --git a/src/core/geometry/qattribute.h b/src/core/geometry/qattribute.h
index aa0e5ce8b..eedb2d32c 100644
--- a/src/core/geometry/qattribute.h
+++ b/src/core/geometry/qattribute.h
@@ -42,13 +42,13 @@
#include <Qt3DCore/qt3dcore_global.h>
#include <Qt3DCore/qnode.h>
+#include <Qt3DCore/qbuffer.h>
#include <QtCore/QSharedPointer>
QT_BEGIN_NAMESPACE
namespace Qt3DCore {
-class QBuffer;
class QAttributePrivate;
typedef QSharedPointer<QBuffer> QBufferPtr;
diff --git a/src/core/geometry/qgeometry.h b/src/core/geometry/qgeometry.h
index a619884a0..89b3c7019 100644
--- a/src/core/geometry/qgeometry.h
+++ b/src/core/geometry/qgeometry.h
@@ -42,12 +42,12 @@
#include <Qt3DCore/qnode.h>
#include <Qt3DCore/qt3dcore_global.h>
+#include <Qt3DCore/qattribute.h>
QT_BEGIN_NAMESPACE
namespace Qt3DCore {
-class QAttribute;
class QGeometryPrivate;
class Q_3DCORESHARED_EXPORT QGeometry : public Qt3DCore::QNode
diff --git a/src/core/nodes/qcomponent.h b/src/core/nodes/qcomponent.h
index 182a21e50..f07b34c9f 100644
--- a/src/core/nodes/qcomponent.h
+++ b/src/core/nodes/qcomponent.h
@@ -47,6 +47,7 @@ QT_BEGIN_NAMESPACE
namespace Qt3DCore {
+class QEntity;
class QComponentPrivate;
class Q_3DCORESHARED_EXPORT QComponent : public QNode
diff --git a/src/core/nodes/qnode.h b/src/core/nodes/qnode.h
index f24daf63f..e6914919d 100644
--- a/src/core/nodes/qnode.h
+++ b/src/core/nodes/qnode.h
@@ -52,7 +52,6 @@ namespace Qt3DCore {
class QNode;
class QNodePrivate;
-class QEntity;
class QAspectEngine;
#if defined(QT_BUILD_INTERNAL)
diff --git a/src/core/resources/qframeallocator.cpp b/src/core/resources/qframeallocator.cpp
new file mode 100644
index 000000000..e85ae4057
--- /dev/null
+++ b/src/core/resources/qframeallocator.cpp
@@ -0,0 +1,322 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt3D 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 The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/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 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/* !\internal
+ \class Qt3DCore::QFrameAllocator
+ \inmodule Qt3DCore
+ \brief Provides a pool of memory chunks to be used to allocate objects on a per frame basis.
+
+ The memory can be recycled by following frames by calling clear which won't deallocate any memory.
+
+ \note Be really careful when allocating polymorphic types. You must be
+ sure to call deallocate with the subclass type to properly release all
+ memory.
+*/
+
+#include "qframeallocator_p.h"
+#include "qframeallocator_p_p.h"
+
+QT_BEGIN_NAMESPACE
+
+namespace Qt3DCore {
+
+QFrameAllocatorPrivate::QFrameAllocatorPrivate()
+ : m_maxObjectSize(0U)
+ , m_alignment(0U)
+{
+}
+
+QFrameAllocator::QFrameAllocator(uint maxObjectSize, uint alignment, uint pageSize)
+ : d_ptr(new QFrameAllocatorPrivate)
+{
+ Q_ASSERT(alignment && pageSize && pageSize < UCHAR_MAX);
+ Q_D(QFrameAllocator);
+ d->m_maxObjectSize = maxObjectSize;
+ d->m_alignment = alignment;
+ d->m_allocatorPool.resize(d->allocatorIndexFromSize(maxObjectSize) + 1);
+ for (int i = 0, n = d->m_allocatorPool.size(); i < n; ++i)
+ d->m_allocatorPool[i].init((i + 1) * d->m_alignment, pageSize);
+}
+
+QFrameAllocator::~QFrameAllocator()
+{
+ Q_D(QFrameAllocator);
+ for (int i = 0, n = d->m_allocatorPool.size(); i < n; ++i)
+ d->m_allocatorPool[i].release();
+}
+
+// Clear all memory chunks, allocated memory is not released
+void QFrameAllocator::clear()
+{
+ Q_D(QFrameAllocator);
+ for (int i = 0, n = d->m_allocatorPool.size(); i < n; ++i)
+ d->m_allocatorPool[i].clear();
+}
+
+// Trim excess memory used by chunks
+void QFrameAllocator::trim()
+{
+ Q_D(QFrameAllocator);
+ for (int i = 0, n = d->m_allocatorPool.size(); i < n; ++i)
+ d->m_allocatorPool[i].trim();
+}
+
+uint QFrameAllocator::maxObjectSize() const
+{
+ Q_D(const QFrameAllocator);
+ return d->m_maxObjectSize;
+}
+
+int QFrameAllocator::allocatorPoolSize() const
+{
+ Q_D(const QFrameAllocator);
+ return d->m_allocatorPool.size();
+}
+
+bool QFrameAllocator::isEmpty() const
+{
+ Q_D(const QFrameAllocator);
+ for (const QFixedFrameAllocator &allocator : d->m_allocatorPool) {
+ if (!allocator.isEmpty())
+ return false;
+ }
+ return true;
+}
+
+uint QFrameAllocator::totalChunkCount() const
+{
+ Q_D(const QFrameAllocator);
+ uint chunkCount = 0;
+ for (const QFixedFrameAllocator& allocator : d->m_allocatorPool)
+ chunkCount += allocator.chunkCount();
+ return chunkCount;
+}
+
+QFixedFrameAllocator::QFixedFrameAllocator()
+ : m_blockSize(0)
+ , m_nbrBlock(0)
+ , m_lastAllocatedChunck(nullptr)
+ , m_lastFreedChunck(nullptr)
+{
+}
+
+QFixedFrameAllocator::~QFixedFrameAllocator()
+{
+ release();
+}
+
+void QFixedFrameAllocator::init(uint blockSize, uchar pageSize)
+{
+ m_blockSize = blockSize;
+ m_nbrBlock = pageSize;
+}
+
+void *QFixedFrameAllocator::allocate()
+{
+ Q_ASSERT(m_blockSize);
+ return scan().allocate(m_blockSize);
+}
+
+QFrameChunk &QFixedFrameAllocator::scan()
+{
+ Q_ASSERT(m_blockSize);
+ Q_ASSERT(m_nbrBlock);
+
+ if (m_lastAllocatedChunck && m_lastAllocatedChunck->m_blocksAvailable)
+ return *m_lastAllocatedChunck;
+
+ for (int i = 0; i < m_chunks.size(); i++) {
+ if (m_chunks[i].m_blocksAvailable > 0) {
+ m_lastAllocatedChunck = m_chunks.begin() + i;
+ return *m_lastAllocatedChunck;
+ }
+ }
+ m_chunks.resize(m_chunks.size() + 1);
+ QFrameChunk &newChunk = m_chunks.last();
+ newChunk.init(m_blockSize, m_nbrBlock);
+ m_lastAllocatedChunck = &newChunk;
+ m_lastFreedChunck = &newChunk;
+ return newChunk;
+}
+
+void QFixedFrameAllocator::deallocate(void *ptr)
+{
+ Q_ASSERT(m_blockSize && m_nbrBlock);
+ if (!m_chunks.empty() && ptr != nullptr) {
+ if (m_lastFreedChunck != nullptr && m_lastFreedChunck->contains(ptr, m_blockSize))
+ m_lastFreedChunck->deallocate(ptr, m_blockSize);
+ else {
+ for (int i = 0; i < m_chunks.size(); i++) {
+ if (m_chunks[i].contains(ptr, m_blockSize)) {
+ m_chunks[i].deallocate(ptr, m_blockSize);
+ m_lastFreedChunck = m_chunks.begin() + i;
+ break ;
+ }
+ }
+ }
+ }
+}
+
+void QFixedFrameAllocator::trim()
+{
+ for (int i = m_chunks.size() - 1; i >= 0; i--) {
+ if (m_chunks.at(i).isEmpty()) {
+ m_chunks[i].release();
+ if (m_lastAllocatedChunck == &m_chunks[i])
+ m_lastAllocatedChunck = nullptr;
+ if (m_lastFreedChunck == &m_chunks[i])
+ m_lastFreedChunck = nullptr;
+ m_chunks.removeAt(i);
+ }
+ }
+}
+
+void QFixedFrameAllocator::release()
+{
+ for (int i = m_chunks.size() - 1; i >= 0; i--)
+ m_chunks[i].release();
+ m_chunks.clear();
+ m_lastAllocatedChunck = nullptr;
+ m_lastFreedChunck = nullptr;
+}
+
+// Allows to reuse chunks without having to reinitialize and reallocate them
+void QFixedFrameAllocator::clear()
+{
+ for (int i = m_chunks.size() - 1; i >= 0; i--)
+ m_chunks[i].clear(m_blockSize, m_nbrBlock);
+}
+
+bool QFixedFrameAllocator::isEmpty() const
+{
+ for (const QFrameChunk &chunck : m_chunks) {
+ if (chunck.m_blocksAvailable != chunck.m_maxBlocksAvailable)
+ return false;
+ }
+ return true;
+}
+
+// QFrameChuck is agnostic about blocksize
+// However if it was initialized with a block size of 16
+// You should then pass 16 to allocate and deallocate
+void QFrameChunk::init(uint blockSize, uchar blocks)
+{
+ m_data = new uchar[blockSize * blocks];
+ m_firstAvailableBlock = 0;
+ m_blocksAvailable = blocks;
+ m_maxBlocksAvailable = blocks;
+ uchar *p = m_data;
+ // Init each block with its position stored in its first byte
+ for (uchar i = 0; i < blocks; p += blockSize)
+ *p = ++i;
+#ifdef QFRAMEALLOCATOR_DEBUG
+ VALGRIND_CREATE_MEMPOOL(m_data, 0, true);
+ VALGRIND_MAKE_MEM_NOACCESS(m_data, blockSize * blocks);
+ VALGRIND_MEMPOOL_ALLOC(m_data, m_data, blockSize * blocks);
+#endif
+}
+
+void *QFrameChunk::allocate(uint blockSize)
+{
+ if (m_blocksAvailable == 0)
+ return nullptr;
+ uchar *r = m_data + (m_firstAvailableBlock * blockSize);
+ m_firstAvailableBlock = *r;
+ --m_blocksAvailable;
+ return r;
+}
+
+// Shouldn't be called more than once for the same pointer
+void QFrameChunk::deallocate(void *p, uint blockSize)
+{
+ if (p >= m_data) {
+ uchar *toRelease = static_cast<uchar *>(p);
+ uchar oldFreeBlock = m_firstAvailableBlock;
+ m_firstAvailableBlock = static_cast<uchar>((toRelease - m_data) / blockSize);
+ *toRelease = oldFreeBlock;
+ ++m_blocksAvailable;
+ }
+}
+
+bool QFrameChunk::contains(void *p, uint blockSize)
+{
+ uchar *c = static_cast<uchar *>(p);
+ return (m_data <= c && c < m_data + blockSize * m_maxBlocksAvailable);
+}
+
+// Reset chunck without releasing heap allocated memory
+void QFrameChunk::clear(uint blockSize, uchar blocks)
+{
+ m_firstAvailableBlock = 0;
+ m_blocksAvailable = blocks;
+
+ uchar *p = m_data;
+ // Init each block with its position stored in its first byte
+ for (uchar i = 0; i < blocks; p += blockSize)
+ *p = ++i;
+}
+
+void QFrameChunk::release()
+{
+#ifdef QFRAMEALLOCATOR_DEBUG
+ VALGRIND_MEMPOOL_FREE(m_data, m_data);
+ VALGRIND_DESTROY_MEMPOOL(m_data);
+#endif
+ delete [] m_data;
+}
+
+void* QFrameAllocator::allocateRawMemory(size_t size)
+{
+ Q_D(QFrameAllocator);
+ Q_ASSERT(size <= d->m_maxObjectSize);
+ uint allocatorIndex = d->allocatorIndexFromSize(uint(size));
+ return d->allocateAtChunk(allocatorIndex);
+}
+
+void QFrameAllocator::deallocateRawMemory(void* ptr, size_t size)
+{
+ Q_D(QFrameAllocator);
+ Q_ASSERT(size <= d->m_maxObjectSize);
+ uint allocatorIndex = d->allocatorIndexFromSize(uint(size));
+ d->deallocateAtChunck(ptr, allocatorIndex);
+}
+
+} // Qt3D
+
+QT_END_NAMESPACE
diff --git a/src/core/resources/qframeallocator_p.h b/src/core/resources/qframeallocator_p.h
new file mode 100644
index 000000000..4c2b5a961
--- /dev/null
+++ b/src/core/resources/qframeallocator_p.h
@@ -0,0 +1,112 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt3D 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 The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/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 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DCORE_QFRAMEALLOCATOR_P_H
+#define QT3DCORE_QFRAMEALLOCATOR_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of other Qt classes. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#ifdef QFRAMEALLOCATOR_DEBUG
+#include <valgrind/valgrind.h>
+#include <valgrind/memcheck.h>
+#endif
+
+#include <QtCore/QDebug>
+#include <QtCore/QScopedPointer>
+#include <QtCore/QVector>
+
+#include <Qt3DCore/private/qt3dcore_global_p.h>
+
+QT_BEGIN_NAMESPACE
+
+namespace Qt3DCore {
+
+class QFrameAllocatorPrivate;
+
+class Q_3DCORE_PRIVATE_EXPORT QFrameAllocator
+{
+public:
+ explicit QFrameAllocator(uint maxObjectSize, uint alignment = 16, uint pageSize = 128);
+ ~QFrameAllocator();
+
+ template<typename T>
+ T* allocate()
+ {
+ void* ptr = allocateRawMemory(sizeof(T));
+ new (ptr) T(); // Don't forget to call the constructor of the object using the placement new operator
+ return static_cast<T*>(ptr);
+ }
+
+ template<typename T>
+ void deallocate(T *ptr)
+ {
+ ptr->~T(); // Call destructor
+ deallocateRawMemory(ptr, sizeof(T));
+ }
+
+ void* allocateRawMemory(size_t size);
+
+ void deallocateRawMemory(void *ptr, size_t size);
+
+ void clear();
+ void trim();
+ uint maxObjectSize() const;
+ uint totalChunkCount() const;
+ int allocatorPoolSize() const;
+ bool isEmpty() const;
+
+private:
+ Q_DECLARE_PRIVATE(QFrameAllocator)
+ const QScopedPointer<QFrameAllocatorPrivate> d_ptr;
+};
+
+} // Qt3D
+
+QT_END_NAMESPACE
+
+#endif // QFRAMEALLOCATOR_P_H
diff --git a/src/core/resources/qframeallocator_p_p.h b/src/core/resources/qframeallocator_p_p.h
new file mode 100644
index 000000000..bf4e0a2b1
--- /dev/null
+++ b/src/core/resources/qframeallocator_p_p.h
@@ -0,0 +1,138 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt3D 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 The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/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 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QT3DCORE_QFRAMEALLOCATOR_P_P_H
+#define QT3DCORE_QFRAMEALLOCATOR_P_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of other Qt classes. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <Qt3DCore/qt3dcore_global.h>
+
+QT_BEGIN_NAMESPACE
+
+namespace Qt3DCore {
+
+class QFrameAllocator;
+
+struct Q_AUTOTEST_EXPORT QFrameChunk
+{
+ void init(uint blockSize, uchar blocks);
+ void *allocate(uint blockSize);
+
+ void deallocate(void *p, uint blockSize);
+ bool contains(void *p, uint blockSize);
+ void clear(uint blockSize, uchar blocks);
+ void release();
+
+ inline bool isEmpty() const { return m_blocksAvailable == m_maxBlocksAvailable; }
+
+ uchar *m_data;
+ uchar m_firstAvailableBlock;
+ uchar m_blocksAvailable;
+ uchar m_maxBlocksAvailable;
+};
+
+class Q_AUTOTEST_EXPORT QFixedFrameAllocator
+{
+public:
+ QFixedFrameAllocator();
+ ~QFixedFrameAllocator();
+
+ void init(uint blockSize, uchar pageSize = 128);
+ void *allocate();
+ void deallocate(void *ptr);
+ void trim();
+ void release();
+ void clear();
+ bool isEmpty() const;
+
+ inline int chunkCount() const { return m_chunks.size(); }
+ inline uchar pageSize() const { return m_nbrBlock; }
+ inline uint blockSize() const { return m_blockSize; }
+
+private:
+ QFrameChunk &scan();
+
+private:
+ uint m_blockSize;
+ uchar m_nbrBlock;
+ QVector<QFrameChunk> m_chunks;
+ QFrameChunk *m_lastAllocatedChunck;
+ QFrameChunk *m_lastFreedChunck;
+};
+
+class QFrameAllocatorPrivate
+{
+public:
+ QFrameAllocatorPrivate();
+
+ inline void *allocateAtChunk(uint allocatorIndex)
+ {
+ return m_allocatorPool[allocatorIndex].allocate();
+ }
+
+ inline void deallocateAtChunck(void *ptr, uint allocatorIndex)
+ {
+ m_allocatorPool[allocatorIndex].deallocate(ptr);
+ }
+
+ inline uint allocatorIndexFromSize(uint targetSize) const
+ {
+ return (targetSize + m_alignment - 1) / m_alignment - 1;
+ }
+
+ uint m_maxObjectSize;
+ uint m_alignment;
+ QVector<QFixedFrameAllocator> m_allocatorPool;
+};
+
+} // Qt3D
+
+QT_END_NAMESPACE
+
+#endif // QT3DCORE_QFRAMEALLOCATOR_P_P_H
diff --git a/src/core/resources/qhandle_p.h b/src/core/resources/qhandle_p.h
index 46bd5f5d4..15f34fe98 100644
--- a/src/core/resources/qhandle_p.h
+++ b/src/core/resources/qhandle_p.h
@@ -123,6 +123,13 @@ uint qHash(const QHandle<T> &h, uint seed)
return qHash(h.handle(), seed);
}
+template <typename T>
+uint qHash(const QHandle<T> &h)
+{
+ using QT_PREPEND_NAMESPACE(qHash);
+ return qHash(h.handle());
+}
+
} // Qt3DCore
// simpler than fighting the Q_DECLARE_TYPEINFO macro, use QString as a dummy to get movable semantics
diff --git a/src/core/resources/resources.pri b/src/core/resources/resources.pri
index d25070d56..8fa4791c3 100644
--- a/src/core/resources/resources.pri
+++ b/src/core/resources/resources.pri
@@ -1,9 +1,12 @@
HEADERS += \
+ $$PWD/qframeallocator_p.h \
+ $$PWD/qframeallocator_p_p.h \
$$PWD/qloadgltf_p.h \
$$PWD/qresourcemanager_p.h \
$$PWD/qhandle_p.h
SOURCES += \
+ $$PWD/qframeallocator.cpp \
$$PWD/qresourcemanager.cpp
diff --git a/src/core/transforms/qarmature.h b/src/core/transforms/qarmature.h
index 5e02f99c3..34f91e280 100644
--- a/src/core/transforms/qarmature.h
+++ b/src/core/transforms/qarmature.h
@@ -42,13 +42,13 @@
#include <Qt3DCore/qcomponent.h>
#include <Qt3DCore/qt3dcore_global.h>
+#include <Qt3DCore/qabstractskeleton.h>
QT_BEGIN_NAMESPACE
namespace Qt3DCore {
class QArmaturePrivate;
-class QAbstractSkeleton;
class Q_3DCORESHARED_EXPORT QArmature : public Qt3DCore::QComponent
{
diff --git a/src/core/transforms/qskeleton.h b/src/core/transforms/qskeleton.h
index 51763b488..871d3b3b4 100644
--- a/src/core/transforms/qskeleton.h
+++ b/src/core/transforms/qskeleton.h
@@ -41,13 +41,13 @@
#define QT3DCORE_QSKELETON_H
#include <Qt3DCore/qabstractskeleton.h>
+#include <Qt3DCore/qjoint.h>
#include <Qt3DCore/qt3dcore_global.h>
QT_BEGIN_NAMESPACE
namespace Qt3DCore {
-class QJoint;
class QSkeletonPrivate;
class Q_3DCORESHARED_EXPORT QSkeleton : public QAbstractSkeleton
diff --git a/src/core/transforms/qskeletonloader.h b/src/core/transforms/qskeletonloader.h
index 23b8cdda4..d3297a67f 100644
--- a/src/core/transforms/qskeletonloader.h
+++ b/src/core/transforms/qskeletonloader.h
@@ -41,6 +41,7 @@
#define QT3DCORE_QSKELETONLOADER_H
#include <Qt3DCore/qabstractskeleton.h>
+#include <Qt3DCore/qjoint.h>
#include <Qt3DCore/qt3dcore_global.h>
#include <QtCore/qurl.h>
@@ -48,7 +49,6 @@ QT_BEGIN_NAMESPACE
namespace Qt3DCore {
-class QJoint;
class QSkeletonLoaderPrivate;
class Q_3DCORESHARED_EXPORT QSkeletonLoader : public QAbstractSkeleton