lltexturecache.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:7k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lltexturecache.h
  3.  * @brief Object for managing texture cachees.
  4.  *
  5.  * $LicenseInfo:firstyear=2000&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2000-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #ifndef LL_LLTEXTURECACHE_
  33. #define LL_LLTEXTURECACHE_H
  34. #include "lldir.h"
  35. #include "llstl.h"
  36. #include "llstring.h"
  37. #include "lluuid.h"
  38. #include "llworkerthread.h"
  39. class LLImageFormatted;
  40. class LLTextureCacheWorker;
  41. class LLTextureCache : public LLWorkerThread
  42. {
  43. friend class LLTextureCacheWorker;
  44. friend class LLTextureCacheRemoteWorker;
  45. friend class LLTextureCacheLocalFileWorker;
  46. private:
  47. // Entries
  48. struct EntriesInfo
  49. {
  50. EntriesInfo() : mVersion(0.f), mEntries(0) {}
  51. F32 mVersion;
  52. U32 mEntries;
  53. };
  54. struct Entry
  55. {
  56.          Entry() :
  57.         mBodySize(0),
  58. mImageSize(0),
  59. mTime(0)
  60. {
  61. }
  62. Entry(const LLUUID& id, S32 imagesize, S32 bodysize, U32 time) :
  63. mID(id), mImageSize(imagesize), mBodySize(bodysize), mTime(time) {}
  64. void init(const LLUUID& id, U32 time) { mID = id, mImageSize = 0; mBodySize = 0; mTime = time; }
  65. LLUUID mID; // 16 bytes
  66. S32 mImageSize; // total size of image if known
  67. S32 mBodySize; // size of body file in body cache
  68. U32 mTime; // seconds since 1/1/1970
  69. };
  70. public:
  71. class Responder : public LLResponder
  72. {
  73. public:
  74. virtual void setData(U8* data, S32 datasize, S32 imagesize, S32 imageformat, BOOL imagelocal) = 0;
  75. };
  76. class ReadResponder : public Responder
  77. {
  78. public:
  79. ReadResponder();
  80. void setData(U8* data, S32 datasize, S32 imagesize, S32 imageformat, BOOL imagelocal);
  81. void setImage(LLImageFormatted* image) { mFormattedImage = image; }
  82. protected:
  83. LLPointer<LLImageFormatted> mFormattedImage;
  84. S32 mImageSize;
  85. BOOL mImageLocal;
  86. };
  87. class WriteResponder : public Responder
  88. {
  89. void setData(U8* data, S32 datasize, S32 imagesize, S32 imageformat, BOOL imagelocal)
  90. {
  91. // not used
  92. }
  93. };
  94. LLTextureCache(bool threaded);
  95. ~LLTextureCache();
  96. /*virtual*/ S32 update(U32 max_time_ms);
  97. void purgeCache(ELLPath location);
  98. S64 initCache(ELLPath location, S64 maxsize, BOOL read_only);
  99. handle_t readFromCache(const std::string& local_filename, const LLUUID& id, U32 priority, S32 offset, S32 size,
  100.    ReadResponder* responder);
  101. handle_t readFromCache(const LLUUID& id, U32 priority, S32 offset, S32 size,
  102.    ReadResponder* responder);
  103. bool readComplete(handle_t handle, bool abort);
  104. handle_t writeToCache(const LLUUID& id, U32 priority, U8* data, S32 datasize, S32 imagesize,
  105.   WriteResponder* responder);
  106. bool writeComplete(handle_t handle, bool abort = false);
  107. void prioritizeWrite(handle_t handle);
  108. void removeFromCache(const LLUUID& id);
  109. // For LLTextureCacheWorker::Responder
  110. LLTextureCacheWorker* getReader(handle_t handle);
  111. LLTextureCacheWorker* getWriter(handle_t handle);
  112. void lockWorkers() { mWorkersMutex.lock(); }
  113. void unlockWorkers() { mWorkersMutex.unlock(); }
  114. // debug
  115. S32 getNumReads() { return mReaders.size(); }
  116. S32 getNumWrites() { return mWriters.size(); }
  117. S64 getUsage() { return mTexturesSizeTotal; }
  118. S64 getMaxUsage() { return sCacheMaxTexturesSize; }
  119. U32 getEntries() { return mHeaderEntriesInfo.mEntries; }
  120. U32 getMaxEntries() { return sCacheMaxEntries; };
  121. BOOL isInCache(const LLUUID& id) ;
  122. BOOL isInLocal(const LLUUID& id) ;
  123. protected:
  124. // Accessed by LLTextureCacheWorker
  125. bool updateTextureEntryList(const LLUUID& id, S32 size);
  126. std::string getLocalFileName(const LLUUID& id);
  127. std::string getTextureFileName(const LLUUID& id);
  128. void addCompleted(Responder* responder, bool success);
  129. protected:
  130. //void setFileAPRPool(apr_pool_t* pool) { mFileAPRPool = pool ; }
  131. private:
  132. void setDirNames(ELLPath location);
  133. void readHeaderCache();
  134. void purgeAllTextures(bool purge_directories);
  135. void purgeTextures(bool validate);
  136. LLAPRFile* openHeaderEntriesFile(bool readonly, S32 offset);
  137. void closeHeaderEntriesFile();
  138. void readEntriesHeader();
  139. void writeEntriesHeader();
  140. S32 openAndReadEntry(const LLUUID& id, Entry& entry, bool create);
  141. void writeEntryAndClose(S32 idx, Entry& entry);
  142. U32 openAndReadEntries(std::vector<Entry>& entries);
  143. void writeEntriesAndClose(const std::vector<Entry>& entries);
  144. S32 getHeaderCacheEntry(const LLUUID& id, S32& imagesize);
  145. S32 setHeaderCacheEntry(const LLUUID& id, S32 imagesize);
  146. bool removeHeaderCacheEntry(const LLUUID& id);
  147. void lockHeaders() { mHeaderMutex.lock(); }
  148. void unlockHeaders() { mHeaderMutex.unlock(); }
  149. private:
  150. // Internal
  151. LLMutex mWorkersMutex;
  152. LLMutex mHeaderMutex;
  153. LLMutex mListMutex;
  154. LLAPRFile* mHeaderAPRFile;
  155. typedef std::map<handle_t, LLTextureCacheWorker*> handle_map_t;
  156. handle_map_t mReaders;
  157. handle_map_t mWriters;
  158. typedef std::vector<handle_t> handle_list_t;
  159. handle_list_t mPrioritizeWriteList;
  160. typedef std::vector<std::pair<LLPointer<Responder>, bool> > responder_list_t;
  161. responder_list_t mCompletedList;
  162. BOOL mReadOnly;
  163. // HEADERS (Include first mip)
  164. std::string mHeaderEntriesFileName;
  165. std::string mHeaderDataFileName;
  166. EntriesInfo mHeaderEntriesInfo;
  167. std::set<S32> mFreeList; // deleted entries
  168. std::set<LLUUID> mLRU;
  169. typedef std::map<LLUUID,S32> id_map_t;
  170. id_map_t mHeaderIDMap;
  171. // BODIES (TEXTURES minus headers)
  172. std::string mTexturesDirName;
  173. typedef std::map<LLUUID,S32> size_map_t;
  174. size_map_t mTexturesSizeMap;
  175. S64 mTexturesSizeTotal;
  176. LLAtomic32<BOOL> mDoPurge;
  177. // Statics
  178. static F32 sHeaderCacheVersion;
  179. static U32 sCacheMaxEntries;
  180. static S64 sCacheMaxTexturesSize;
  181. };
  182. extern const S32 TEXTURE_CACHE_ENTRY_SIZE;
  183. #endif // LL_LLTEXTURECACHE_H