Let we move the OrderedSet class as integration-api so dali-toolkit can use it.
Change-Id: I2dbbff14db048d52c5a02bc967b379defcd2c03e
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
/*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
// INTERNAL INCLUDES
#include <dali-test-suite-utils.h>
-#include <dali/internal/common/ordered-set.h>
+#include <dali/integration-api/ordered-set.h>
-using namespace Dali::Internal;
+using namespace Dali;
+using namespace Dali::Integration;
-void utc_dali_internal_owner_set_startup(void)
+void utc_dali_internal_ordered_set_startup(void)
{
test_return_value = TET_UNDEF;
}
-void utc_dali_internal_owner_set_cleanup(void)
+void utc_dali_internal_ordered_set_cleanup(void)
{
test_return_value = TET_PASS;
}
${platform_abstraction_src_dir}/graphics-sync-abstraction.h
${platform_abstraction_src_dir}/input-options.h
${platform_abstraction_src_dir}/lockless-buffer.h
+ ${platform_abstraction_src_dir}/ordered-set.h
${platform_abstraction_src_dir}/pixel-data-integ.h
${platform_abstraction_src_dir}/platform-abstraction.h
${platform_abstraction_src_dir}/profiling.h
--- /dev/null
+#ifndef DALI_INTEGRATION_ORDERED_SET_H
+#define DALI_INTEGRATION_ORDERED_SET_H
+
+/*
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// EXTERNAL INCLUDES
+#include <unordered_map>
+
+// INTERNAL INCLUDES
+#include <dali/public-api/common/dali-common.h>
+#include <dali/public-api/common/list-wrapper.h>
+
+namespace Dali
+{
+namespace Integration
+{
+/**
+ * @brief Container of data which has strong point to Find & Erase.
+ * It will be useful when we need to iterate the order of data insertion.
+ * and need to check whether some object is exist or not very fast.
+ * @note Since the data's memory is not continuos, iteration is slower than normal vector contianer.
+ * @note Currently, we only support to hold pointer type data.
+ *
+ * @tparam T The type of class
+ * @tparam owned True if data is owned, So we will automatcally release the memory
+ * False if data is not owned by this set. Default as true.
+ * @tparam Hash Custom hash function of const T* type for MapContainer.
+ * Note that if two const T* return true at KeyEqual, Hash should return same value.
+ * Default as std::hash<const T*>
+ * @tparam KeyEqual Custom equal function of const T* type for MapContainer.
+ * Return true if two const T* type is equal. Default as std::equal_to<const T*>
+ */
+template<class T, bool owned = true, class Hash = std::hash<const T*>, class KeyEqual = std::equal_to<const T*>>
+class OrderedSet
+{
+public:
+ // Real data owned container.
+ using ListContainer = typename std::list<T*>;
+ using Iterator = typename ListContainer::iterator;
+ using ConstIterator = typename ListContainer::const_iterator;
+
+ // Find helper map container.
+ using MapContainer = typename std::unordered_map<const T*, Iterator, Hash, KeyEqual>;
+
+ using SizeType = std::size_t;
+
+ /**
+ * @brief Construct a new OrderedSet object
+ */
+ OrderedSet() = default;
+
+ /**
+ * @brief Move construct
+ */
+ OrderedSet(OrderedSet&& rhs) noexcept
+ : mMap(std::move(rhs.mMap)),
+ mList(std::move(rhs.mList))
+ {
+ rhs.mMap.clear();
+ rhs.mMap.rehash(0);
+ rhs.mList.clear();
+ }
+
+ /**
+ * @brief Move assign
+ */
+ OrderedSet& operator=(OrderedSet&& rhs) noexcept
+ {
+ Clear();
+ mMap = std::move(rhs.mMap);
+ mList = std::move(rhs.mList);
+ rhs.mMap.clear();
+ rhs.mMap.rehash(0);
+ rhs.mList.clear();
+ return *this;
+ }
+
+ ~OrderedSet()
+ {
+ Clear();
+ }
+
+ /**
+ * @brief Iterator of begin & end
+ */
+ Iterator Begin()
+ {
+ return mList.begin();
+ }
+ Iterator End()
+ {
+ return mList.end();
+ }
+ ConstIterator Begin() const
+ {
+ return mList.begin();
+ }
+ ConstIterator End() const
+ {
+ return mList.end();
+ }
+
+ // Support for C++11 Range-based for loop: for( item : container ).
+ Iterator begin()
+ {
+ return Begin();
+ }
+ Iterator end()
+ {
+ return End();
+ }
+ ConstIterator begin() const
+ {
+ return Begin();
+ }
+ ConstIterator end() const
+ {
+ return End();
+ }
+
+ /**
+ * @brief Get the number of elements.
+ *
+ * @return The number of elements that this container owned.
+ */
+ SizeType Count() const
+ {
+ return mMap.size();
+ }
+
+ /**
+ * @brief Reserves space in the ordered set.
+ *
+ * @param[in] count Count of elements to reserve
+ */
+ void Reserve(SizeType count)
+ {
+ if(mMap.size() < count)
+ {
+ mMap.rehash(count);
+ }
+ }
+
+ /**
+ * @brief Find and get iterator of object. If not exist, return End().
+ *
+ * @param[in] object The object pointer what we want to find.
+ * @return Iterator of object, or End().
+ */
+ Iterator Find(T* object)
+ {
+ auto mapIter = mMap.find(object);
+ if(mapIter == mMap.end())
+ {
+ return End();
+ }
+ return mapIter->second;
+ }
+ ConstIterator Find(const T* object) const
+ {
+ auto mapIter = mMap.find(object);
+ if(mapIter == mMap.end())
+ {
+ return End();
+ }
+ return mapIter->second;
+ }
+
+ /**
+ * @brief PushBack and keep ownership of object.
+ * @note Iterator will keep order of PushBack API call.
+ *
+ * @param[in] object The object pointer what we want to insert.
+ */
+ void PushBack(T* object)
+ {
+ DALI_ASSERT_DEBUG(Find(object) == End());
+ auto newIter = mList.insert(mList.end(), object);
+ mMap.insert({object, newIter});
+ }
+
+ /**
+ * @brief Erase and remove memory of object.
+ *
+ * @param[in] object The object pointer what we want to erase.
+ */
+ void EraseObject(T* object)
+ {
+ // TODO : Should we allow duplicated erase?
+ //DALI_ASSERT_DEBUG(Find(object) != End());
+ Erase(Find(object));
+ }
+ void EraseObject(const T* object)
+ {
+ // TODO : Should we allow duplicated erase?
+ //DALI_ASSERT_DEBUG(Find(object) != End());
+ Erase(Find(object));
+ }
+
+ /**
+ * @brief Erase and remove memory of object by iterator.
+ *
+ * @param[in] iter The iterator what we want to erase.
+ */
+ Iterator Erase(Iterator iter)
+ {
+ Iterator ret = mList.end();
+ if(iter != mList.end())
+ {
+ // Erase mMap first.
+ auto mapIter = mMap.find(*iter);
+ DALI_ASSERT_DEBUG(mapIter != mMap.end());
+ mMap.erase(mapIter);
+
+ // Erase owned object.
+ if constexpr(owned)
+ {
+ delete *iter;
+ }
+ ret = mList.erase(iter);
+ }
+ return ret;
+ }
+ ConstIterator Erase(ConstIterator iter)
+ {
+ ConstIterator ret = mList.end();
+ if(iter != mList.end())
+ {
+ // Erase mMap first.
+ auto mapIter = mMap.find(*iter);
+ DALI_ASSERT_DEBUG(mapIter != mMap.end());
+ mMap.erase(mapIter);
+
+ // Erase owned object.
+ if constexpr(owned)
+ {
+ delete *iter;
+ }
+ ret = mList.erase(iter);
+ }
+ return ret;
+ }
+
+ /**
+ * @brief Release and move ownership of object.
+ * This API do not remove memory.
+ *
+ * @post iterators are invalidated by this method.
+ * @param[in] iter The iterator what we want to release.
+ */
+ T* Release(Iterator iter)
+ {
+ T* result = (*iter);
+
+ // Erase mMap first.
+ auto mapIter = mMap.find(result);
+ DALI_ASSERT_DEBUG(mapIter != mMap.end());
+ mMap.erase(mapIter);
+
+ // Erase without delete reference
+ mList.erase(iter);
+ return result;
+ }
+ T* Release(ConstIterator iter)
+ {
+ const T* result = (*iter);
+
+ // Erase mMap first.
+ auto mapIter = mMap.find(result);
+ DALI_ASSERT_DEBUG(mapIter != mMap.end());
+ mMap.erase(mapIter);
+
+ // Erase without delete reference
+ mList.erase(iter);
+ return result;
+ }
+
+ /**
+ * @brief Remove all data and release memory if we owned data.
+ */
+ void Clear()
+ {
+ // Delete memory
+ if constexpr(owned)
+ {
+ for(auto&& iter : mList)
+ {
+ delete iter;
+ }
+ }
+ mMap.clear();
+ mMap.rehash(0);
+ mList.clear();
+ }
+
+private:
+ // Delete copy operation.
+ OrderedSet(const OrderedSet&) = delete;
+ OrderedSet& operator=(const OrderedSet&) = delete;
+
+private:
+ MapContainer mMap{}; ///< Helper cache map to find item fast.
+ ListContainer mList{}; ///< Ordered by PushBack API called. Actual ownership will be stored here.
+};
+} // namespace Integration
+} // namespace Dali
+
+#endif // DALI_INTEGRATION_ORDERED_SET_H
+++ /dev/null
-#ifndef DALI_INTERNAL_ORDERED_SET_H
-#define DALI_INTERNAL_ORDERED_SET_H
-
-/*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// EXTERNAL INCLUDES
-#include <unordered_map>
-
-// INTERNAL INCLUDES
-#include <dali/public-api/common/dali-common.h>
-#include <dali/public-api/common/list-wrapper.h>
-
-namespace Dali
-{
-namespace Internal
-{
-/**
- * @brief Container of data which has strong point to Find & Erase.
- * It will be useful when we need to iterate the order of data insertion.
- * and need to check whether some object is exist or not very fast.
- * @note Since the data's memory is not continuos, iteration is slower than normal vector contianer.
- *
- * @tparam T The type of class
- * @tparam owned True if data is owned, So we will automatcally release the memory
- * False if data is not owned by this set. Default as true.
- * @tparam Hash Custom hash function of const T* type for MapContainer.
- * Note that if two const T* return true at KeyEqual, Hash should return same value.
- * Default as std::hash<const T*>
- * @tparam KeyEqual Custom equal function of const T* type for MapContainer.
- * Return true if two const T* type is equal. Default as std::equal_to<const T*>
- */
-template<class T, bool owned = true, class Hash = std::hash<const T*>, class KeyEqual = std::equal_to<const T*>>
-class OrderedSet
-{
-public:
- // Real data owned container.
- using ListContainer = typename std::list<T*>;
- using Iterator = typename ListContainer::iterator;
- using ConstIterator = typename ListContainer::const_iterator;
-
- // Find helper map container.
- using MapContainer = typename std::unordered_map<const T*, Iterator, Hash, KeyEqual>;
-
- using SizeType = std::size_t;
-
- /**
- * @brief Construct a new OrderedSet object
- */
- OrderedSet() = default;
-
- /**
- * @brief Move construct
- */
- OrderedSet(OrderedSet&& rhs) noexcept
- : mMap(std::move(rhs.mMap)),
- mList(std::move(rhs.mList))
- {
- rhs.mMap.clear();
- rhs.mMap.rehash(0);
- rhs.mList.clear();
- }
-
- /**
- * @brief Move assign
- */
- OrderedSet& operator=(OrderedSet&& rhs) noexcept
- {
- Clear();
- mMap = std::move(rhs.mMap);
- mList = std::move(rhs.mList);
- rhs.mMap.clear();
- rhs.mMap.rehash(0);
- rhs.mList.clear();
- return *this;
- }
-
- ~OrderedSet()
- {
- Clear();
- }
-
- /**
- * @brief Iterator of begin & end
- */
- Iterator Begin()
- {
- return mList.begin();
- }
- Iterator End()
- {
- return mList.end();
- }
- ConstIterator Begin() const
- {
- return mList.begin();
- }
- ConstIterator End() const
- {
- return mList.end();
- }
-
- // Support for C++11 Range-based for loop: for( item : container ).
- Iterator begin()
- {
- return Begin();
- }
- Iterator end()
- {
- return End();
- }
- ConstIterator begin() const
- {
- return Begin();
- }
- ConstIterator end() const
- {
- return End();
- }
-
- /**
- * @brief Get the number of elements.
- *
- * @return The number of elements that this container owned.
- */
- SizeType Count() const
- {
- return mMap.size();
- }
-
- /**
- * @brief Reserves space in the ordered set.
- *
- * @param[in] count Count of elements to reserve
- */
- void Reserve(SizeType count)
- {
- if(mMap.size() < count)
- {
- mMap.rehash(count);
- }
- }
-
- /**
- * @brief Find and get iterator of object. If not exist, return End().
- *
- * @param[in] object The object pointer what we want to find.
- * @return Iterator of object, or End().
- */
- Iterator Find(T* object)
- {
- auto mapIter = mMap.find(object);
- if(mapIter == mMap.end())
- {
- return End();
- }
- return mapIter->second;
- }
- ConstIterator Find(const T* object) const
- {
- auto mapIter = mMap.find(object);
- if(mapIter == mMap.end())
- {
- return End();
- }
- return mapIter->second;
- }
-
- /**
- * @brief PushBack and keep ownership of object.
- * @note Iterator will keep order of PushBack API call.
- *
- * @param[in] object The object pointer what we want to insert.
- */
- void PushBack(T* object)
- {
- DALI_ASSERT_DEBUG(Find(object) == End());
- auto newIter = mList.insert(mList.end(), object);
- mMap.insert({object, newIter});
- }
-
- /**
- * @brief Erase and remove memory of object.
- *
- * @param[in] object The object pointer what we want to erase.
- */
- void EraseObject(T* object)
- {
- // TODO : Should we allow duplicated erase?
- //DALI_ASSERT_DEBUG(Find(object) != End());
- Erase(Find(object));
- }
- void EraseObject(const T* object)
- {
- // TODO : Should we allow duplicated erase?
- //DALI_ASSERT_DEBUG(Find(object) != End());
- Erase(Find(object));
- }
-
- /**
- * @brief Erase and remove memory of object by iterator.
- *
- * @param[in] iter The iterator what we want to erase.
- */
- Iterator Erase(Iterator iter)
- {
- Iterator ret = mList.end();
- if(iter != mList.end())
- {
- // Erase mMap first.
- auto mapIter = mMap.find(*iter);
- DALI_ASSERT_DEBUG(mapIter != mMap.end());
- mMap.erase(mapIter);
-
- // Erase owned object.
- if constexpr(owned)
- {
- delete *iter;
- }
- ret = mList.erase(iter);
- }
- return ret;
- }
- ConstIterator Erase(ConstIterator iter)
- {
- ConstIterator ret = mList.end();
- if(iter != mList.end())
- {
- // Erase mMap first.
- auto mapIter = mMap.find(*iter);
- DALI_ASSERT_DEBUG(mapIter != mMap.end());
- mMap.erase(mapIter);
-
- // Erase owned object.
- if constexpr(owned)
- {
- delete *iter;
- }
- ret = mList.erase(iter);
- }
- return ret;
- }
-
- /**
- * @brief Release and move ownership of object.
- * This API do not remove memory.
- *
- * @post iterators are invalidated by this method.
- * @param[in] iter The iterator what we want to release.
- */
- T* Release(Iterator iter)
- {
- T* result = (*iter);
-
- // Erase mMap first.
- auto mapIter = mMap.find(result);
- DALI_ASSERT_DEBUG(mapIter != mMap.end());
- mMap.erase(mapIter);
-
- // Erase without delete reference
- mList.erase(iter);
- return result;
- }
- T* Release(ConstIterator iter)
- {
- const T* result = (*iter);
-
- // Erase mMap first.
- auto mapIter = mMap.find(result);
- DALI_ASSERT_DEBUG(mapIter != mMap.end());
- mMap.erase(mapIter);
-
- // Erase without delete reference
- mList.erase(iter);
- return result;
- }
-
- /**
- * @brief Remove all data and release memory if we owned data.
- */
- void Clear()
- {
- // Delete memory
- if constexpr(owned)
- {
- for(auto&& iter : mList)
- {
- delete iter;
- }
- }
- mMap.clear();
- mMap.rehash(0);
- mList.clear();
- }
-
-private:
- // Delete copy operation.
- OrderedSet(const OrderedSet&) = delete;
- OrderedSet& operator=(const OrderedSet&) = delete;
-
-private:
- MapContainer mMap{}; ///< Helper cache map to find item fast.
- ListContainer mList{}; ///< Ordered by PushBack API called. Actual ownership will be stored here.
-};
-} // namespace Internal
-
-} // namespace Dali
-
-#endif // DALI_INTERNAL_ORDERED_SET_H
#define DALI_INTERNAL_ANIMATION_PLAYLIST_H
/*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
// INTERNAL INCLUDES
#include <dali/devel-api/common/map-wrapper.h>
+#include <dali/integration-api/ordered-set.h>
#include <dali/internal/common/message.h>
-#include <dali/internal/common/ordered-set.h>
#include <dali/internal/event/common/complete-notification-interface.h>
#include <dali/internal/event/common/scene-graph-notifier-interface-mapper.h>
#include <dali/public-api/animation/animation.h>
void NotifyCompleted(CompleteNotificationInterface::ParameterList notifierList) override;
private:
- OrderedSet<Animation, false> mAnimations; ///< All existing animations (not owned)
- std::map<Dali::Animation, uint32_t> mPlaylist; ///< The currently playing animations (owned through handle).
- ///< Note we can hold same handles multiple, since OnClear can be called after NotifyCompleted.
+ Integration::OrderedSet<Animation, false> mAnimations; ///< All existing animations (not owned)
+ std::map<Dali::Animation, uint32_t> mPlaylist; ///< The currently playing animations (owned through handle).
+ ///< Note we can hold same handles multiple, since OnClear can be called after NotifyCompleted.
};
/**
#define DALI_INTERNAL_PROPERTY_NOTIFICATION_MANAGER_H
/*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include <unordered_map>
// INTERNAL INCLUDES
-#include <dali/internal/common/ordered-set.h>
+#include <dali/integration-api/ordered-set.h>
#include <dali/internal/event/common/property-notifier.h>
#include <dali/internal/event/common/scene-graph-notifier-interface-mapper.h>
#include <dali/public-api/common/dali-vector.h>
PropertyNotificationManager& operator=(const PropertyNotificationManager& rhs);
private:
- OrderedSet<PropertyNotification, false> mPropertyNotifications; ///< All existing PropertyNotifications (not owned)
+ Integration::OrderedSet<PropertyNotification, false> mPropertyNotifications; ///< All existing PropertyNotifications (not owned)
};
} // namespace Internal
#define DALI_INTERNAL_MEMORY_POOL_RELAYOUT_CONTAINER_H
/*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include <dali/public-api/common/dali-vector.h>
#include <dali/public-api/size-negotiation/relayout-container.h>
+#include <dali/integration-api/ordered-set.h>
#include <dali/internal/common/memory-pool-object-allocator.h>
-#include <dali/internal/common/ordered-set.h>
namespace Dali
{
bool Contains(const Dali::Actor& actor);
private:
- using RelayoutInfoContainer = Dali::Internal::OrderedSet<RelayoutInfo, false, RelayoutInfo::RelayoutInfoHash, RelayoutInfo::RelayoutInfoCompare>;
+ using RelayoutInfoContainer = Dali::Integration::OrderedSet<RelayoutInfo, false, RelayoutInfo::RelayoutInfoHash, RelayoutInfo::RelayoutInfoCompare>;
RelayoutInfoContainer mRelayoutInfos; ///< The list of relayout infos
#define DALI_INTERNAL_RELAYOUT_CONTROLLER_IMPL_H
/*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include <memory> // for unique_ptr
// INTERNAL INCLUDES
+#include <dali/integration-api/ordered-set.h>
#include <dali/internal/common/memory-pool-object-allocator.h>
-#include <dali/internal/common/ordered-set.h>
#include <dali/internal/event/size-negotiation/memory-pool-relayout-container.h>
#include <dali/public-api/common/vector-wrapper.h>
#include <dali/public-api/object/base-object.h>
void OnObjectDestroyed(const Dali::RefObject* object);
private:
- using RawActorList = Dali::Internal::OrderedSet<Dali::Internal::Actor, false>;
+ using RawActorList = Dali::Integration::OrderedSet<Dali::Internal::Actor, false>;
/**
* @brief Request for relayout. Relays out whole scene.
// INTERNAL INCLUDES
#include <dali/integration-api/core.h>
-#include <dali/internal/common/ordered-set.h>
+#include <dali/integration-api/ordered-set.h>
#include <dali/internal/event/common/scene-impl.h>
std::vector<SceneGraph::Scene*> sceneContainer; ///< List of pointers to the scene graph objects of the scenes
Render::RenderAlgorithms renderAlgorithms; ///< The RenderAlgorithms object is used to action the renders required by a RenderInstruction
- OrderedSet<Render::Sampler> samplerContainer; ///< List of owned samplers
- OrderedSet<Render::FrameBuffer> frameBufferContainer; ///< List of owned framebuffers
- OrderedSet<Render::VertexBuffer> vertexBufferContainer; ///< List of owned vertex buffers
- OrderedSet<Render::Geometry> geometryContainer; ///< List of owned Geometries
- OwnerKeyContainer<Render::Renderer> rendererContainer; ///< List of owned renderers
- OwnerKeyContainer<Render::Texture> textureContainer; ///< List of owned textures
+ Integration::OrderedSet<Render::Sampler> samplerContainer; ///< List of owned samplers
+ Integration::OrderedSet<Render::FrameBuffer> frameBufferContainer; ///< List of owned framebuffers
+ Integration::OrderedSet<Render::VertexBuffer> vertexBufferContainer; ///< List of owned vertex buffers
+ Integration::OrderedSet<Render::Geometry> geometryContainer; ///< List of owned Geometries
+ OwnerKeyContainer<Render::Renderer> rendererContainer; ///< List of owned renderers
+ OwnerKeyContainer<Render::Texture> textureContainer; ///< List of owned textures
- OrderedSet<Render::RenderTracker> mRenderTrackers; ///< List of owned render trackers
+ Integration::OrderedSet<Render::RenderTracker> mRenderTrackers; ///< List of owned render trackers
OwnerKeyContainer<Render::Texture> textureDiscardQueue; ///< Discarded textures