summaryrefslogtreecommitdiff
path: root/indra/newview/llvoavatar.cpp
diff options
context:
space:
mode:
authorandreykproductengine <andreykproductengine@lindenlab.com>2017-11-01 19:36:13 +0200
committerandreykproductengine <andreykproductengine@lindenlab.com>2017-11-01 19:36:13 +0200
commit149b2d88dd75bddf1cb3e9927c4e8fcc84e263e1 (patch)
treeb02a4d2775cec34281b637a6f4d1ae0c40faa976 /indra/newview/llvoavatar.cpp
parentfec6bbddc371b2d1e0aa41d39a1b3dfaa8fb2016 (diff)
MAINT-7228 Vertex buffer allocation failure handling
Diffstat (limited to 'indra/newview/llvoavatar.cpp')
-rw-r--r--indra/newview/llvoavatar.cpp50
1 files changed, 36 insertions, 14 deletions
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index cc708ea275..33ab188704 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -2085,7 +2085,17 @@ void LLVOAvatar::updateMeshData()
if(!facep->getVertexBuffer())
{
buff = new LLVertexBufferAvatar();
- buff->allocateBuffer(num_vertices, num_indices, TRUE);
+ if (!buff->allocateBuffer(num_vertices, num_indices, TRUE))
+ {
+ LL_WARNS() << "Failed to allocate Vertex Buffer for Mesh to "
+ << num_vertices << " vertices and "
+ << num_indices << " indices" << LL_ENDL;
+ // Attempt to create a dummy triangle (one vertex, 3 indices, all 0)
+ facep->setSize(1, 3);
+ buff->allocateBuffer(1, 3, true);
+ memset((U8*) buff->getMappedData(), 0, buff->getSize());
+ memset((U8*) buff->getIndicesPointer(), 0, buff->getIndicesSize());
+ }
facep->setVertexBuffer(buff);
}
else
@@ -2097,7 +2107,15 @@ void LLVOAvatar::updateMeshData()
}
else
{
- buff->resizeBuffer(num_vertices, num_indices);
+ if (!buff->resizeBuffer(num_vertices, num_indices))
+ {
+ LL_WARNS() << "Failed to allocate vertex buffer for Mesh, Substituting" << LL_ENDL;
+ // Attempt to create a dummy triangle (one vertex, 3 indices, all 0)
+ facep->setSize(1, 3);
+ buff->resizeBuffer(1, 3);
+ memset((U8*) buff->getMappedData(), 0, buff->getSize());
+ memset((U8*) buff->getIndicesPointer(), 0, buff->getIndicesSize());
+ }
}
}
@@ -2109,20 +2127,24 @@ void LLVOAvatar::updateMeshData()
LL_ERRS() << "non-zero geom index: " << facep->getGeomIndex() << " in LLVOAvatar::restoreMeshData" << LL_ENDL;
}
- for(S32 k = j ; k < part_index ; k++)
+ if (num_vertices == buff->getNumVerts() && num_indices == buff->getNumIndices())
{
- bool rigid = false;
- if (k == MESH_ID_EYEBALL_LEFT ||
- k == MESH_ID_EYEBALL_RIGHT)
- { //eyeballs can't have terse updates since they're never rendered with
- //the hardware skinning shader
- rigid = true;
- }
-
- LLViewerJoint* mesh = getViewerJoint(k);
- if (mesh)
+ for(S32 k = j ; k < part_index ; k++)
{
- mesh->updateFaceData(facep, mAdjustedPixelArea, k == MESH_ID_HAIR, terse_update && !rigid);
+ bool rigid = false;
+ if (k == MESH_ID_EYEBALL_LEFT ||
+ k == MESH_ID_EYEBALL_RIGHT)
+ {
+ //eyeballs can't have terse updates since they're never rendered with
+ //the hardware skinning shader
+ rigid = true;
+ }
+
+ LLViewerJoint* mesh = getViewerJoint(k);
+ if (mesh)
+ {
+ mesh->updateFaceData(facep, mAdjustedPixelArea, k == MESH_ID_HAIR, terse_update && !rigid);
+ }
}
}