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) {
75 std::stable_sort(m_scheduledUserPasses.begin(), m_scheduledUserPasses.end(), [](
const QSSGRenderUserPass *a,
const QSSGRenderUserPass *b) {
76 return a->m_dependencyIndex > b->m_dependencyIndex;
80 m_passlistDirty =
false;
83bool QSSGUserRenderPassManager::derefTexture(QRhiTexture *texture)
85 auto foundIt = m_trackedTextures.find(texture);
86 const bool wasFound = foundIt != m_trackedTextures.end();
89 if (!(foundIt.value() > 1)) {
90 m_trackedTextures.erase(foundIt);
91 m_deferredReleaseTextures.insert(texture);
96 qWarning() <<
"QSSGUserRenderPassManager::derefTexture: Trying to deref a texture that is not tracked.";
102void QSSGUserRenderPassManager::refTexture(QRhiTexture *texture)
104 auto it = m_trackedTextures.find(texture);
105 if (it != m_trackedTextures.end())
108 m_trackedTextures.insert(texture, 1);
111bool QSSGUserRenderPassManager::derefTexture(
const std::unique_ptr<QRhiTexture> &texture)
113 return derefTexture(texture.get());
116void QSSGUserRenderPassManager::refTexture(
const std::unique_ptr<QRhiTexture> &texture)
118 refTexture(texture.get());
121void QSSGUserRenderPassManager::unregisterManagedTexture(QSSGManagedRhiTexture *textureWrapper)
123 QSSG_ASSERT(textureWrapper !=
nullptr,
return);
125 const auto foundIt = std::find(m_trackedTextureWrappers.cbegin(), m_trackedTextureWrappers.cend(), textureWrapper);
126 if (foundIt != m_trackedTextureWrappers.cend()) {
127 auto &texture = textureWrapper->texture();
128 if (!derefTexture(texture))
129 qWarning(
"QSSGSharedRhiTextureWrapper: Texture was not tracked by the manager, possible resource leak.");
130 m_trackedTextureWrappers.erase(foundIt);
134void QSSGUserRenderPassManager::registerManagedTexture(QSSGManagedRhiTexture *textureWrapper)
136 QSSG_ASSERT(textureWrapper !=
nullptr,
return);
138 const auto foundIt = std::find(m_trackedTextureWrappers.cbegin(), m_trackedTextureWrappers.cend(), textureWrapper);
139 if (foundIt == m_trackedTextureWrappers.cend()) {
140 refTexture(textureWrapper->texture());
141 m_trackedTextureWrappers.push_back(textureWrapper);
145qsizetype QSSGUserRenderPassManager::acquireUserPassSlot()
147 if (m_userPassSlotsUsed < maxUserPassSlots() - 1)
148 return qsizetype(m_userPassSlotsUsed++);
150 qWarning() <<
"Exceeded maximum number of user render passes(" << QSSGUserRenderPassManager::maxUserPassSlots() <<
")";
155void QSSGUserRenderPassManager::resetForFrame()
157 qDeleteAll(m_deferredReleaseTextures.cbegin(), m_deferredReleaseTextures.cend());
158 m_deferredReleaseTextures.clear();
160 m_userPassSlotsUsed = 0;
163void QSSGUserRenderPassManager::releaseAll()
165 m_scheduledUserPasses.clear();
170 for (
auto &rt : m_renderPassRenderTargets)
173 m_renderPassRenderTargets.clear();
176 auto cpy = m_trackedTextureWrappers;
183 qDeleteAll(m_deferredReleaseTextures.cbegin(), m_deferredReleaseTextures.cend());
184 m_deferredReleaseTextures.clear();
186 Q_ASSERT(m_trackedTextureWrappers.size() == 0);
188 if (m_trackedTextures.size() > 0) {
189 qWarning() <<
"QSSGUserRenderPassManager::releaseAll: There are still tracked textures (" << m_trackedTextures.size() <<
") when releasing all. This indicates a resource leak.";
190 for (
auto it = m_trackedTextures.constBegin(); it != m_trackedTextures.constEnd(); ++it)
191 qCDebug(QSSGUserRenderPassManagerLog) <<
"Texture: " << it.key()->name() <<
", has ref count: " << it.value();
Combined button and popup list for selecting options.