43 enum SyncResultFlag : quint32
46 SharedResourcesDirty = 0x1,
50 using SyncResult = std::underlying_type_t<SyncResultFlag>;
52 explicit QQuick3DWindowAttachment(QQuickWindow *window);
53 ~QQuick3DWindowAttachment() override;
55 Q_INVOKABLE
void preSync();
56 Q_INVOKABLE
void cleanupResources();
57 Q_INVOKABLE SyncResult synchronize(QSet<QSSGRenderGraphObject *> &resourceLoaders);
58 Q_INVOKABLE
void requestUpdate();
59 Q_INVOKABLE
void evaluateEol();
61 QQuickWindow *window()
const;
63 QSSGRenderRoot *rootNode()
const {
return m_rootNode; }
65 const std::shared_ptr<QSSGRenderContextInterface> &rci()
const {
return m_rci; }
66 void setRci(
const std::shared_ptr<QSSGRenderContextInterface> &rciptr);
68 void registerSceneManager(QQuick3DSceneManager &manager);
69 void unregisterSceneManager(QQuick3DSceneManager &manager);
71 void queueForCleanup(QSSGRenderGraphObject *obj);
72 void queueForCleanup(QQuick3DSceneManager *manager);
73 void queueForCleanup(QSSGRenderLayer *layer);
76 void releaseCachedResources();
77 void renderContextInterfaceChanged();
80 Q_INVOKABLE
void onReleaseCachedResources();
81 Q_INVOKABLE
void onInvalidated();
83 QPointer<QQuickWindow> m_window;
84 QSSGRenderRoot *m_rootNode =
nullptr;
85 std::shared_ptr<QSSGRenderContextInterface> m_rci;
86 QList<QQuick3DSceneManager *> sceneManagers;
87 QList<QQuick3DSceneManager *> sceneManagerCleanupQueue;
88 QList<QSSGRenderGraphObject *> pendingResourceCleanupQueue;
89 QSet<QSSGRenderGraphObject *> resourceCleanupQueue;
90 QList<QSSGRenderLayer *> pendingLayerCleanupQueue;
97 using SyncResultFlag = QQuick3DWindowAttachment::SyncResultFlag;
98 using SyncResult = QQuick3DWindowAttachment::SyncResult;
100 explicit QQuick3DSceneManager(QObject *parent =
nullptr);
101 ~QQuick3DSceneManager() override;
103 void setWindow(QQuickWindow *window);
104 QQuickWindow *window();
106 void dirtyItem(QQuick3DObject *item);
107 void requestUpdate();
108 void cleanup(QSSGRenderGraphObject *item);
115 SyncResult cleanupNodes();
116 SyncResult updateDirtyResourceNodes();
117 void updateDirtySpatialNodes();
118 SyncResult updateDiryExtensions();
119 SyncResult updateDirtyResourceSecondPass();
121 void updateDirtyResource(QQuick3DObject *resourceObject);
122 void updateDirtySpatialNode(QQuick3DNode *spatialNode);
123 void updateBoundingBoxes(QSSGBufferManager &mgr);
125 QQuick3DObject *lookUpNode(
const QSSGRenderGraphObject *node)
const;
132 enum class NodePriority { Skeleton, Other, ModelWithInstanceRoot, Lights, Count };
133 enum class ResourcePriority { TextureData, Texture, Other, Count };
134 enum class ExtensionPriority { RenderExtension, Count };
136 static inline size_t resourceListIndex(QSSGRenderGraphObject::Type type)
138 Q_ASSERT(!QSSGRenderGraphObject::isNodeType(type));
140 if (QSSGRenderGraphObject::isTexture(type))
141 return size_t(ResourcePriority::Texture);
143 if (type == QSSGRenderGraphObject::Type::TextureData)
144 return size_t(ResourcePriority::TextureData);
146 return size_t(ResourcePriority::Other);
149 static inline size_t nodeListIndex(QSSGRenderGraphObject::Type type)
151 Q_ASSERT(QSSGRenderGraphObject::isNodeType(type));
153 if (QSSGRenderGraphObject::isLight(type))
154 return size_t(NodePriority::Lights);
156 if (type == QSSGRenderGraphObject::Type::Skeleton)
157 return size_t(NodePriority::Skeleton);
159 return size_t(NodePriority::Other);
162 static constexpr size_t extensionListIndex(QSSGRenderGraphObject::Type type)
164 Q_ASSERT(QSSGRenderGraphObject::isExtension(type));
166 return size_t(ExtensionPriority::RenderExtension);
169 static QQuick3DWindowAttachment *getOrSetWindowAttachment(QQuickWindow &window);
171 QQuick3DObject *dirtyResources[size_t(ResourcePriority::Count)] {};
172 QQuick3DObject *dirtyNodes[size_t(NodePriority::Count)] {};
173 QQuick3DObject *dirtyExtensions[size_t(ExtensionPriority::Count)] {};
179 QSet<QQuick3DObject *> dirtySecondPassResources;
181 QList<QQuick3DObject *> dirtyBoundingBoxList;
182 QSet<QSSGRenderGraphObject *> cleanupNodeList;
183 QList<QSSGRenderGraphObject *> resourceCleanupQueue;
185 QSet<QQuick3DObject *> parentlessItems;
186 QVector<QSGDynamicTexture *> qsgDynamicTextures;
187 QHash<QSSGRenderGraphObject *, QQuick3DObject *> m_nodeMap;
188 QSet<QSSGRenderGraphObject *> resourceLoaders;
189 QList<QSSGRenderExtension *> textureProviderExtensions;
190 QQuickWindow *m_window =
nullptr;
191 QPointer<QQuick3DWindowAttachment> wattached;
192 int inputHandlingEnabled = 0;
193 bool sharedResourceRemoved =
false;
194 bool textureExtensionsDirty =
false;
195 friend QQuick3DObject;
199 void windowChanged();
202 SyncResult updateResources(QQuick3DObject **listHead);
203 void updateNodes(QQuick3DObject **listHead);
204 SyncResult updateExtensions(QQuick3DObject **listHead);