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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llviewertexture.h
  3.  * @brief Object for managing images and their textures
  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_LLVIEWERTEXTURE_H
  33. #define LL_LLVIEWERTEXTURE_H
  34. #include "lltexture.h"
  35. #include "lltimer.h"
  36. #include "llframetimer.h"
  37. #include "llhost.h"
  38. #include "llgltypes.h"
  39. #include "llrender.h"
  40. #include "llmetricperformancetester.h"
  41. #include <map>
  42. #include <list>
  43. #define MIN_VIDEO_RAM_IN_MEGA_BYTES    32
  44. #define MAX_VIDEO_RAM_IN_MEGA_BYTES    512 // 512MB max for performance reasons.
  45. class LLFace;
  46. class LLImageGL ;
  47. class LLImageRaw;
  48. class LLViewerObject;
  49. class LLViewerTexture;
  50. class LLViewerFetchedTexture ;
  51. class LLViewerMediaTexture ;
  52. class LLTexturePipelineTester ;
  53. typedef void (*loaded_callback_func)( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata );
  54. class LLVFile;
  55. class LLMessageSystem;
  56. class LLViewerMediaImpl ;
  57. class LLVOVolume ;
  58. class LLLoadedCallbackEntry
  59. {
  60. public:
  61. LLLoadedCallbackEntry(loaded_callback_func cb,
  62.   S32 discard_level,
  63.   BOOL need_imageraw, // Needs image raw for the callback
  64.   void* userdata );
  65. loaded_callback_func mCallback;
  66. S32 mLastUsedDiscard;
  67. S32 mDesiredDiscard;
  68. BOOL mNeedsImageRaw;
  69. void* mUserData;
  70. };
  71. class LLTextureBar;
  72. class LLViewerTexture : public LLTexture
  73. {
  74. public:
  75. enum
  76. {
  77. MAX_IMAGE_SIZE_DEFAULT = 1024,
  78. INVALID_DISCARD_LEVEL = 0x7fff
  79. };
  80. enum
  81. {
  82. LOCAL_TEXTURE,
  83. MEDIA_TEXTURE,
  84. DYNAMIC_TEXTURE,
  85. FETCHED_TEXTURE,
  86. LOD_TEXTURE,
  87. ATLAS_TEXTURE,
  88. INVALID_TEXTURE_TYPE
  89. };
  90. enum EBoostLevel
  91. {
  92. BOOST_NONE  = 0,
  93. BOOST_AVATAR_BAKED = 1,
  94. BOOST_AVATAR = 2,
  95. BOOST_CLOUDS = 3,
  96. BOOST_SCULPTED      = 4,
  97. BOOST_HIGH  = 10,
  98. BOOST_TERRAIN = 11, // has to be high priority for minimap / low detail
  99. BOOST_SELECTED = 12,
  100. BOOST_HUD = 13,
  101. BOOST_AVATAR_BAKED_SELF = 14,
  102. BOOST_ICON = 15,
  103. BOOST_UI = 16,
  104. BOOST_PREVIEW = 17,
  105. BOOST_MAP = 18,
  106. BOOST_MAP_VISIBLE = 19,
  107. BOOST_AVATAR_SELF = 20, // needed for baking avatar
  108. BOOST_MAX_LEVEL,
  109. //other texture Categories
  110. LOCAL = BOOST_MAX_LEVEL,
  111. AVATAR_SCRATCH_TEX,
  112. DYNAMIC_TEX,
  113. MEDIA,
  114. ATLAS,
  115. OTHER,
  116. MAX_GL_IMAGE_CATEGORY
  117. };
  118. static S32 getTotalNumOfCategories() ;
  119. static S32 getIndexFromCategory(S32 category) ;
  120. static S32 getCategoryFromIndex(S32 index) ;
  121. typedef std::vector<LLFace*> ll_face_list_t;
  122. typedef std::vector<LLVOVolume*> ll_volume_list_t;
  123. protected:
  124. virtual ~LLViewerTexture();
  125. LOG_CLASS(LLViewerTexture);
  126. public:
  127. static void initClass();
  128. static void cleanupClass();
  129. static void updateClass(const F32 velocity, const F32 angular_velocity) ;
  130. LLViewerTexture(BOOL usemipmaps = TRUE);
  131. LLViewerTexture(const LLUUID& id, BOOL usemipmaps) ;
  132. LLViewerTexture(const LLImageRaw* raw, BOOL usemipmaps) ;
  133. LLViewerTexture(const U32 width, const U32 height, const U8 components, BOOL usemipmaps) ;
  134. virtual S8 getType() const;
  135. virtual BOOL isMissingAsset()const ;
  136. virtual void dump(); // debug info to llinfos
  137. /*virtual*/ bool bindDefaultImage(const S32 stage = 0) ;
  138. /*virtual*/ void forceImmediateUpdate() ;
  139. const LLUUID& getID() const { return mID; }
  140. void setBoostLevel(S32 level);
  141. S32  getBoostLevel() { return mBoostLevel; }
  142. void addTextureStats(F32 virtual_size, BOOL needs_gltexture = TRUE) const;
  143. void resetTextureStats();
  144. virtual F32  getMaxVirtualSize() ;
  145. LLFrameTimer* getLastReferencedTimer() {return &mLastReferencedTimer ;}
  146. S32 getFullWidth() const { return mFullWidth; }
  147. S32 getFullHeight() const { return mFullHeight; }
  148. /*virtual*/ void setKnownDrawSize(S32 width, S32 height);
  149. virtual void addFace(LLFace* facep) ;
  150. virtual void removeFace(LLFace* facep) ; 
  151. S32 getNumFaces() const;
  152. const ll_face_list_t* getFaceList() const {return &mFaceList;}
  153. virtual void addVolume(LLVOVolume* volumep);
  154. virtual void removeVolume(LLVOVolume* volumep);
  155. S32 getNumVolumes() const;
  156. const ll_volume_list_t* getVolumeList() const { return &mVolumeList; }
  157. void generateGLTexture() ;
  158. void destroyGLTexture() ;
  159. //---------------------------------------------------------------------------------------------
  160. //functions to access LLImageGL
  161. //---------------------------------------------------------------------------------------------
  162. /*virtual*/S32        getWidth(S32 discard_level = -1) const;
  163. /*virtual*/S32        getHeight(S32 discard_level = -1) const;
  164. BOOL       hasGLTexture() const ;
  165. LLGLuint   getTexName() const ;
  166. BOOL       createGLTexture() ;
  167. BOOL       createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename = 0, BOOL to_create = TRUE, S32 category = LLViewerTexture::OTHER);
  168. void       setFilteringOption(LLTexUnit::eTextureFilterOptions option);
  169. void       setExplicitFormat(LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format = 0, BOOL swap_bytes = FALSE);
  170. void       setAddressMode(LLTexUnit::eTextureAddressMode mode);
  171. BOOL       setSubImage(const LLImageRaw* imageraw, S32 x_pos, S32 y_pos, S32 width, S32 height);
  172. BOOL       setSubImage(const U8* datap, S32 data_width, S32 data_height, S32 x_pos, S32 y_pos, S32 width, S32 height);
  173. void       setGLTextureCreated (bool initialized);
  174. void       setCategory(S32 category) ;
  175. LLTexUnit::eTextureAddressMode getAddressMode(void) const ;
  176. S32        getMaxDiscardLevel() const;
  177. S32        getDiscardLevel() const;
  178. S8    getComponents() const ;
  179. BOOL       getBoundRecently() const;
  180. S32        getTextureMemory() const ;
  181. LLGLenum   getPrimaryFormat() const;
  182. BOOL       getIsAlphaMask() const ;
  183. LLTexUnit::eTextureType getTarget(void) const ;
  184. BOOL       getMask(const LLVector2 &tc);
  185. F32        getTimePassedSinceLastBound();
  186. BOOL       getMissed() const ;
  187. BOOL       isJustBound()const ;
  188. void       forceUpdateBindStats(void) const;
  189. U32        getTexelsInAtlas() const ;
  190. U32        getTexelsInGLTexture() const ;
  191. BOOL       isGLTextureCreated() const ;
  192. S32        getDiscardLevelInAtlas() const ;
  193. //---------------------------------------------------------------------------------------------
  194. //end of functions to access LLImageGL
  195. //---------------------------------------------------------------------------------------------
  196. //-----------------
  197. /*virtual*/ void setActive() ;
  198. void forceActive() ;
  199. void setNoDelete() ;
  200. void dontDiscard() { mDontDiscard = 1; mTextureState = NO_DELETE; }
  201. BOOL getDontDiscard() const { return mDontDiscard; }
  202. //-----------------
  203. BOOL isLargeImage() ;
  204. void setParcelMedia(LLViewerMediaTexture* media) {mParcelMedia = media;}
  205. BOOL hasParcelMedia() const { return mParcelMedia != NULL;}
  206. LLViewerMediaTexture* getParcelMedia() const { return mParcelMedia;}
  207. /*virtual*/ void updateBindStatsForTester() ;
  208. protected:
  209. void cleanup() ;
  210. void init(bool firstinit) ;
  211. void reorganizeFaceList() ;
  212. void reorganizeVolumeList() ;
  213. private:
  214. //note: do not make this function public.
  215. /*virtual*/ LLImageGL* getGLTexture() const ;
  216. virtual void switchToCachedImage();
  217. protected:
  218. LLUUID mID;
  219. S32 mBoostLevel; // enum describing priority level
  220. S32 mFullWidth;
  221. S32 mFullHeight;
  222. BOOL  mUseMipMaps ;
  223. S8  mComponents;
  224. mutable F32 mMaxVirtualSize; // The largest virtual size of the image, in pixels - how much data to we need?
  225. mutable S8  mNeedsGLTexture;
  226. mutable BOOL mNeedsResetMaxVirtualSize ;
  227. mutable F32 mAdditionalDecodePriority;  // priority add to mDecodePriority.
  228. LLFrameTimer mLastReferencedTimer;
  229. //GL texture
  230. LLPointer<LLImageGL> mGLTexturep ;
  231. S8 mDontDiscard; // Keep full res version of this image (for UI, etc)
  232. ll_face_list_t    mFaceList ; //reverse pointer pointing to the faces using this image as texture
  233. U32               mNumFaces ;
  234. LLFrameTimer      mLastFaceListUpdateTimer ;
  235. ll_volume_list_t  mVolumeList;
  236. U32 mNumVolumes;
  237. LLFrameTimer   mLastVolumeListUpdateTimer;
  238. //do not use LLPointer here.
  239. LLViewerMediaTexture* mParcelMedia ;
  240. protected:
  241. typedef enum 
  242. {
  243. DELETED = 0,         //removed from memory
  244. DELETION_CANDIDATE,  //ready to be removed from memory
  245. INACTIVE,            //not be used for the last certain period (i.e., 30 seconds).
  246. ACTIVE,              //just being used, can become inactive if not being used for a certain time (10 seconds).
  247. NO_DELETE = 99       //stay in memory, can not be removed.
  248. } LLGLTexureState;
  249. LLGLTexureState  mTextureState ;
  250. public:
  251. static const U32 sCurrentFileVersion;
  252. static S32 sImageCount;
  253. static S32 sRawCount;
  254. static S32 sAuxCount;
  255. static LLTimer sEvaluationTimer;
  256. static F32 sDesiredDiscardBias;
  257. static F32 sDesiredDiscardScale;
  258. static S32 sBoundTextureMemoryInBytes;
  259. static S32 sTotalTextureMemoryInBytes;
  260. static S32 sMaxBoundTextureMemInMegaBytes;
  261. static S32 sMaxTotalTextureMemInMegaBytes;
  262. static S32 sMaxDesiredTextureMemInBytes ;
  263. static S8  sCameraMovingDiscardBias;
  264. static S32 sMaxSculptRez ;
  265. static S32 sMinLargeImageSize ;
  266. static S32 sMaxSmallImageSize ;
  267. static BOOL sFreezeImageScalingDown ;//do not scale down image res if set.
  268. static F32  sCurrentTime ;
  269. static BOOL sUseTextureAtlas ;
  270. static LLPointer<LLViewerTexture> sNullImagep; // Null texture for non-textured objects.
  271. };
  272. //
  273. //textures are managed in gTextureList.
  274. //raw image data is fetched from remote or local cache
  275. //but the raw image this texture pointing to is fixed.
  276. //
  277. class LLViewerFetchedTexture : public LLViewerTexture
  278. {
  279. friend class LLTextureBar; // debug info only
  280. friend class LLTextureView; // debug info only
  281. protected:
  282. /*virtual*/ ~LLViewerFetchedTexture();
  283. public:
  284. LLViewerFetchedTexture(const LLUUID& id, const LLHost& host = LLHost::invalid, BOOL usemipmaps = TRUE);
  285. LLViewerFetchedTexture(const LLImageRaw* raw, BOOL usemipmaps);
  286. LLViewerFetchedTexture(const std::string& url, const LLUUID& id, BOOL usemipmaps = TRUE);
  287. public:
  288. static F32 maxDecodePriority();
  289. struct Compare
  290. {
  291. // lhs < rhs
  292. bool operator()(const LLPointer<LLViewerFetchedTexture> &lhs, const LLPointer<LLViewerFetchedTexture> &rhs) const
  293. {
  294. const LLViewerFetchedTexture* lhsp = (const LLViewerFetchedTexture*)lhs;
  295. const LLViewerFetchedTexture* rhsp = (const LLViewerFetchedTexture*)rhs;
  296. // greater priority is "less"
  297. const F32 lpriority = lhsp->getDecodePriority();
  298. const F32 rpriority = rhsp->getDecodePriority();
  299. if (lpriority > rpriority) // higher priority
  300. return true;
  301. if (lpriority < rpriority)
  302. return false;
  303. return lhsp < rhsp;
  304. }
  305. };
  306. public:
  307. /*virtual*/ S8 getType() const ;
  308. /*virtual*/ void forceImmediateUpdate() ;
  309. /*virtual*/ void dump() ;
  310. // Set callbacks to get called when the image gets updated with higher 
  311. // resolution versions.
  312. void setLoadedCallback(loaded_callback_func cb,
  313.    S32 discard_level, BOOL keep_imageraw, BOOL needs_aux,
  314.    void* userdata);
  315. bool hasCallbacks() { return mLoadedCallbackList.empty() ? false : true; }
  316. bool doLoadedCallbacks();
  317. void addToCreateTexture();
  318.  // ONLY call from LLViewerTextureList
  319. BOOL createTexture(S32 usename = 0);
  320. void destroyTexture() ;
  321. virtual void processTextureStats() ;
  322. F32  calcDecodePriority() ;
  323. BOOL needsAux() const { return mNeedsAux; }
  324. // Host we think might have this image, used for baked av textures.
  325. void setTargetHost(LLHost host) { mTargetHost = host; }
  326. LLHost getTargetHost() const { return mTargetHost; }
  327. // Set the decode priority for this image...
  328. // DON'T CALL THIS UNLESS YOU KNOW WHAT YOU'RE DOING, it can mess up
  329. // the priority list, and cause horrible things to happen.
  330. void setDecodePriority(F32 priority = -1.0f);
  331. F32 getDecodePriority() const { return mDecodePriority; };
  332. void setAdditionalDecodePriority(F32 priority) ;
  333. void updateVirtualSize() ;
  334. S32  getDesiredDiscardLevel()  { return mDesiredDiscardLevel; }
  335. void setMinDiscardLevel(S32 discard)  { mMinDesiredDiscardLevel = llmin(mMinDesiredDiscardLevel,(S8)discard); }
  336. bool updateFetch();
  337. // Override the computation of discard levels if we know the exact output
  338. // size of the image.  Used for UI textures to not decode, even if we have
  339. // more data.
  340. /*virtual*/ void setKnownDrawSize(S32 width, S32 height);
  341. void setIsMissingAsset();
  342. /*virtual*/ BOOL isMissingAsset() const { return mIsMissingAsset; }
  343. // returns dimensions of original image for local files (before power of two scaling)
  344. // and returns 0 for all asset system images
  345. S32 getOriginalWidth() { return mOrigWidth; }
  346. S32 getOriginalHeight() { return mOrigHeight; }
  347. BOOL isInImageList() const {return mInImageList ;}
  348. void setInImageList(BOOL flag) {mInImageList = flag ;}
  349. LLFrameTimer* getLastPacketTimer() {return &mLastPacketTimer;}
  350. U32 getFetchPriority() const { return mFetchPriority ;}
  351. F32 getDownloadProgress() const {return mDownloadProgress ;}
  352. LLImageRaw* reloadRawImage(S8 discard_level) ;
  353. void destroyRawImage();
  354. const std::string& getUrl() const {return mUrl;}
  355. //---------------
  356. BOOL isDeleted() ;
  357. BOOL isInactive() ;
  358. BOOL isDeletionCandidate();
  359. void setDeletionCandidate() ;
  360. void setInactive() ;
  361. BOOL getUseDiscard() const { return mUseMipMaps && !mDontDiscard; }
  362. //---------------
  363. void setForSculpt();
  364. BOOL forSculpt() const {return mForSculpt;}
  365. BOOL isForSculptOnly() const;
  366. //raw image management
  367. void        checkCachedRawSculptImage() ;
  368. LLImageRaw* getRawImage()const { return mRawImage ;}
  369. S32         getRawImageLevel() const {return mRawDiscardLevel;}
  370. LLImageRaw* getCachedRawImage() const { return mCachedRawImage ;}
  371. S32         getCachedRawImageLevel() const {return mCachedRawDiscardLevel;}
  372. BOOL        isCachedRawImageReady() const {return mCachedRawImageReady ;}
  373. BOOL        isRawImageValid()const { return mIsRawImageValid ; }
  374. void        forceToSaveRawImage(S32 desired_discard = 0) ;
  375. void        destroySavedRawImage() ;
  376. LLImageRaw* getSavedRawImage() ;
  377. BOOL        hasSavedRawImage() const ;
  378. F32         getElapsedLastReferencedSavedRawImageTime() const ;
  379. BOOL isFullyLoaded() const;
  380. protected:
  381. /*virtual*/ void switchToCachedImage();
  382. private:
  383. void init(bool firstinit) ;
  384. void cleanup() ;
  385. void saveRawImage() ;
  386. BOOL forceFetch() ;
  387. void setCachedRawImage() ;
  388. BOOL keepReuestedDiscardLevel();
  389. //for atlas
  390. void resetFaceAtlas() ;
  391. void invalidateAtlas(BOOL rebuild_geom) ;
  392. BOOL insertToAtlas() ;
  393. private:
  394. BOOL  mFullyLoaded;
  395. protected:
  396. std::string mLocalFileName;
  397. S32 mOrigWidth;
  398. S32 mOrigHeight;
  399. // Override the computation of discard levels if we know the exact output size of the image.
  400. // Used for UI textures to not decode, even if we have more data.
  401. S32 mKnownDrawWidth;
  402. S32 mKnownDrawHeight;
  403. BOOL mKnownDrawSizeChanged ;
  404. std::string mUrl;
  405. S32 mRequestedDiscardLevel;
  406. F32 mRequestedDownloadPriority;
  407. S32 mFetchState;
  408. U32 mFetchPriority;
  409. F32 mDownloadProgress;
  410. F32 mFetchDeltaTime;
  411. F32 mRequestDeltaTime;
  412. F32 mDecodePriority; // The priority for decoding this image.
  413. S32 mMinDiscardLevel;
  414. S8  mDesiredDiscardLevel; // The discard level we'd LIKE to have - if we have it and there's space
  415. S8  mMinDesiredDiscardLevel; // The minimum discard level we'd like to have
  416. S8  mNeedsAux; // We need to decode the auxiliary channels
  417. S8  mDecodingAux; // Are we decoding high components
  418. S8  mIsRawImageValid;
  419. S8  mHasFetcher; // We've made a fecth request
  420. S8  mIsFetching; // Fetch request is active
  421. mutable S8 mIsMissingAsset; // True if we know that there is no image asset with this image id in the database.
  422. typedef std::list<LLLoadedCallbackEntry*> callback_list_t;
  423. S8              mLoadedCallbackDesiredDiscardLevel;
  424. callback_list_t mLoadedCallbackList;
  425. LLPointer<LLImageRaw> mRawImage;
  426. S32 mRawDiscardLevel;
  427. // Used ONLY for cloth meshes right now.  Make SURE you know what you're 
  428. // doing if you use it for anything else! - djs
  429. LLPointer<LLImageRaw> mAuxRawImage;
  430. //keep a copy of mRawImage for some special purposes
  431. //when mForceToSaveRawImage is set.
  432. BOOL mForceToSaveRawImage ;
  433. LLPointer<LLImageRaw> mSavedRawImage;
  434. S32 mSavedRawDiscardLevel;
  435. S32 mDesiredSavedRawDiscardLevel;
  436. F32 mLastReferencedSavedRawImageTime ;
  437. //a small version of the copy of the raw image (<= 64 * 64)
  438. LLPointer<LLImageRaw> mCachedRawImage;
  439. S32 mCachedRawDiscardLevel;
  440. BOOL mCachedRawImageReady; //the rez of the mCachedRawImage reaches the upper limit.
  441. LLHost mTargetHost; // if LLHost::invalid, just request from agent's simulator
  442. // Timers
  443. LLFrameTimer mLastPacketTimer; // Time since last packet.
  444. BOOL  mInImageList; // TRUE if image is in list (in which case don't reset priority!)
  445. BOOL  mNeedsCreateTexture;
  446. BOOL   mForSculpt ; //a flag if the texture is used as sculpt data.
  447. BOOL   mIsFetched ; //is loaded from remote or from cache, not generated locally.
  448. public:
  449. static LLPointer<LLViewerFetchedTexture> sMissingAssetImagep; // Texture to show for an image asset that is not in the database
  450. static LLPointer<LLViewerFetchedTexture> sWhiteImagep; // Texture to show NOTHING (whiteness)
  451. static LLPointer<LLViewerFetchedTexture> sDefaultImagep; // "Default" texture for error cases, the only case of fetched texture which is generated in local.
  452. static LLPointer<LLViewerFetchedTexture> sSmokeImagep; // Old "Default" translucent texture
  453. };
  454. //
  455. //the image data is fetched from remote or from local cache
  456. //the resolution of the texture is adjustable: depends on the view-dependent parameters.
  457. //
  458. class LLViewerLODTexture : public LLViewerFetchedTexture
  459. {
  460. protected:
  461. /*virtual*/ ~LLViewerLODTexture(){}
  462. public:
  463. LLViewerLODTexture(const LLUUID& id, const LLHost& host = LLHost::invalid, BOOL usemipmaps = TRUE);
  464. LLViewerLODTexture(const std::string& url, const LLUUID& id, BOOL usemipmaps = TRUE);
  465. /*virtual*/ S8 getType() const;
  466. // Process image stats to determine priority/quality requirements.
  467. /*virtual*/ void processTextureStats();
  468. BOOL isUpdateFrozen() ;
  469. private:
  470. void init(bool firstinit) ;
  471. void scaleDown() ;
  472. private:
  473. F32 mTexelsPerImage; // Texels per image.
  474. F32 mDiscardVirtualSize; // Virtual size used to calculate desired discard
  475. F32 mCalculatedDiscardLevel;    // Last calculated discard level
  476. };
  477. //
  478. //the image data is fetched from the media pipeline periodically
  479. //the resolution of the texture is also adjusted by the media pipeline
  480. //
  481. class LLViewerMediaTexture : public LLViewerTexture
  482. {
  483. protected:
  484. /*virtual*/ ~LLViewerMediaTexture() ;
  485. public:
  486. LLViewerMediaTexture(const LLUUID& id, BOOL usemipmaps = TRUE, LLImageGL* gl_image = NULL) ;
  487. /*virtual*/ S8 getType() const;
  488. void reinit(BOOL usemipmaps = TRUE);
  489. BOOL  getUseMipMaps() {return mUseMipMaps ; }
  490. void  setUseMipMaps(BOOL mipmap) ;
  491. void setPlaying(BOOL playing) ;
  492. BOOL isPlaying() const {return mIsPlaying;}
  493. void setMediaImpl() ;
  494. void initVirtualSize() ;
  495. void invalidateMediaImpl() ;
  496. void addMediaToFace(LLFace* facep) ;
  497. void removeMediaFromFace(LLFace* facep) ;
  498. /*virtual*/ void addFace(LLFace* facep) ;
  499. /*virtual*/ void removeFace(LLFace* facep) ; 
  500. /*virtual*/ F32  getMaxVirtualSize() ;
  501. private:
  502. void switchTexture(LLFace* facep) ;
  503. BOOL findFaces() ;
  504. void stopPlaying() ;
  505. private:
  506. //
  507. //an instant list, recording all faces referencing or can reference to this media texture.
  508. //NOTE: it is NOT thread safe. 
  509. //
  510. std::list< LLFace* > mMediaFaceList ; 
  511. //an instant list keeping all textures which are replaced by the current media texture,
  512. //is only used to avoid the removal of those textures from memory.
  513. std::list< LLPointer<LLViewerTexture> > mTextureList ;
  514. LLViewerMediaImpl* mMediaImplp ;
  515. BOOL mIsPlaying ;
  516. U32  mUpdateVirtualSizeTime ;
  517. public:
  518. static void updateClass() ;
  519. static void cleanup() ;
  520. static LLViewerMediaTexture* findMediaTexture(const LLUUID& media_id) ;
  521. static void removeMediaImplFromTexture(const LLUUID& media_id) ;
  522. private:
  523. typedef std::map< LLUUID, LLPointer<LLViewerMediaTexture> > media_map_t ;
  524. static media_map_t sMediaMap ;
  525. };
  526. //just an interface class, do not create instance from this class.
  527. class LLViewerTextureManager
  528. {
  529. private:
  530. //make the constructor private to preclude creating instances from this class.
  531. LLViewerTextureManager(){}
  532. public:
  533.     //texture pipeline tester
  534. static LLTexturePipelineTester* sTesterp ;
  535. //returns NULL if tex is not a LLViewerFetchedTexture nor derived from LLViewerFetchedTexture.
  536. static LLViewerFetchedTexture*    staticCastToFetchedTexture(LLTexture* tex, BOOL report_error = FALSE) ;
  537. //
  538. //"find-texture" just check if the texture exists, if yes, return it, otherwise return null.
  539. //
  540. static LLViewerTexture*           findTexture(const LLUUID& id) ;
  541. static LLViewerMediaTexture*      findMediaTexture(const LLUUID& id) ;
  542. static LLViewerMediaTexture*      createMediaTexture(const LLUUID& id, BOOL usemipmaps = TRUE, LLImageGL* gl_image = NULL) ;
  543. //
  544. //"get-texture" will create a new texture if the texture does not exist.
  545. //
  546. static LLViewerMediaTexture*      getMediaTexture(const LLUUID& id, BOOL usemipmaps = TRUE, LLImageGL* gl_image = NULL) ;
  547. static LLPointer<LLViewerTexture> getLocalTexture(BOOL usemipmaps = TRUE, BOOL generate_gl_tex = TRUE);
  548. static LLPointer<LLViewerTexture> getLocalTexture(const LLUUID& id, BOOL usemipmaps, BOOL generate_gl_tex = TRUE) ;
  549. static LLPointer<LLViewerTexture> getLocalTexture(const LLImageRaw* raw, BOOL usemipmaps) ;
  550. static LLPointer<LLViewerTexture> getLocalTexture(const U32 width, const U32 height, const U8 components, BOOL usemipmaps, BOOL generate_gl_tex = TRUE) ;
  551. static LLViewerFetchedTexture* getFetchedTexture(const LLUUID &image_id,  
  552.  BOOL usemipmap = TRUE,
  553.  LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation.
  554.  S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
  555.  LLGLint internal_format = 0,
  556.  LLGLenum primary_format = 0,
  557.  LLHost request_from_host = LLHost()
  558.  );
  559. static LLViewerFetchedTexture* getFetchedTextureFromFile(const std::string& filename,  
  560.  BOOL usemipmap = TRUE,
  561.  LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,
  562.  S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
  563.  LLGLint internal_format = 0,
  564.  LLGLenum primary_format = 0,
  565.  const LLUUID& force_id = LLUUID::null
  566.  );
  567. static LLViewerFetchedTexture* getFetchedTextureFromUrl(const std::string& url,  
  568.  BOOL usemipmap = TRUE,
  569.  LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,
  570.  S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
  571.  LLGLint internal_format = 0,
  572.  LLGLenum primary_format = 0,
  573.  const LLUUID& force_id = LLUUID::null
  574.  );
  575. static LLViewerFetchedTexture* getFetchedTextureFromHost(const LLUUID& image_id, LLHost host) ;
  576. static void init() ;
  577. static void cleanup() ;
  578. };
  579. //
  580. //this class is used for test/debug only
  581. //it tracks the activities of the texture pipeline
  582. //records them, and outputs them to log files
  583. //
  584. class LLTexturePipelineTester : public LLMetricPerformanceTester
  585. {
  586. enum
  587. {
  588. MIN_LARGE_IMAGE_AREA = 262144  //512 * 512
  589. };
  590. public:
  591. LLTexturePipelineTester() ;
  592. ~LLTexturePipelineTester() ;
  593. void update();
  594. void updateTextureBindingStats(const LLViewerTexture* imagep) ;
  595. void updateTextureLoadingStats(const LLViewerFetchedTexture* imagep, const LLImageRaw* raw_imagep, BOOL from_cache) ;
  596. void updateGrayTextureBinding() ;
  597. void setStablizingTime() ;
  598. /*virtual*/ void analyzePerformance(std::ofstream* os, LLSD* base, LLSD* current) ;
  599. private:
  600. void reset() ;
  601. void updateStablizingTime() ;
  602. /*virtual*/ void outputTestRecord(LLSD* sd) ;
  603. private:
  604. BOOL mPause ;
  605. private:
  606. BOOL mUsingDefaultTexture;            //if set, some textures are still gray.
  607. U32 mTotalBytesUsed ;                     //total bytes of textures bound/used for the current frame.
  608. U32 mTotalBytesUsedForLargeImage ;        //total bytes of textures bound/used for the current frame for images larger than 256 * 256.
  609. U32 mLastTotalBytesUsed ;                 //total bytes of textures bound/used for the previous frame.
  610. U32 mLastTotalBytesUsedForLargeImage ;    //total bytes of textures bound/used for the previous frame for images larger than 256 * 256.
  611. //
  612. //data size
  613. //
  614. U32 mTotalBytesLoaded ;               //total bytes fetched by texture pipeline
  615. U32 mTotalBytesLoadedFromCache ;      //total bytes fetched by texture pipeline from local cache
  616. U32 mTotalBytesLoadedForLargeImage ;  //total bytes fetched by texture pipeline for images larger than 256 * 256. 
  617. U32 mTotalBytesLoadedForSculpties ;   //total bytes fetched by texture pipeline for sculpties
  618. //
  619. //time
  620. //NOTE: the error tolerances of the following timers is one frame time.
  621. //
  622. F32 mStartFetchingTime ;
  623. F32 mTotalGrayTime ;                  //total loading time when no gray textures.
  624. F32 mTotalStablizingTime ;            //total stablizing time when texture memory overflows
  625. F32 mStartTimeLoadingSculpties ;      //the start moment of loading sculpty images.
  626. F32 mEndTimeLoadingSculpties ;        //the end moment of loading sculpty images.
  627. F32 mStartStablizingTime ;
  628. F32 mEndStablizingTime ;
  629. private:
  630. //
  631. //The following members are used for performance analyzing
  632. //
  633. class LLTextureTestSession : public LLTestSession
  634. {
  635. public:
  636. LLTextureTestSession() ;
  637. /*virtual*/ ~LLTextureTestSession() ;
  638. void reset() ;
  639. F32 mTotalFetchingTime ;
  640. F32 mTotalGrayTime ;
  641. F32 mTotalStablizingTime ;
  642. F32 mStartTimeLoadingSculpties ; 
  643. F32 mTotalTimeLoadingSculpties ;
  644. S32 mTotalBytesLoaded ; 
  645. S32 mTotalBytesLoadedFromCache ;
  646. S32 mTotalBytesLoadedForLargeImage ;
  647. S32 mTotalBytesLoadedForSculpties ; 
  648. typedef struct _texture_instant_preformance_t
  649. {
  650. S32 mAverageBytesUsedPerSecond ;         
  651. S32 mAverageBytesUsedForLargeImagePerSecond ;
  652. F32 mAveragePercentageBytesUsedPerSecond ;
  653. F32 mTime ;
  654. }texture_instant_preformance_t ;
  655. std::vector<texture_instant_preformance_t> mInstantPerformanceList ;
  656. S32 mInstantPerformanceListCounter ;
  657. };
  658. /*virtual*/ LLMetricPerformanceTester::LLTestSession* loadTestSession(LLSD* log) ;
  659. /*virtual*/ void compareTestSessions(std::ofstream* os) ;
  660. };
  661. #endif