diff options
| author | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2025-01-29 23:05:35 +0200 | 
|---|---|---|
| committer | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2025-01-31 03:41:04 +0200 | 
| commit | 52fb53a4d6e0856c96044c654970dcbb1cc1f235 (patch) | |
| tree | a8f35f6c3a5ac5b2241cc086de02acd4ef24ef3f /indra/newview | |
| parent | 8456572db0d576d3a90d2c5d8a5a41ff298af435 (diff) | |
#3488 Make mesh_header_map a bit simpler
preparation for further work
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/llmeshrepository.cpp | 57 | ||||
| -rw-r--r-- | indra/newview/llmeshrepository.h | 3 | 
2 files changed, 32 insertions, 28 deletions
| diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 8381d3e2e2..204834f8de 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -1373,7 +1373,7 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id, bool can_retry)      mHeaderMutex->lock(); -    auto header_it = mMeshHeader.find(mesh_id); +    mesh_header_map::const_iterator header_it = mMeshHeader.find(mesh_id);      if (header_it == mMeshHeader.end())      { //we have no header info for this mesh, do nothing          mHeaderMutex->unlock(); @@ -1382,11 +1382,11 @@ bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id, bool can_retry)      ++LLMeshRepository::sMeshRequestCount;      bool ret = true; -    U32 header_size = header_it->second.first; +    const LLMeshHeader& header = header_it->second; +    U32 header_size = header.mHeaderSize;      if (header_size > 0)      { -        const LLMeshHeader& header = header_it->second.second;          S32 version = header.mVersion;          S32 offset = header_size + header.mSkinOffset; @@ -1506,12 +1506,12 @@ bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)      }      ++LLMeshRepository::sMeshRequestCount; -    U32 header_size = header_it->second.first; +    const auto& header = header_it->second; +    U32 header_size = header.mHeaderSize;      bool ret = true;      if (header_size > 0)      { -        const auto& header = header_it->second.second;          S32 version = header.mVersion;          S32 offset = header_size + header.mPhysicsConvexOffset;          S32 size = header.mPhysicsConvexSize; @@ -1614,12 +1614,12 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)      }      ++LLMeshRepository::sMeshRequestCount; -    U32 header_size = header_it->second.first; +    const auto& header = header_it->second; +    U32 header_size = header.mHeaderSize;      bool ret = true;      if (header_size > 0)      { -        const auto& header = header_it->second.second;          S32 version = header.mVersion;          S32 offset = header_size + header.mPhysicsMeshOffset;          S32 size = header.mPhysicsMeshSize; @@ -1764,7 +1764,7 @@ bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params, bool c          if (size > 0)          {              // *NOTE:  if the header size is ever more than 4KB, this will break -            U8 buffer[MESH_HEADER_SIZE]; +            static thread_local U8 buffer[MESH_HEADER_SIZE];              S32 bytes = llmin(size, MESH_HEADER_SIZE);              LLMeshRepository::sCacheBytesRead += bytes;              ++LLMeshRepository::sCacheReads; @@ -1834,10 +1834,10 @@ bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod,      ++LLMeshRepository::sMeshRequestCount;      bool retval = true; -    U32 header_size = header_it->second.first; +    const auto& header = header_it->second; +    U32 header_size = header.mHeaderSize;      if (header_size > 0)      { -        const auto& header = header_it->second.second;          S32 version = header.mVersion;          S32 offset = header_size + header.mLodOffset[lod];          S32 size = header.mLodSize[lod]; @@ -1988,7 +1988,8 @@ EMeshProcessingResult LLMeshRepoThread::headerReceived(const LLVolumeParams& mes          // make sure there is at least one lod, function returns -1 and marks as 404 otherwise          else if (LLMeshRepository::getActualMeshLOD(header, 0) >= 0)          { -            header_size += stream.tellg(); +            header.mHeaderSize = stream.tellg(); +            header_size += header.mHeaderSize;              skin_offset = header.mSkinOffset;              skin_size = header.mSkinSize;              memcpy(lod_offset, header.mLodOffset, sizeof(lod_offset)); @@ -2006,7 +2007,7 @@ EMeshProcessingResult LLMeshRepoThread::headerReceived(const LLVolumeParams& mes          {              LLMutexLock lock(mHeaderMutex); -            mMeshHeader[mesh_id] = { (U32)header_size, header }; +            mMeshHeader[mesh_id] = header;              LLMeshRepository::sCacheBytesHeaders += (U32)header_size;          } @@ -3163,9 +3164,11 @@ S32 LLMeshRepoThread::getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lo      if (iter != mMeshHeader.end())      { -        auto& header = iter->second.second; - -        return LLMeshRepository::getActualMeshLOD(header, lod); +        auto& header = iter->second; +        if (header.mHeaderSize > 0) +        { +            return LLMeshRepository::getActualMeshLOD(header, lod); +        }      }      return lod; @@ -3411,8 +3414,8 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b          LLMeshRepoThread::mesh_header_map::iterator iter = gMeshRepo.mThread->mMeshHeader.find(mesh_id);          if (iter != gMeshRepo.mThread->mMeshHeader.end())          { -            header_bytes = (S32)iter->second.first; -            header = iter->second.second; +            header = iter->second; +            header_bytes = header.mHeaderSize;          }          if (header_bytes > 0 @@ -4553,9 +4556,9 @@ bool LLMeshRepoThread::hasPhysicsShapeInHeader(const LLUUID& mesh_id)  {      LLMutexLock lock(mHeaderMutex);      mesh_header_map::iterator iter = mMeshHeader.find(mesh_id); -    if (iter != mMeshHeader.end() && iter->second.first > 0) +    if (iter != mMeshHeader.end() && iter->second.mHeaderSize > 0)      { -        LLMeshHeader &mesh = iter->second.second; +        LLMeshHeader &mesh = iter->second;          if (mesh.mPhysicsMeshSize > 0)          {              return true; @@ -4569,9 +4572,9 @@ bool LLMeshRepoThread::hasSkinInfoInHeader(const LLUUID& mesh_id)  {      LLMutexLock lock(mHeaderMutex);      mesh_header_map::iterator iter = mMeshHeader.find(mesh_id); -    if (iter != mMeshHeader.end() && iter->second.first > 0) +    if (iter != mMeshHeader.end() && iter->second.mHeaderSize > 0)      { -        LLMeshHeader& mesh = iter->second.second; +        LLMeshHeader& mesh = iter->second;          if (mesh.mSkinOffset >= 0              && mesh.mSkinSize > 0)          { @@ -4607,9 +4610,9 @@ S32 LLMeshRepository::getMeshSize(const LLUUID& mesh_id, S32 lod)      {          LLMutexLock lock(mThread->mHeaderMutex);          LLMeshRepoThread::mesh_header_map::iterator iter = mThread->mMeshHeader.find(mesh_id); -        if (iter != mThread->mMeshHeader.end() && iter->second.first > 0) +        if (iter != mThread->mMeshHeader.end() && iter->second.mHeaderSize > 0)          { -            const LLMeshHeader& header = iter->second.second; +            const LLMeshHeader& header = iter->second;              if (header.m404)              { @@ -4713,9 +4716,9 @@ F32 LLMeshRepository::getStreamingCostLegacy(LLUUID mesh_id, F32 radius, S32* by      {          LLMutexLock lock(mThread->mHeaderMutex);          LLMeshRepoThread::mesh_header_map::iterator iter = mThread->mMeshHeader.find(mesh_id); -        if (iter != mThread->mMeshHeader.end() && iter->second.first > 0) +        if (iter != mThread->mMeshHeader.end() && iter->second.mHeaderSize > 0)          { -            result  = getStreamingCostLegacy(iter->second.second, radius, bytes, bytes_visible, lod, unscaled_value); +            result  = getStreamingCostLegacy(iter->second, radius, bytes, bytes_visible, lod, unscaled_value);          }      }      if (result > 0.f) @@ -5027,9 +5030,9 @@ bool LLMeshRepository::getCostData(LLUUID mesh_id, LLMeshCostData& data)      {          LLMutexLock lock(mThread->mHeaderMutex);          LLMeshRepoThread::mesh_header_map::iterator iter = mThread->mMeshHeader.find(mesh_id); -        if (iter != mThread->mMeshHeader.end() && iter->second.first > 0) +        if (iter != mThread->mMeshHeader.end() && iter->second.mHeaderSize > 0)          { -            LLMeshHeader& header = iter->second.second; +            LLMeshHeader& header = iter->second;              bool header_invalid = (header.m404                                     || header.mLodSize[0] <= 0 diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h index e000d2aef9..f30e6cce12 100644 --- a/indra/newview/llmeshrepository.h +++ b/indra/newview/llmeshrepository.h @@ -320,6 +320,7 @@ public:      S32 mLodOffset[LLModel::NUM_LODS] = { -1 };      S32 mLodSize[LLModel::NUM_LODS] = { -1 }; +    S32 mHeaderSize = -1;      bool m404 = false;  }; @@ -341,7 +342,7 @@ public:      LLCondition* mSignal;      //map of known mesh headers -    typedef boost::unordered_map<LLUUID, std::pair<U32, LLMeshHeader>> mesh_header_map; // pair is header_size and data +    typedef boost::unordered_map<LLUUID, LLMeshHeader> mesh_header_map; // pair is header_size and data      mesh_header_map mMeshHeader;      class HeaderRequest : public RequestStats | 
