summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Parks <davep@lindenlab.com>2012-09-20 10:00:58 -0400
committerDave Parks <davep@lindenlab.com>2012-09-20 10:00:58 -0400
commit7fc702dc4930445b87dc2cd1d52c0cc64295f26c (patch)
tree87674607fb652ac2334023997060c842a20cb3b3
parent60cf43bad98d620f6024c9fe3f0b48aeecad2de7 (diff)
reapply 04fdf7945708: MAINT-775 Fix for particle index pool corruption on teleport.
-rw-r--r--indra/newview/llappviewer.cpp4
-rwxr-xr-xindra/newview/llface.cpp7
-rw-r--r--indra/newview/llface.h1
-rw-r--r--indra/newview/llvopartgroup.cpp10
-rw-r--r--indra/newview/llvopartgroup.h1
5 files changed, 15 insertions, 8 deletions
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index e8934d9a9e..cb69048c60 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -89,6 +89,7 @@
#include "lllogininstance.h"
#include "llprogressview.h"
#include "llvocache.h"
+#include "llvopartgroup.h"
#include "llweb.h"
#include "llsecondlifeurls.h"
#include "llupdaterservice.h"
@@ -679,6 +680,9 @@ bool LLAppViewer::init()
// initialize SSE options
LLVector4a::initClass();
+ //initialize particle index pool
+ LLVOPartGroup::initClass();
+
// Need to do this initialization before we do anything else, since anything
// that touches files should really go through the lldir API
gDirUtilp->initAppDirs("SecondLife");
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 2074cb6514..582f06eeb0 100755
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -202,13 +202,10 @@ void LLFace::destroy()
mTexture->removeFace(this) ;
}
- if (mDrawablep.notNull() &&
- (mDrawablep->getRenderType() == LLPipeline::RENDER_TYPE_PARTICLES ||
- mDrawablep->getRenderType() == LLPipeline::RENDER_TYPE_HUD_PARTICLES) &&
- mIndicesIndex != 0xFFFFFFFF)
+ if (isState(LLFace::PARTICLE))
{
LLVOPartGroup::freeVBSlot(getGeomIndex()/4);
- mIndicesIndex = 0xFFFFFFFF;
+ clearState(LLFace::PARTICLE);
}
if (mDrawPoolp)
diff --git a/indra/newview/llface.h b/indra/newview/llface.h
index 5dca27487f..efc3424858 100644
--- a/indra/newview/llface.h
+++ b/indra/newview/llface.h
@@ -90,6 +90,7 @@ public:
USE_FACE_COLOR = 0x0010,
TEXTURE_ANIM = 0x0020,
RIGGED = 0x0040,
+ PARTICLE = 0x0080,
};
static void initClass();
diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp
index 02282fd6a6..9cce68fff6 100644
--- a/indra/newview/llvopartgroup.cpp
+++ b/indra/newview/llvopartgroup.cpp
@@ -52,8 +52,7 @@ LLPointer<LLVertexBuffer> LLVOPartGroup::sVB = NULL;
S32 LLVOPartGroup::sVBSlotFree[];
S32* LLVOPartGroup::sVBSlotCursor = NULL;
-//static
-void LLVOPartGroup::restoreGL()
+void LLVOPartGroup::initClass()
{
for (S32 i = 0; i < LL_MAX_PARTICLE_COUNT; ++i)
{
@@ -61,7 +60,11 @@ void LLVOPartGroup::restoreGL()
}
sVBSlotCursor = sVBSlotFree;
+}
+//static
+void LLVOPartGroup::restoreGL()
+{
sVB = new LLVertexBuffer(VERTEX_DATA_MASK, GL_STREAM_DRAW_ARB);
U32 count = LL_MAX_PARTICLE_COUNT;
sVB->allocateBuffer(count*4, count*6, true);
@@ -626,7 +629,7 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group)
LLFace* facep = *i;
LLAlphaObject* object = (LLAlphaObject*) facep->getViewerObject();
- if (facep->getIndicesStart() == 0xFFFFFFFF)
+ if (!facep->isState(LLFace::PARTICLE))
{ //set the indices of this face
S32 idx = LLVOPartGroup::findAvailableVBSlot();
if (idx >= 0)
@@ -635,6 +638,7 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group)
facep->setIndicesIndex(idx*6);
facep->setVertexBuffer(LLVOPartGroup::sVB);
facep->setPoolType(LLDrawPool::POOL_ALPHA);
+ facep->setState(LLFace::PARTICLE);
}
else
{
diff --git a/indra/newview/llvopartgroup.h b/indra/newview/llvopartgroup.h
index 6160bceb24..43b2844f07 100644
--- a/indra/newview/llvopartgroup.h
+++ b/indra/newview/llvopartgroup.h
@@ -45,6 +45,7 @@ public:
static S32 sVBSlotFree[LL_MAX_PARTICLE_COUNT];
static S32* sVBSlotCursor;
+ static void initClass();
static void restoreGL();
static void destroyGL();
static S32 findAvailableVBSlot();