46 enum SyncResultFlag : quint32
49 SharedResourcesDirty = 0x1,
53 using SyncResult = std::underlying_type_t<SyncResultFlag>;
55 explicit QQuick3DWindowAttachment(QQuickWindow *window);
56 ~QQuick3DWindowAttachment() override;
58 Q_INVOKABLE
void preSync();
59 Q_INVOKABLE
void cleanupResources();
60 Q_INVOKABLE SyncResult synchronize(QSet<QSSGRenderGraphObject *> &resourceLoaders);
61 Q_INVOKABLE
void requestUpdate();
62 Q_INVOKABLE
void evaluateEol();
64 QQuickWindow *window()
const;
66 QSSGRenderRoot *rootNode()
const {
return m_rootNode; }
68 const std::shared_ptr<QSSGRenderContextInterface> &rci()
const {
return m_rci; }
69 void setRci(
const std::shared_ptr<QSSGRenderContextInterface> &rciptr);
71 void registerSceneManager(QQuick3DSceneManager &manager);
72 void unregisterSceneManager(QQuick3DSceneManager &manager);
74 void queueForCleanup(QSSGRenderGraphObject *obj);
75 void queueForCleanup(QQuick3DSceneManager *manager);
76 void queueForCleanup(QSSGRenderLayer *layer);
79 void releaseCachedResources();
80 void renderContextInterfaceChanged();
83 Q_INVOKABLE
void onReleaseCachedResources();
84 Q_INVOKABLE
void onInvalidated();
86 QPointer<QQuickWindow> m_window;
87 QSSGRenderRoot *m_rootNode =
nullptr;
88 std::shared_ptr<QSSGRenderContextInterface> m_rci;
89 QList<QQuick3DSceneManager *> sceneManagers;
90 QList<QQuick3DSceneManager *> sceneManagerCleanupQueue;
91 QList<QSSGRenderGraphObject *> pendingResourceCleanupQueue;
92 QSet<QSSGRenderGraphObject *> resourceCleanupQueue;
93 QList<QSSGRenderLayer *> pendingLayerCleanupQueue;
100 using SyncResultFlag = QQuick3DWindowAttachment::SyncResultFlag;
101 using SyncResult = QQuick3DWindowAttachment::SyncResult;
103 explicit QQuick3DSceneManager(QObject *parent =
nullptr);
104 ~QQuick3DSceneManager() override;
106 void setWindow(QQuickWindow *window);
107 QQuickWindow *window();
109 void dirtyItem(QQuick3DObject *item);
110 void requestUpdate();
111 void cleanup(QSSGRenderGraphObject *item);
118 SyncResult cleanupNodes();
119 SyncResult updateDirtyResourceNodes();
120 void updateDirtySpatialNodes();
121 SyncResult updateDiryExtensions();
122 SyncResult updateDirtyResourceSecondPass();
124 void updateDirtyResource(QQuick3DObject *resourceObject);
125 void updateDirtySpatialNode(QQuick3DNode *spatialNode);
126 void updateBoundingBoxes(QSSGBufferManager &mgr);
128 QQuick3DObject *lookUpNode(
const QSSGRenderGraphObject *node)
const;
135 enum class NodePriority { Skeleton, Other, ModelWithInstanceRoot, Lights, Count };
136 enum class ResourcePriority { TextureData, Texture, Other, Count };
137 enum class ExtensionPriority { RenderExtension, Count };
139 static inline size_t resourceListIndex(QSSGRenderGraphObject::Type type)
141 Q_ASSERT(!QSSGRenderGraphObject::isNodeType(type));
143 if (QSSGRenderGraphObject::isTexture(type))
144 return size_t(ResourcePriority::Texture);
146 if (type == QSSGRenderGraphObject::Type::TextureData)
147 return size_t(ResourcePriority::TextureData);
149 return size_t(ResourcePriority::Other);
152 static inline size_t nodeListIndex(QSSGRenderGraphObject::Type type)
154 Q_ASSERT(QSSGRenderGraphObject::isNodeType(type));
156 if (QSSGRenderGraphObject::isLight(type))
157 return size_t(NodePriority::Lights);
159 if (type == QSSGRenderGraphObject::Type::Skeleton)
160 return size_t(NodePriority::Skeleton);
162 return size_t(NodePriority::Other);
165 static constexpr size_t extensionListIndex(QSSGRenderGraphObject::Type type)
167 Q_ASSERT(QSSGRenderGraphObject::isExtension(type));
169 return size_t(ExtensionPriority::RenderExtension);
172 static QQuick3DWindowAttachment *getOrSetWindowAttachment(QQuickWindow &window);
174 QQuick3DObject *dirtyResources[size_t(ResourcePriority::Count)] {};
175 QQuick3DObject *dirtyNodes[size_t(NodePriority::Count)] {};
176 QQuick3DObject *dirtyExtensions[size_t(ExtensionPriority::Count)] {};
182 QSet<QQuick3DObject *> dirtySecondPassResources;
184 QList<QQuick3DObject *> dirtyBoundingBoxList;
185 QSet<QSSGRenderGraphObject *> cleanupNodeList;
186 QList<QSSGRenderGraphObject *> resourceCleanupQueue;
188 QSet<QQuick3DObject *> parentlessItems;
189 QVector<QSGDynamicTexture *> qsgDynamicTextures;
190 QHash<QSSGRenderGraphObject *, QQuick3DObject *> m_nodeMap;
191 QSet<QSSGRenderGraphObject *> resourceLoaders;
192 QList<QSSGRenderExtension *> autoRegisteredExtensions;
193 QList<QSSGRenderUserPass *> userRenderPasses;
194 QQuickWindow *m_window =
nullptr;
195 QPointer<QQuick3DWindowAttachment> wattached;
196 int inputHandlingEnabled = 0;
197 bool sharedResourceRemoved =
false;
198 bool autoRegisteredExtensionsDirty =
false;
199 friend QQuick3DObject;
203 void windowChanged();
206 SyncResult updateResources(QQuick3DObject **listHead);
207 void updateNodes(QQuick3DObject **listHead);
208 SyncResult updateExtensions(QQuick3DObject **listHead);