MAINT-639 Fix for random rainbow effects on some prims.

meow-7.2.2
Dave Parks 2012-05-31 13:25:19 -05:00
parent 67221663fe
commit defbd61d31
3 changed files with 15 additions and 90 deletions

View File

@ -187,12 +187,6 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)
mFaceColor = LLColor4(1,0,0,1);
mLastVertexBuffer = mVertexBuffer;
mLastGeomCount = mGeomCount;
mLastGeomIndex = mGeomIndex;
mLastIndicesCount = mIndicesCount;
mLastIndicesIndex = mIndicesIndex;
mImportanceToCamera = 0.f ;
mBoundingSphereRadius = 0.0f ;
@ -219,6 +213,7 @@ void LLFace::destroy()
mIndicesIndex != 0xFFFFFFFF)
{
LLVOPartGroup::freeVBSlot(getGeomIndex()/4);
mIndicesIndex = 0xFFFFFFFF;
}
if (mDrawPoolp)
@ -390,7 +385,6 @@ void LLFace::setSize(S32 num_vertices, S32 num_indices, bool align)
mGeomCount = num_vertices;
mIndicesCount = num_indices;
mVertexBuffer = NULL;
mLastVertexBuffer = NULL;
}
llassert(verify());
@ -783,12 +777,6 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,
LLMatrix4a mat_normal;
mat_normal.loadu(mat_normal_in);
//if (mDrawablep->isState(LLDrawable::REBUILD_VOLUME))
//{ //vertex buffer no longer valid
// mVertexBuffer = NULL;
// mLastVertexBuffer = NULL;
//}
//VECTORIZE THIS
LLVector4a min,max;
@ -1050,30 +1038,13 @@ bool LLFace::calcAlignedPlanarTE(const LLFace* align_to, LLVector2* res_st_offs
void LLFace::updateRebuildFlags()
{
if (!mDrawablep->isState(LLDrawable::REBUILD_VOLUME))
{
BOOL moved = TRUE;
if (mLastVertexBuffer == mVertexBuffer &&
!mVertexBuffer->isEmpty())
{ //this face really doesn't need to be regenerated, try real hard not to do so
if (mLastGeomCount == mGeomCount &&
mLastGeomIndex == mGeomIndex &&
mLastIndicesCount == mIndicesCount &&
mLastIndicesIndex == mIndicesIndex)
{ //data is in same location in vertex buffer
moved = FALSE;
}
}
mLastMoveTime = gFrameTimeSeconds;
if (moved)
{
mDrawablep->setState(LLDrawable::REBUILD_VOLUME);
}
if (mDrawablep->isState(LLDrawable::REBUILD_VOLUME))
{ //this rebuild is zero overhead (direct consequence of some change that affects this face)
mLastUpdateTime = gFrameTimeSeconds;
}
else
{
mLastUpdateTime = gFrameTimeSeconds;
{ //this rebuild is overhead (side effect of some change that does not affect this face)
mLastMoveTime = gFrameTimeSeconds;
}
}
@ -1228,9 +1199,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
<< " VF Num Indices: " << num_indices
<< " Indices Index: " << mIndicesIndex
<< " VB Num Indices: " << mVertexBuffer->getNumIndices() << llendl;
llwarns << "Last Indices Count: " << mLastIndicesCount
<< " Last Indices Index: " << mLastIndicesIndex
<< " Face Index: " << f
llwarns << " Face Index: " << f
<< " Pool Type: " << mPoolType << llendl;
return FALSE;
}
@ -1404,6 +1373,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
static LLCachedControl<bool> use_transform_feedback(gSavedSettings, "RenderUseTransformFeedback");
#ifdef GL_TRANSFORM_FEEDBACK_BUFFER
if (use_transform_feedback &&
gTransformPositionProgram.mProgramObject && //transform shaders are loaded
mVertexBuffer->useVBOs() && //target buffer is in VRAM
@ -1547,6 +1517,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
}
}
else
#endif
{
//if it's not fullbright and has no normals, bake sunlight based on face normal
//bool bake_sunlight = !getTextureEntry()->getFullbright() &&
@ -2167,12 +2138,6 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
}
mLastVertexBuffer = mVertexBuffer;
mLastGeomCount = mGeomCount;
mLastGeomIndex = mGeomIndex;
mLastIndicesCount = mIndicesCount;
mLastIndicesIndex = mIndicesIndex;
return TRUE;
}
@ -2751,7 +2716,6 @@ void LLFace::setVertexBuffer(LLVertexBuffer* buffer)
void LLFace::clearVertexBuffer()
{
mVertexBuffer = NULL;
mLastVertexBuffer = NULL;
}
//static

View File

@ -224,7 +224,7 @@ public:
//vertex buffer tracking
void setVertexBuffer(LLVertexBuffer* buffer);
void clearVertexBuffer(); //sets mVertexBuffer and mLastVertexBuffer to NULL
void clearVertexBuffer(); //sets mVertexBuffer to NULL
LLVertexBuffer* getVertexBuffer() const { return mVertexBuffer; }
U32 getRiggedVertexBufferDataMask() const;
S32 getRiggedIndex(U32 type) const;
@ -257,8 +257,7 @@ public:
private:
LLPointer<LLVertexBuffer> mVertexBuffer;
LLPointer<LLVertexBuffer> mLastVertexBuffer;
U32 mState;
LLFacePool* mDrawPoolp;
U32 mPoolType;
@ -271,12 +270,6 @@ private:
U32 mIndicesIndex; // index into draw pool for indices (yeah, I know!)
S32 mIndexInTex ;
//previous rebuild's geometry info
U16 mLastGeomCount;
U16 mLastGeomIndex;
U32 mLastIndicesCount;
U32 mLastIndicesIndex;
LLXformMatrix* mXform;
LLPointer<LLViewerTexture> mTexture;
LLPointer<LLDrawable> mDrawablep;

View File

@ -4987,45 +4987,13 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
}
}
//create/delete/resize vertex buffer if needed
//create vertex buffer
LLVertexBuffer* buffer = NULL;
if (group->mBufferUsage != GL_DYNAMIC_DRAW_ARB)
{ //try to find a buffer to reuse
LLFastTimer t(FTM_GEN_DRAW_INFO_FIND_VB);
LLSpatialGroup::buffer_texture_map_t::iterator found_iter = group->mBufferMap[mask].find(*face_iter);
if (found_iter != group->mBufferMap[mask].end())
{
if ((U32) buffer_index < found_iter->second.size())
{
buffer = found_iter->second[buffer_index];
}
}
}
{
LLFastTimer t(FTM_GEN_DRAW_INFO_ALLOCATE);
if (!buffer || !buffer->isWriteable())
{ //create new buffer if needed
buffer = createVertexBuffer(mask, buffer_usage);
buffer->allocateBuffer(geom_count, index_count, TRUE);
}
else
{ //resize pre-existing buffer
LLFastTimer t(FTM_GEN_DRAW_INFO_RESIZE_VB);
if (LLVertexBuffer::sEnableVBOs && buffer->getUsage() != buffer_usage ||
buffer->getTypeMask() != mask)
{
buffer = createVertexBuffer(mask, buffer_usage);
buffer->allocateBuffer(geom_count, index_count, TRUE);
}
else
{
buffer->resizeBuffer(geom_count, index_count);
}
}
buffer = createVertexBuffer(mask, buffer_usage);
buffer->allocateBuffer(geom_count, index_count, TRUE);
}
group->mGeometryBytes += buffer->getSize() + buffer->getIndicesSize();
@ -5070,7 +5038,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
llassert(!facep->isState(LLFace::RIGGED));
facep->getGeometryVolume(*volume, te_idx,
vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), index_offset);
vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), index_offset,true);
if (drawablep->isState(LLDrawable::ANIMATED_CHILD))
{