Attempt to squash spatial partition crash.

This commit is contained in:
Shyotl
2020-04-16 00:52:55 -05:00
parent 132db6225e
commit 9bffc4bb82
4 changed files with 39 additions and 15 deletions

View File

@@ -1596,11 +1596,7 @@ void LLSpatialBridge::cleanupReferences()
LLDrawable::cleanupReferences(); LLDrawable::cleanupReferences();
if (mDrawable) if (mDrawable)
{ {
/* mDrawable->setGroup(NULL);
DON'T DO THIS -- this should happen through octree destruction
mDrawable->setSpatialGroup(NULL);
if (mDrawable->getVObj()) if (mDrawable->getVObj())
{ {
LLViewerObject::const_child_list_t& child_list = mDrawable->getVObj()->getChildren(); LLViewerObject::const_child_list_t& child_list = mDrawable->getVObj()->getChildren();
@@ -1608,17 +1604,18 @@ void LLSpatialBridge::cleanupReferences()
iter != child_list.end(); iter++) iter != child_list.end(); iter++)
{ {
LLViewerObject* child = *iter; LLViewerObject* child = *iter;
LLDrawable* drawable = child->mDrawable; LLDrawable* drawable = child->mDrawable;
if (drawable) if (drawable)
{ {
drawable->setSpatialGroup(NULL); drawable->setGroup(NULL);
} }
} }
}*/ }
LLPointer<LLDrawable> drawablep = mDrawable; LLPointer<LLSpatialBridge> bridgep = mDrawable->getSpatialBridge();
mDrawable->setSpatialBridge(nullptr);
mDrawable = nullptr; mDrawable = nullptr;
drawablep->setSpatialBridge(nullptr); bridgep = nullptr;
} }
} }

View File

@@ -316,7 +316,7 @@ public:
void drawObjectBox(LLColor4 col); void drawObjectBox(LLColor4 col);
LLSpatialPartition* getSpatialPartition() const {return (LLSpatialPartition*)mSpatialPartition;} LLSpatialPartition* getSpatialPartition() const {return mSpatialPartition;}
//LISTENER FUNCTIONS //LISTENER FUNCTIONS
void handleInsertion(const TreeNode* node, LLViewerOctreeEntry* face) final override; void handleInsertion(const TreeNode* node, LLViewerOctreeEntry* face) final override;

View File

@@ -846,10 +846,12 @@ public:
}; };
LLOcclusionCullingGroup::LLOcclusionCullingGroup(OctreeNode* node, LLViewerOctreePartition* part) : LLOcclusionCullingGroup::LLOcclusionCullingGroup(OctreeNode* node, LLSpatialPartition* part) :
LLViewerOctreeGroup(node), LLViewerOctreeGroup(node),
mSpatialPartition(part) mSpatialPartition(part)
{ {
llassert(part);
mSpatialPartition->mGroups.push_back(this);
part->mLODSeed = (part->mLODSeed+1)%part->mLODPeriod; part->mLODSeed = (part->mLODSeed+1)%part->mLODPeriod;
mLODHash = part->mLODSeed; mLODHash = part->mLODSeed;
@@ -867,12 +869,21 @@ LLOcclusionCullingGroup::LLOcclusionCullingGroup(OctreeNode* node, LLViewerOctre
LLOcclusionCullingGroup::~LLOcclusionCullingGroup() LLOcclusionCullingGroup::~LLOcclusionCullingGroup()
{ {
if (mSpatialPartition)
{
auto it = std::find_if(mSpatialPartition->mGroups.begin(), mSpatialPartition->mGroups.end(), [this](LLOcclusionCullingGroup* rhs) {return rhs == this; });
llassert_always(it != mSpatialPartition->mGroups.end());
if (it != mSpatialPartition->mGroups.end())
{
mSpatialPartition->mGroups.erase(it);
}
}
releaseOcclusionQueryObjectNames(); releaseOcclusionQueryObjectNames();
} }
BOOL LLOcclusionCullingGroup::needsUpdate() BOOL LLOcclusionCullingGroup::needsUpdate()
{ {
return (LLDrawable::getCurrentFrame() % mSpatialPartition->mLODPeriod == mLODHash) ? TRUE : FALSE; return mSpatialPartition && (LLDrawable::getCurrentFrame() % mSpatialPartition->mLODPeriod == mLODHash) ? TRUE : FALSE;
} }
BOOL LLOcclusionCullingGroup::isRecentlyVisible() const BOOL LLOcclusionCullingGroup::isRecentlyVisible() const
@@ -1070,6 +1081,10 @@ U32 LLOcclusionCullingGroup::getLastOcclusionIssuedTime()
void LLOcclusionCullingGroup::checkOcclusion() void LLOcclusionCullingGroup::checkOcclusion()
{ {
if (mSpatialPartition == nullptr)
{
return;
}
if (LLPipeline::sUseOcclusion > 1) if (LLPipeline::sUseOcclusion > 1)
{ {
LL_RECORD_BLOCK_TIME(FTM_OCCLUSION_READBACK); LL_RECORD_BLOCK_TIME(FTM_OCCLUSION_READBACK);
@@ -1170,6 +1185,10 @@ static LLTrace::BlockTimerStatHandle FTM_OCCLUSION_DRAW("Draw");
void LLOcclusionCullingGroup::doOcclusion(LLCamera* camera, const LLVector4a* shift) void LLOcclusionCullingGroup::doOcclusion(LLCamera* camera, const LLVector4a* shift)
{ {
if (mSpatialPartition == nullptr)
{
return;
}
LLGLDisable<GL_STENCIL_TEST> stencil; LLGLDisable<GL_STENCIL_TEST> stencil;
if (mSpatialPartition->isOcclusionEnabled() && LLPipeline::sUseOcclusion > 1) if (mSpatialPartition->isOcclusionEnabled() && LLPipeline::sUseOcclusion > 1)
{ {
@@ -1319,6 +1338,11 @@ LLViewerOctreePartition::LLViewerOctreePartition() :
LLViewerOctreePartition::~LLViewerOctreePartition() LLViewerOctreePartition::~LLViewerOctreePartition()
{ {
llassert(mGroups.empty());
for (auto& entry : mGroups)
{
entry->mSpatialPartition = nullptr;
}
delete mOctree; delete mOctree;
mOctree = NULL; mOctree = NULL;
} }

View File

@@ -44,6 +44,7 @@ class LLViewerOctreeEntryData;
class LLViewerOctreeGroup; class LLViewerOctreeGroup;
class LLViewerOctreeEntry; class LLViewerOctreeEntry;
class LLViewerOctreePartition; class LLViewerOctreePartition;
class LLSpatialPartition;
typedef LLOctreeListener<LLViewerOctreeEntry> OctreeListener; typedef LLOctreeListener<LLViewerOctreeEntry> OctreeListener;
typedef LLTreeNode<LLViewerOctreeEntry> TreeNode; typedef LLTreeNode<LLViewerOctreeEntry> TreeNode;
@@ -288,7 +289,7 @@ protected:
virtual ~LLOcclusionCullingGroup(); virtual ~LLOcclusionCullingGroup();
public: public:
LLOcclusionCullingGroup(OctreeNode* node, LLViewerOctreePartition* part); LLOcclusionCullingGroup(OctreeNode* node, LLSpatialPartition* part);
LLOcclusionCullingGroup(const LLOcclusionCullingGroup& rhs) : LLViewerOctreeGroup(rhs) LLOcclusionCullingGroup(const LLOcclusionCullingGroup& rhs) : LLViewerOctreeGroup(rhs)
{ {
*this = rhs; *this = rhs;
@@ -330,7 +331,8 @@ protected:
S32 mLODHash; S32 mLODHash;
LLViewerOctreePartition* mSpatialPartition; friend class LLViewerOctreePartition;
LLSpatialPartition* mSpatialPartition;
U32 mOcclusionQuery[LLViewerCamera::NUM_CAMERAS]; U32 mOcclusionQuery[LLViewerCamera::NUM_CAMERAS];
public: public:
@@ -355,6 +357,7 @@ public:
BOOL mOcclusionEnabled; // if TRUE, occlusion culling is performed BOOL mOcclusionEnabled; // if TRUE, occlusion culling is performed
U32 mLODSeed; U32 mLODSeed;
U32 mLODPeriod; //number of frames between LOD updates for a given spatial group (staggered by mLODSeed) U32 mLODPeriod; //number of frames between LOD updates for a given spatial group (staggered by mLODSeed)
std::vector<LLOcclusionCullingGroup*> mGroups;
}; };
class LLViewerOctreeCull : public OctreeTraveler class LLViewerOctreeCull : public OctreeTraveler