7#include "graphobjects/qssgrenderuserpass_p.h"
9#include <QtCore/qloggingcategory.h>
13Q_STATIC_LOGGING_CATEGORY(QSSGUserRenderPassManagerLog,
"qt.quick3d.runtimerender.userpassmanager")
15QSSGUserRenderPassManager::QSSGUserRenderPassManager(Private)
20QSSGUserRenderPassManager::~QSSGUserRenderPassManager()
22 for (
auto &rt : m_renderPassRenderTargets)
25 const auto textures = m_trackedTextures.keys();
29void QSSGUserRenderPassManager::scheduleUserPass(QSSGRenderUserPass *userPasses)
31 if (userPasses !=
nullptr) {
32 auto it = std::find(m_scheduledUserPasses.begin(), m_scheduledUserPasses.end(), userPasses);
33 if (it == m_scheduledUserPasses.end()) {
34 m_scheduledUserPasses.push_back(userPasses);
35 m_passlistDirty =
true;
40void QSSGUserRenderPassManager::unscheduleUserPass(
const QSSGRenderUserPass *userPasses)
42 if (userPasses !=
nullptr) {
43 auto it = std::find(m_scheduledUserPasses.cbegin(), m_scheduledUserPasses.cend(), userPasses);
44 if (it != m_scheduledUserPasses.cend()) {
45 m_scheduledUserPasses.erase(it);
46 m_passlistDirty =
true;
51QSSGRhiRenderableTextureV2Ptr QSSGUserRenderPassManager::getOrCreateRenderableTexture(
const QSSGRenderUserPass &userPass)
53 auto it = m_renderPassRenderTargets.find(&userPass);
54 if (it != m_renderPassRenderTargets.end())
57 auto iter = m_renderPassRenderTargets.insert(&userPass, std::make_shared<QSSGRhiRenderableTextureV2>(shared_from_this(), QSSGRhiRenderableTextureV2::Private::Initialize));
61QSSGRhiRenderableTextureV2Ptr QSSGUserRenderPassManager::getUserPassTexureResult(
const QSSGRenderUserPass &userPass)
const
63 const auto foundIt = m_renderPassRenderTargets.find(&userPass);
64 if (foundIt != m_renderPassRenderTargets.end())
65 return foundIt.value();
70void QSSGUserRenderPassManager::updateUserPassOrder(
bool forceUpdate)
72 if (m_passlistDirty || forceUpdate) {
73 std::sort(m_scheduledUserPasses.begin(), m_scheduledUserPasses.end(), [](
const QSSGRenderUserPass *a,
const QSSGRenderUserPass *b) {
74 return a->m_dependencyIndex > b->m_dependencyIndex;
78 m_passlistDirty =
false;
81bool QSSGUserRenderPassManager::derefTexture(QRhiTexture *texture)
83 auto foundIt = m_trackedTextures.find(texture);
84 const bool wasFound = foundIt != m_trackedTextures.constEnd();
87 if (!(foundIt.value() > 1)) {
88 m_trackedTextures.erase(foundIt);
89 m_deferredReleaseTextures.insert(texture);
94 qWarning() <<
"QSSGUserRenderPassManager::derefTexture: Trying to deref a texture that is not tracked.";
100void QSSGUserRenderPassManager::refTexture(QRhiTexture *texture)
102 auto it = m_trackedTextures.find(texture);
103 if (it != m_trackedTextures.end())
106 m_trackedTextures.insert(texture, 1);
109bool QSSGUserRenderPassManager::derefTexture(
const std::unique_ptr<QRhiTexture> &texture)
111 return derefTexture(texture.get());
114void QSSGUserRenderPassManager::refTexture(
const std::unique_ptr<QRhiTexture> &texture)
116 refTexture(texture.get());
119void QSSGUserRenderPassManager::unregisterManagedTexture(QSSGManagedRhiTexture *textureWrapper)
121 QSSG_ASSERT(textureWrapper !=
nullptr,
return);
123 const auto foundIt = std::find(m_trackedTextureWrappers.cbegin(), m_trackedTextureWrappers.cend(), textureWrapper);
124 if (foundIt != m_trackedTextureWrappers.cend()) {
125 auto &texture = textureWrapper->texture();
126 if (!derefTexture(texture))
127 qWarning(
"QSSGSharedRhiTextureWrapper: Texture was not tracked by the manager, possible resource leak.");
128 m_trackedTextureWrappers.erase(foundIt);
132void QSSGUserRenderPassManager::registerManagedTexture(QSSGManagedRhiTexture *textureWrapper)
134 QSSG_ASSERT(textureWrapper !=
nullptr,
return);
136 const auto foundIt = std::find(m_trackedTextureWrappers.cbegin(), m_trackedTextureWrappers.cend(), textureWrapper);
137 if (foundIt == m_trackedTextureWrappers.cend()) {
138 refTexture(textureWrapper->texture());
139 m_trackedTextureWrappers.push_back(textureWrapper);
143void QSSGUserRenderPassManager::resetForFrame()
145 qDeleteAll(m_deferredReleaseTextures.cbegin(), m_deferredReleaseTextures.cend());
146 m_deferredReleaseTextures.clear();
149void QSSGUserRenderPassManager::releaseAll()
151 m_scheduledUserPasses.clear();
156 for (
auto &rt : m_renderPassRenderTargets)
159 m_renderPassRenderTargets.clear();
162 auto cpy = m_trackedTextureWrappers;
169 qDeleteAll(m_deferredReleaseTextures.cbegin(), m_deferredReleaseTextures.cend());
170 m_deferredReleaseTextures.clear();
172 Q_ASSERT(m_trackedTextureWrappers.size() == 0);
174 if (m_trackedTextures.size() > 0) {
175 qWarning() <<
"QSSGUserRenderPassManager::releaseAll: There are still tracked textures (" << m_trackedTextures.size() <<
") when releasing all. This indicates a resource leak.";
176 for (
auto it = m_trackedTextures.constBegin(); it != m_trackedTextures.constEnd(); ++it)
177 qCDebug(QSSGUserRenderPassManagerLog) <<
"Texture: " << it.key()->name() <<
", has ref count: " << it.value();
Combined button and popup list for selecting options.