Attempt to squash spatial partition crash.
This commit is contained in:
@@ -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();
|
||||||
@@ -1611,14 +1607,15 @@ void LLSpatialBridge::cleanupReferences()
|
|||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user