diff options
author | Ansariel <ansariel.hiller@phoenixviewer.com> | 2024-05-22 19:04:52 +0200 |
---|---|---|
committer | Ansariel <ansariel.hiller@phoenixviewer.com> | 2024-05-22 19:04:52 +0200 |
commit | 1b67dd855c41f5a0cda7ec2a68d98071986ca703 (patch) | |
tree | ab243607f74f78200787bba5b9b88f07ef1b966f /indra/newview/llvocache.h | |
parent | 6d6eabca44d08d5b97bfe3e941d2b9687c2246ea (diff) | |
parent | e1623bb276f83a43ce7a197e388720c05bdefe61 (diff) |
Merge remote-tracking branch 'origin/main' into DRTVWR-600-maint-A
# Conflicts:
# autobuild.xml
# indra/cmake/CMakeLists.txt
# indra/cmake/GoogleMock.cmake
# indra/llaudio/llaudioengine_fmodstudio.cpp
# indra/llaudio/llaudioengine_fmodstudio.h
# indra/llaudio/lllistener_fmodstudio.cpp
# indra/llaudio/lllistener_fmodstudio.h
# indra/llaudio/llstreamingaudio_fmodstudio.cpp
# indra/llaudio/llstreamingaudio_fmodstudio.h
# indra/llcharacter/llmultigesture.cpp
# indra/llcharacter/llmultigesture.h
# indra/llimage/llimage.cpp
# indra/llimage/llimagepng.cpp
# indra/llimage/llimageworker.cpp
# indra/llimage/tests/llimageworker_test.cpp
# indra/llmessage/tests/llmockhttpclient.h
# indra/llprimitive/llgltfmaterial.h
# indra/llrender/llfontfreetype.cpp
# indra/llui/llcombobox.cpp
# indra/llui/llfolderview.cpp
# indra/llui/llfolderviewmodel.h
# indra/llui/lllineeditor.cpp
# indra/llui/lllineeditor.h
# indra/llui/lltextbase.cpp
# indra/llui/lltextbase.h
# indra/llui/lltexteditor.cpp
# indra/llui/lltextvalidate.cpp
# indra/llui/lltextvalidate.h
# indra/llui/lluictrl.h
# indra/llui/llview.cpp
# indra/llwindow/llwindowmacosx.cpp
# indra/newview/app_settings/settings.xml
# indra/newview/llappearancemgr.cpp
# indra/newview/llappearancemgr.h
# indra/newview/llavatarpropertiesprocessor.cpp
# indra/newview/llavatarpropertiesprocessor.h
# indra/newview/llbreadcrumbview.cpp
# indra/newview/llbreadcrumbview.h
# indra/newview/llbreastmotion.cpp
# indra/newview/llbreastmotion.h
# indra/newview/llconversationmodel.h
# indra/newview/lldensityctrl.cpp
# indra/newview/lldensityctrl.h
# indra/newview/llface.inl
# indra/newview/llfloatereditsky.cpp
# indra/newview/llfloatereditwater.cpp
# indra/newview/llfloateremojipicker.h
# indra/newview/llfloaterimsessiontab.cpp
# indra/newview/llfloaterprofiletexture.cpp
# indra/newview/llfloaterprofiletexture.h
# indra/newview/llgesturemgr.cpp
# indra/newview/llgesturemgr.h
# indra/newview/llimpanel.cpp
# indra/newview/llimpanel.h
# indra/newview/llinventorybridge.cpp
# indra/newview/llinventorybridge.h
# indra/newview/llinventoryclipboard.cpp
# indra/newview/llinventoryclipboard.h
# indra/newview/llinventoryfunctions.cpp
# indra/newview/llinventoryfunctions.h
# indra/newview/llinventorygallery.cpp
# indra/newview/lllistbrowser.cpp
# indra/newview/lllistbrowser.h
# indra/newview/llpanelobjectinventory.cpp
# indra/newview/llpanelprofile.cpp
# indra/newview/llpanelprofile.h
# indra/newview/llpreviewgesture.cpp
# indra/newview/llsavedsettingsglue.cpp
# indra/newview/llsavedsettingsglue.h
# indra/newview/lltooldraganddrop.cpp
# indra/newview/llurllineeditorctrl.cpp
# indra/newview/llvectorperfoptions.cpp
# indra/newview/llvectorperfoptions.h
# indra/newview/llviewerparceloverlay.cpp
# indra/newview/llviewertexlayer.cpp
# indra/newview/llviewertexturelist.cpp
# indra/newview/macmain.h
# indra/test/test.cpp
Diffstat (limited to 'indra/newview/llvocache.h')
-rw-r--r-- | indra/newview/llvocache.h | 660 |
1 files changed, 330 insertions, 330 deletions
diff --git a/indra/newview/llvocache.h b/indra/newview/llvocache.h index a618664faa..5dc4879f2a 100644 --- a/indra/newview/llvocache.h +++ b/indra/newview/llvocache.h @@ -1,330 +1,330 @@ -/** - * @file llvocache.h - * @brief Cache of objects on the viewer. - * - * $LicenseInfo:firstyear=2003&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#ifndef LL_LLVOCACHE_H -#define LL_LLVOCACHE_H - -#include "lluuid.h" -#include "lldatapacker.h" -#include "lldir.h" -#include "llvieweroctree.h" -#include "llapr.h" -#include "llgltfmaterial.h" - -#include <unordered_map> - -//--------------------------------------------------------------------------- -// Cache entries -class LLCamera; - -class LLGLTFOverrideCacheEntry -{ -public: - bool fromLLSD(const LLSD& data); - LLSD toLLSD() const; - - LLUUID mObjectId; - U32 mLocalId = 0; - std::unordered_map<S32, LLSD> mSides; //override LLSD per side - std::unordered_map<S32, LLPointer<LLGLTFMaterial> > mGLTFMaterial; //GLTF material per side - U64 mRegionHandle = 0; -}; - -class LLVOCacheEntry -: public LLViewerOctreeEntryData -{ - LL_ALIGN_NEW -public: - enum - { - //low 16-bit state - INACTIVE = 0x00000000, //not visible - IN_QUEUE = 0x00000001, //in visible queue, object to be created - WAITING = 0x00000002, //object creation request sent - ACTIVE = 0x00000004, //object created, and in rendering pipeline. - - //high 16-bit state - IN_VO_TREE = 0x00010000, //the entry is in the object cache tree. - - LOW_BITS = 0x0000ffff, - HIGH_BITS = 0xffff0000 - }; - - struct CompareVOCacheEntry - { - bool operator()(const LLVOCacheEntry* const& lhs, const LLVOCacheEntry* const& rhs) const - { - F32 lpa = lhs->getSceneContribution(); - F32 rpa = rhs->getSceneContribution(); - - //larger pixel area first - if(lpa > rpa) - { - return true; - } - else if(lpa < rpa) - { - return false; - } - else - { - return lhs < rhs; - } - } - }; - - struct ExtrasEntry - { - LLSD extras; - std::string extras_raw; - }; - -protected: - ~LLVOCacheEntry(); -public: - LLVOCacheEntry(U32 local_id, U32 crc, LLDataPackerBinaryBuffer &dp); - LLVOCacheEntry(LLAPRFile* apr_file); - LLVOCacheEntry(); - - void updateEntry(U32 crc, LLDataPackerBinaryBuffer &dp); - - void clearState(U32 state) {mState &= ~state;} - bool hasState(U32 state) {return mState & state;} - void setState(U32 state); - bool isState(U32 state) {return (mState & LOW_BITS) == state;} - U32 getState() const {return mState & LOW_BITS;} - - bool isAnyVisible(const LLVector4a& camera_origin, const LLVector4a& local_camera_origin, F32 dist_threshold); - - U32 getLocalID() const { return mLocalID; } - U32 getCRC() const { return mCRC; } - S32 getHitCount() const { return mHitCount; } - S32 getCRCChangeCount() const { return mCRCChangeCount; } - - void calcSceneContribution(const LLVector4a& camera_origin, bool needs_update, U32 last_update, F32 dist_threshold); - void setSceneContribution(F32 scene_contrib) {mSceneContrib = scene_contrib;} - F32 getSceneContribution() const { return mSceneContrib;} - - void dump() const; - S32 writeToBuffer(U8 *data_buffer) const; - LLDataPackerBinaryBuffer *getDP(); - void recordHit(); - void recordDupe() { mDupeCount++; } - - /*virtual*/ void setOctreeEntry(LLViewerOctreeEntry* entry); - - void setParentID(U32 id); - U32 getParentID() const {return mParentID;} - bool isChild() const {return mParentID > 0;} - - void addChild(LLVOCacheEntry* entry); - void removeChild(LLVOCacheEntry* entry); - void removeAllChildren(); - LLVOCacheEntry* getChild(); //remove the first child, and return it. - S32 getNumOfChildren() const {return mChildrenList.size();} - - void setBoundingInfo(const LLVector3& pos, const LLVector3& scale); //called from processing object update message - void updateParentBoundingInfo(); - void saveBoundingSphere(); - - void setValid(bool valid = true) {mValid = valid;} - bool isValid() const {return mValid;} - - void setUpdateFlags(U32 flags) {mUpdateFlags = flags;} - U32 getUpdateFlags() const {return mUpdateFlags;} - - static void updateDebugSettings(); - static F32 getSquaredPixelThreshold(bool is_front); - -private: - void updateParentBoundingInfo(const LLVOCacheEntry* child); - -public: - typedef std::map<U32, LLPointer<LLVOCacheEntry> > vocache_entry_map_t; - typedef std::set<LLVOCacheEntry*> vocache_entry_set_t; - typedef std::set<LLVOCacheEntry*, CompareVOCacheEntry> vocache_entry_priority_list_t; - - typedef std::unordered_map<U32, LLGLTFOverrideCacheEntry> vocache_gltf_overrides_map_t; - - S32 mLastCameraUpdated; -protected: - U32 mLocalID; - U32 mParentID; - U32 mCRC; - U32 mUpdateFlags; //receive from sim - S32 mHitCount; - S32 mDupeCount; - S32 mCRCChangeCount; - LLDataPackerBinaryBuffer mDP; - U8 *mBuffer; - - F32 mSceneContrib; //projected scene contributuion of this object. - U32 mState; //high 16 bits reserved for special use. - vocache_entry_set_t mChildrenList; //children entries in a linked set. - - bool mValid; //if set, this entry is valid, otherwise it is invalid and will be removed. - - LLVector4a mBSphereCenter; //bounding sphere center - F32 mBSphereRadius; //bounding sphere radius - -public: - static U32 sMinFrameRange; - static F32 sNearRadius; - static F32 sRearFarRadius; - static F32 sFrontPixelThreshold; - static F32 sRearPixelThreshold; -}; - -class LLVOCacheGroup : public LLOcclusionCullingGroup -{ -public: - LLVOCacheGroup(OctreeNode* node, LLViewerOctreePartition* part) : LLOcclusionCullingGroup(node, part){} - - //virtual - void handleChildAddition(const OctreeNode* parent, OctreeNode* child); - -protected: - virtual ~LLVOCacheGroup(); -}; - -class LLVOCachePartition : public LLViewerOctreePartition -{ -public: - LLVOCachePartition(LLViewerRegion* regionp); - virtual ~LLVOCachePartition(); - - bool addEntry(LLViewerOctreeEntry* entry); - void removeEntry(LLViewerOctreeEntry* entry); - /*virtual*/ S32 cull(LLCamera &camera, bool do_occlusion); - void addOccluders(LLViewerOctreeGroup* gp); - void resetOccluders(); - void processOccluders(LLCamera* camera); - void removeOccluder(LLVOCacheGroup* group); - - void setCullHistory(bool has_new_object); - - bool isFrontCull() const {return mFrontCull;} - -private: - void selectBackObjects(LLCamera &camera, F32 projection_area_cutoff, bool use_occlusion); //select objects behind camera. - -public: - static bool sNeedsOcclusionCheck; - -private: - bool mFrontCull; //the view frustum cull if set, otherwise is back sphere cull. - U32 mCullHistory; - U32 mCulledTime[LLViewerCamera::NUM_CAMERAS]; - std::set<LLVOCacheGroup*> mOccludedGroups; - - S32 mBackSlectionEnabled; //enable to select back objects if > 0. - U32 mIdleHash; -}; - -// -//Note: LLVOCache is not thread-safe -// -class LLVOCache : public LLParamSingleton<LLVOCache> -{ - LLSINGLETON(LLVOCache, bool read_only); - ~LLVOCache() ; - -private: - struct HeaderEntryInfo - { - HeaderEntryInfo() : mIndex(0), mHandle(0), mTime(0) {} - S32 mIndex; - U64 mHandle ; - U32 mTime ; - }; - - struct HeaderMetaInfo - { - HeaderMetaInfo() : mVersion(0), mAddressSize(0) {} - - U32 mVersion; - U32 mAddressSize; - }; - - struct header_entry_less - { - bool operator()(const HeaderEntryInfo* lhs, const HeaderEntryInfo* rhs) const - { - if(lhs->mTime == rhs->mTime) - { - return lhs < rhs ; - } - - return lhs->mTime < rhs->mTime ; // older entry in front of queue (set) - } - }; - typedef std::set<HeaderEntryInfo*, header_entry_less> header_entry_queue_t; - typedef std::map<U64, HeaderEntryInfo*> handle_entry_map_t; - -public: - // We need this init to be separate from constructor, since we might construct cache, purge it, then init. - void initCache(ELLPath location, U32 size, U32 cache_version); - void removeCache(ELLPath location, bool started = false) ; - - void readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::vocache_entry_map_t& cache_entry_map) ; - void readGenericExtrasFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::vocache_gltf_overrides_map_t& cache_extras_entry_map); - - void writeToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry::vocache_entry_map_t& cache_entry_map, bool dirty_cache, bool removal_enabled); - void writeGenericExtrasToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry::vocache_gltf_overrides_map_t& cache_extras_entry_map, bool dirty_cache, bool removal_enabled); - void removeEntry(U64 handle) ; - - U32 getCacheEntries() { return mNumEntries; } - U32 getCacheEntriesMax() { return mCacheSize; } - -private: - void setDirNames(ELLPath location); - // determine the cache filename for the region from the region handle - void getObjectCacheFilename(U64 handle, std::string& filename); - std::string getObjectCacheExtrasFilename(U64 handle); - void removeFromCache(HeaderEntryInfo* entry); - void readCacheHeader(); - void writeCacheHeader(); - void clearCacheInMemory(); - void removeCache() ; - void removeEntry(HeaderEntryInfo* entry) ; - void purgeEntries(U32 size); - bool updateEntry(const HeaderEntryInfo* entry); - -private: - bool mEnabled; - bool mInitialized ; - bool mReadOnly ; - HeaderMetaInfo mMetaInfo; - U32 mCacheSize; - U32 mNumEntries; - std::string mHeaderFileName ; - std::string mObjectCacheDirName; - LLVolatileAPRPool* mLocalAPRFilePoolp ; - header_entry_queue_t mHeaderEntryQueue; - handle_entry_map_t mHandleEntryMap; -}; - -#endif +/**
+ * @file llvocache.h
+ * @brief Cache of objects on the viewer.
+ *
+ * $LicenseInfo:firstyear=2003&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLVOCACHE_H
+#define LL_LLVOCACHE_H
+
+#include "lluuid.h"
+#include "lldatapacker.h"
+#include "lldir.h"
+#include "llvieweroctree.h"
+#include "llapr.h"
+#include "llgltfmaterial.h"
+
+#include <unordered_map>
+
+//---------------------------------------------------------------------------
+// Cache entries
+class LLCamera;
+
+class LLGLTFOverrideCacheEntry
+{
+public:
+ bool fromLLSD(const LLSD& data);
+ LLSD toLLSD() const;
+
+ LLUUID mObjectId;
+ U32 mLocalId = 0;
+ std::unordered_map<S32, LLSD> mSides; //override LLSD per side
+ std::unordered_map<S32, LLPointer<LLGLTFMaterial> > mGLTFMaterial; //GLTF material per side
+ U64 mRegionHandle = 0;
+};
+
+class LLVOCacheEntry
+: public LLViewerOctreeEntryData
+{
+ LL_ALIGN_NEW
+public:
+ enum
+ {
+ //low 16-bit state
+ INACTIVE = 0x00000000, //not visible
+ IN_QUEUE = 0x00000001, //in visible queue, object to be created
+ WAITING = 0x00000002, //object creation request sent
+ ACTIVE = 0x00000004, //object created, and in rendering pipeline.
+
+ //high 16-bit state
+ IN_VO_TREE = 0x00010000, //the entry is in the object cache tree.
+
+ LOW_BITS = 0x0000ffff,
+ HIGH_BITS = 0xffff0000
+ };
+
+ struct CompareVOCacheEntry
+ {
+ bool operator()(const LLVOCacheEntry* const& lhs, const LLVOCacheEntry* const& rhs) const
+ {
+ F32 lpa = lhs->getSceneContribution();
+ F32 rpa = rhs->getSceneContribution();
+
+ //larger pixel area first
+ if(lpa > rpa)
+ {
+ return true;
+ }
+ else if(lpa < rpa)
+ {
+ return false;
+ }
+ else
+ {
+ return lhs < rhs;
+ }
+ }
+ };
+
+ struct ExtrasEntry
+ {
+ LLSD extras;
+ std::string extras_raw;
+ };
+
+protected:
+ ~LLVOCacheEntry();
+public:
+ LLVOCacheEntry(U32 local_id, U32 crc, LLDataPackerBinaryBuffer &dp);
+ LLVOCacheEntry(LLAPRFile* apr_file);
+ LLVOCacheEntry();
+
+ void updateEntry(U32 crc, LLDataPackerBinaryBuffer &dp);
+
+ void clearState(U32 state) {mState &= ~state;}
+ bool hasState(U32 state) {return mState & state;}
+ void setState(U32 state);
+ bool isState(U32 state) {return (mState & LOW_BITS) == state;}
+ U32 getState() const {return mState & LOW_BITS;}
+
+ bool isAnyVisible(const LLVector4a& camera_origin, const LLVector4a& local_camera_origin, F32 dist_threshold);
+
+ U32 getLocalID() const { return mLocalID; }
+ U32 getCRC() const { return mCRC; }
+ S32 getHitCount() const { return mHitCount; }
+ S32 getCRCChangeCount() const { return mCRCChangeCount; }
+
+ void calcSceneContribution(const LLVector4a& camera_origin, bool needs_update, U32 last_update, F32 dist_threshold);
+ void setSceneContribution(F32 scene_contrib) {mSceneContrib = scene_contrib;}
+ F32 getSceneContribution() const { return mSceneContrib;}
+
+ void dump() const;
+ S32 writeToBuffer(U8 *data_buffer) const;
+ LLDataPackerBinaryBuffer *getDP();
+ void recordHit();
+ void recordDupe() { mDupeCount++; }
+
+ /*virtual*/ void setOctreeEntry(LLViewerOctreeEntry* entry);
+
+ void setParentID(U32 id);
+ U32 getParentID() const {return mParentID;}
+ bool isChild() const {return mParentID > 0;}
+
+ void addChild(LLVOCacheEntry* entry);
+ void removeChild(LLVOCacheEntry* entry);
+ void removeAllChildren();
+ LLVOCacheEntry* getChild(); //remove the first child, and return it.
+ S32 getNumOfChildren() const {return mChildrenList.size();}
+
+ void setBoundingInfo(const LLVector3& pos, const LLVector3& scale); //called from processing object update message
+ void updateParentBoundingInfo();
+ void saveBoundingSphere();
+
+ void setValid(bool valid = true) {mValid = valid;}
+ bool isValid() const {return mValid;}
+
+ void setUpdateFlags(U32 flags) {mUpdateFlags = flags;}
+ U32 getUpdateFlags() const {return mUpdateFlags;}
+
+ static void updateDebugSettings();
+ static F32 getSquaredPixelThreshold(bool is_front);
+
+private:
+ void updateParentBoundingInfo(const LLVOCacheEntry* child);
+
+public:
+ typedef std::map<U32, LLPointer<LLVOCacheEntry> > vocache_entry_map_t;
+ typedef std::set<LLVOCacheEntry*> vocache_entry_set_t;
+ typedef std::set<LLVOCacheEntry*, CompareVOCacheEntry> vocache_entry_priority_list_t;
+
+ typedef std::unordered_map<U32, LLGLTFOverrideCacheEntry> vocache_gltf_overrides_map_t;
+
+ S32 mLastCameraUpdated;
+protected:
+ U32 mLocalID;
+ U32 mParentID;
+ U32 mCRC;
+ U32 mUpdateFlags; //receive from sim
+ S32 mHitCount;
+ S32 mDupeCount;
+ S32 mCRCChangeCount;
+ LLDataPackerBinaryBuffer mDP;
+ U8 *mBuffer;
+
+ F32 mSceneContrib; //projected scene contributuion of this object.
+ U32 mState; //high 16 bits reserved for special use.
+ vocache_entry_set_t mChildrenList; //children entries in a linked set.
+
+ bool mValid; //if set, this entry is valid, otherwise it is invalid and will be removed.
+
+ LLVector4a mBSphereCenter; //bounding sphere center
+ F32 mBSphereRadius; //bounding sphere radius
+
+public:
+ static U32 sMinFrameRange;
+ static F32 sNearRadius;
+ static F32 sRearFarRadius;
+ static F32 sFrontPixelThreshold;
+ static F32 sRearPixelThreshold;
+};
+
+class LLVOCacheGroup : public LLOcclusionCullingGroup
+{
+public:
+ LLVOCacheGroup(OctreeNode* node, LLViewerOctreePartition* part) : LLOcclusionCullingGroup(node, part){}
+
+ //virtual
+ void handleChildAddition(const OctreeNode* parent, OctreeNode* child);
+
+protected:
+ virtual ~LLVOCacheGroup();
+};
+
+class LLVOCachePartition : public LLViewerOctreePartition
+{
+public:
+ LLVOCachePartition(LLViewerRegion* regionp);
+ virtual ~LLVOCachePartition();
+
+ bool addEntry(LLViewerOctreeEntry* entry);
+ void removeEntry(LLViewerOctreeEntry* entry);
+ /*virtual*/ S32 cull(LLCamera &camera, bool do_occlusion);
+ void addOccluders(LLViewerOctreeGroup* gp);
+ void resetOccluders();
+ void processOccluders(LLCamera* camera);
+ void removeOccluder(LLVOCacheGroup* group);
+
+ void setCullHistory(bool has_new_object);
+
+ bool isFrontCull() const {return mFrontCull;}
+
+private:
+ void selectBackObjects(LLCamera &camera, F32 projection_area_cutoff, bool use_occlusion); //select objects behind camera.
+
+public:
+ static bool sNeedsOcclusionCheck;
+
+private:
+ bool mFrontCull; //the view frustum cull if set, otherwise is back sphere cull.
+ U32 mCullHistory;
+ U32 mCulledTime[LLViewerCamera::NUM_CAMERAS];
+ std::set<LLVOCacheGroup*> mOccludedGroups;
+
+ S32 mBackSlectionEnabled; //enable to select back objects if > 0.
+ U32 mIdleHash;
+};
+
+//
+//Note: LLVOCache is not thread-safe
+//
+class LLVOCache : public LLParamSingleton<LLVOCache>
+{
+ LLSINGLETON(LLVOCache, bool read_only);
+ ~LLVOCache() ;
+
+private:
+ struct HeaderEntryInfo
+ {
+ HeaderEntryInfo() : mIndex(0), mHandle(0), mTime(0) {}
+ S32 mIndex;
+ U64 mHandle ;
+ U32 mTime ;
+ };
+
+ struct HeaderMetaInfo
+ {
+ HeaderMetaInfo() : mVersion(0), mAddressSize(0) {}
+
+ U32 mVersion;
+ U32 mAddressSize;
+ };
+
+ struct header_entry_less
+ {
+ bool operator()(const HeaderEntryInfo* lhs, const HeaderEntryInfo* rhs) const
+ {
+ if(lhs->mTime == rhs->mTime)
+ {
+ return lhs < rhs ;
+ }
+
+ return lhs->mTime < rhs->mTime ; // older entry in front of queue (set)
+ }
+ };
+ typedef std::set<HeaderEntryInfo*, header_entry_less> header_entry_queue_t;
+ typedef std::map<U64, HeaderEntryInfo*> handle_entry_map_t;
+
+public:
+ // We need this init to be separate from constructor, since we might construct cache, purge it, then init.
+ void initCache(ELLPath location, U32 size, U32 cache_version);
+ void removeCache(ELLPath location, bool started = false) ;
+
+ void readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::vocache_entry_map_t& cache_entry_map) ;
+ void readGenericExtrasFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::vocache_gltf_overrides_map_t& cache_extras_entry_map);
+
+ void writeToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry::vocache_entry_map_t& cache_entry_map, bool dirty_cache, bool removal_enabled);
+ void writeGenericExtrasToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry::vocache_gltf_overrides_map_t& cache_extras_entry_map, bool dirty_cache, bool removal_enabled);
+ void removeEntry(U64 handle) ;
+
+ U32 getCacheEntries() { return mNumEntries; }
+ U32 getCacheEntriesMax() { return mCacheSize; }
+
+private:
+ void setDirNames(ELLPath location);
+ // determine the cache filename for the region from the region handle
+ void getObjectCacheFilename(U64 handle, std::string& filename);
+ std::string getObjectCacheExtrasFilename(U64 handle);
+ void removeFromCache(HeaderEntryInfo* entry);
+ void readCacheHeader();
+ void writeCacheHeader();
+ void clearCacheInMemory();
+ void removeCache() ;
+ void removeEntry(HeaderEntryInfo* entry) ;
+ void purgeEntries(U32 size);
+ bool updateEntry(const HeaderEntryInfo* entry);
+
+private:
+ bool mEnabled;
+ bool mInitialized ;
+ bool mReadOnly ;
+ HeaderMetaInfo mMetaInfo;
+ U32 mCacheSize;
+ U32 mNumEntries;
+ std::string mHeaderFileName ;
+ std::string mObjectCacheDirName;
+ LLVolatileAPRPool* mLocalAPRFilePoolp ;
+ header_entry_queue_t mHeaderEntryQueue;
+ handle_entry_map_t mHandleEntryMap;
+};
+
+#endif
|