diff options
author | Xiaohong Bao <bao@lindenlab.com> | 2013-10-02 17:55:37 -0600 |
---|---|---|
committer | Xiaohong Bao <bao@lindenlab.com> | 2013-10-02 17:55:37 -0600 |
commit | da8ac532072d5f054d30e46021b429fa72c3ab66 (patch) | |
tree | 0bdb96d35a16318be3055daea4b0c8c5c25a5cf4 /indra | |
parent | 50c8c0fc7869f3babdfd1bb6c8dd72eefdba812d (diff) |
more for SH-4521: Interesting viewer crash in Pipeline:RenderDrawPools
Diffstat (limited to 'indra')
-rwxr-xr-x | indra/newview/llvocache.cpp | 49 | ||||
-rwxr-xr-x | indra/newview/llvocache.h | 17 |
2 files changed, 56 insertions, 10 deletions
diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp index 7ba0c31ffc..5a2f477f19 100755 --- a/indra/newview/llvocache.cpp +++ b/indra/newview/llvocache.cpp @@ -470,6 +470,31 @@ void LLVOCacheEntry::updateParentBoundingInfo(const LLVOCacheEntry* child) //------------------------------------------------------------------- //LLVOCachePartition //------------------------------------------------------------------- +LLVOCacheGroup::~LLVOCacheGroup() +{ + if(mOcclusionState[0] & ACTIVE_OCCLUSION) + { + ((LLVOCachePartition*)mSpatialPartition)->removeOccluder(this); + } +} + +//virtual +void LLVOCacheGroup::handleChildAddition(const OctreeNode* parent, OctreeNode* child) +{ + if (child->getListenerCount() == 0) + { + new LLVOCacheGroup(child, mSpatialPartition); + } + else + { + OCT_ERRS << "LLVOCacheGroup redundancy detected." << LL_ENDL; + } + + unbound(); + + ((LLviewerOctreeGroup*)child->getListener(0))->unbound(); +} + LLVOCachePartition::LLVOCachePartition(LLViewerRegion* regionp) { mLODPeriod = 16; @@ -483,7 +508,7 @@ LLVOCachePartition::LLVOCachePartition(LLViewerRegion* regionp) mCulledTime[i] = 0; mCullHistory[i] = -1; } - new LLOcclusionCullingGroup(mOctree, this); + new LLVOCacheGroup(mOctree, this); } void LLVOCachePartition::addEntry(LLViewerOctreeEntry* entry) @@ -751,11 +776,11 @@ S32 LLVOCachePartition::cull(LLCamera &camera, bool do_occlusion) void LLVOCachePartition::addOccluders(LLviewerOctreeGroup* gp) { - LLOcclusionCullingGroup* group = (LLOcclusionCullingGroup*)gp; + LLVOCacheGroup* group = (LLVOCacheGroup*)gp; if(!group->isOcclusionState(LLOcclusionCullingGroup::ACTIVE_OCCLUSION)) { - group->setOcclusionState(LLOcclusionCullingGroup::ACTIVE_OCCLUSION); + group->setOcclusionState(LLOcclusionCullingGroup::ACTIVE_OCCLUSION, LLOcclusionCullingGroup::STATE_MODE_ALL_CAMERAS); mOccludedGroups.insert(group); } } @@ -769,9 +794,9 @@ void LLVOCachePartition::processOccluders(LLCamera* camera) LLVector3 region_agent = mRegionp->getOriginAgent(); LLVector4a shift(region_agent[0], region_agent[1], region_agent[2]); - for(std::set<LLOcclusionCullingGroup*>::iterator iter = mOccludedGroups.begin(); iter != mOccludedGroups.end(); ++iter) + for(std::set<LLVOCacheGroup*>::iterator iter = mOccludedGroups.begin(); iter != mOccludedGroups.end(); ++iter) { - LLOcclusionCullingGroup* group = *iter; + LLVOCacheGroup* group = *iter; group->doOcclusion(camera, &shift); } } @@ -783,15 +808,23 @@ void LLVOCachePartition::resetOccluders() return; } - for(std::set<LLOcclusionCullingGroup*>::iterator iter = mOccludedGroups.begin(); iter != mOccludedGroups.end(); ++iter) + for(std::set<LLVOCacheGroup*>::iterator iter = mOccludedGroups.begin(); iter != mOccludedGroups.end(); ++iter) { - LLOcclusionCullingGroup* group = *iter; - group->clearOcclusionState(LLOcclusionCullingGroup::ACTIVE_OCCLUSION); + LLVOCacheGroup* group = *iter; + group->clearOcclusionState(LLOcclusionCullingGroup::ACTIVE_OCCLUSION, LLOcclusionCullingGroup::STATE_MODE_ALL_CAMERAS); } mOccludedGroups.clear(); sNeedsOcclusionCheck = FALSE; } +void LLVOCachePartition::removeOccluder(LLVOCacheGroup* group) +{ + if(mOccludedGroups.empty()) + { + return; + } + mOccludedGroups.erase(group); +} //------------------------------------------------------------------- //LLVOCache //------------------------------------------------------------------- diff --git a/indra/newview/llvocache.h b/indra/newview/llvocache.h index cc755b6231..16ed05dc94 100755 --- a/indra/newview/llvocache.h +++ b/indra/newview/llvocache.h @@ -160,6 +160,18 @@ public: static U32 sMinFrameRange; }; +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 LLTrace::MemTrackable<LLVOCachePartition> { public: @@ -171,7 +183,8 @@ public: void addOccluders(LLviewerOctreeGroup* gp); void resetOccluders(); void processOccluders(LLCamera* camera); - + void removeOccluder(LLVOCacheGroup* group); + private: void selectBackObjects(LLCamera &camera); //select objects behind camera. @@ -181,7 +194,7 @@ public: private: U32 mCullHistory[LLViewerCamera::NUM_CAMERAS]; U32 mCulledTime[LLViewerCamera::NUM_CAMERAS]; - std::set<LLOcclusionCullingGroup*> mOccludedGroups; + std::set<LLVOCacheGroup*> mOccludedGroups; S32 mBackSlectionEnabled; //enable to select back objects if > 0. U32 mIdleHash; |