From f1443579b32cf260e7ad35f35de3930f0f801bd2 Mon Sep 17 00:00:00 2001 From: Dave Parks Date: Sat, 9 Jul 2011 02:28:34 -0500 Subject: SH-2038 Potential fix for a myriad of performance problems concering VBO usage. --- indra/newview/llface.cpp | 64 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 18 deletions(-) (limited to 'indra/newview/llface.cpp') diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index b6566fcbd0..d2b05d1088 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -1064,6 +1064,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, S32 num_vertices = (S32)vf.mNumVertices; S32 num_indices = (S32) vf.mNumIndices; + bool map_range = gGLManager.mHasMapBufferRange; + if (mVertexBuffer.notNull()) { if (num_indices + (S32) mIndicesIndex > mVertexBuffer->getNumIndices()) @@ -1182,7 +1184,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, // INDICES if (full_rebuild) { - mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex, mIndicesCount, true); + mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex, mIndicesCount, map_range); __m128i* dst = (__m128i*) indicesp.get(); __m128i* src = (__m128i*) vf.mIndices; @@ -1201,7 +1203,10 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, indicesp[i] = vf.mIndices[i]+index_offset; } - mVertexBuffer->setBuffer(0); + if (map_range) + { + mVertexBuffer->setBuffer(0); + } } LLMatrix4a mat_normal; @@ -1422,11 +1427,14 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, } } - mVertexBuffer->setBuffer(0); + if (map_range) + { + mVertexBuffer->setBuffer(0); + } } else { //either bump mapped or in atlas, just do the whole expensive loop - mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex, mGeomCount, true); + mVertexBuffer->getTexCoord0Strider(tex_coords, mGeomIndex, mGeomCount, map_range); std::vector bump_tc; @@ -1566,12 +1574,14 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, } } - mVertexBuffer->setBuffer(0); - + if (map_range) + { + mVertexBuffer->setBuffer(0); + } if (do_bump) { - mVertexBuffer->getTexCoord1Strider(tex_coords2, mGeomIndex, mGeomCount, true); + mVertexBuffer->getTexCoord1Strider(tex_coords2, mGeomIndex, mGeomCount, map_range); for (S32 i = 0; i < num_vertices; i++) { @@ -1601,14 +1611,17 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, *tex_coords2++ = tc; } - mVertexBuffer->setBuffer(0); + if (map_range) + { + mVertexBuffer->setBuffer(0); + } } } } if (rebuild_pos) { - mVertexBuffer->getVertexStrider(vert, mGeomIndex, mGeomCount, true); + mVertexBuffer->getVertexStrider(vert, mGeomIndex, mGeomCount, map_range); vertices = (LLVector4a*) vert.get(); LLMatrix4a mat_vert; @@ -1637,12 +1650,15 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, } while (index_dst < index_end); - mVertexBuffer->setBuffer(0); + if (map_range) + { + mVertexBuffer->setBuffer(0); + } } if (rebuild_normal) { - mVertexBuffer->getNormalStrider(norm, mGeomIndex, mGeomCount, true); + mVertexBuffer->getNormalStrider(norm, mGeomIndex, mGeomCount, map_range); normals = (LLVector4a*) norm.get(); for (S32 i = 0; i < num_vertices; i++) @@ -1653,12 +1669,15 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, normals[i] = normal; } - mVertexBuffer->setBuffer(0); + if (map_range) + { + mVertexBuffer->setBuffer(0); + } } if (rebuild_binormal) { - mVertexBuffer->getBinormalStrider(binorm, mGeomIndex, mGeomCount, true); + mVertexBuffer->getBinormalStrider(binorm, mGeomIndex, mGeomCount, map_range); binormals = (LLVector4a*) binorm.get(); for (S32 i = 0; i < num_vertices; i++) @@ -1669,20 +1688,26 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, binormals[i] = binormal; } - mVertexBuffer->setBuffer(0); + if (map_range) + { + mVertexBuffer->setBuffer(0); + } } if (rebuild_weights && vf.mWeights) { - mVertexBuffer->getWeight4Strider(wght, mGeomIndex, mGeomCount, true); + mVertexBuffer->getWeight4Strider(wght, mGeomIndex, mGeomCount, map_range); weights = (LLVector4a*) wght.get(); LLVector4a::memcpyNonAliased16((F32*) weights, (F32*) vf.mWeights, num_vertices*4*sizeof(F32)); - mVertexBuffer->setBuffer(0); + if (map_range) + { + mVertexBuffer->setBuffer(0); + } } if (rebuild_color) { - mVertexBuffer->getColorStrider(colors, mGeomIndex, mGeomCount, true); + mVertexBuffer->getColorStrider(colors, mGeomIndex, mGeomCount, map_range); LLVector4a src; @@ -1703,7 +1728,10 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, dst[i] = src; } - mVertexBuffer->setBuffer(0); + if (map_range) + { + mVertexBuffer->setBuffer(0); + } } if (rebuild_tcoord) -- cgit v1.2.3 From e4d0d62e71de69d1685d00da571e9055e18fdc0c Mon Sep 17 00:00:00 2001 From: Don Kjer Date: Sat, 9 Jul 2011 22:30:30 -0700 Subject: Added support for apple flush buffer range --- indra/newview/llface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview/llface.cpp') diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index d2b05d1088..59c6e904a1 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -1064,7 +1064,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, S32 num_vertices = (S32)vf.mNumVertices; S32 num_indices = (S32) vf.mNumIndices; - bool map_range = gGLManager.mHasMapBufferRange; + bool map_range = gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange; if (mVertexBuffer.notNull()) { -- cgit v1.2.3 From 76249c58f64beec0d426ab37397159feeafca2d6 Mon Sep 17 00:00:00 2001 From: Leslie Linden Date: Tue, 19 Jul 2011 13:31:32 -0700 Subject: SH-2038 FIX -- [PUBLIC] Severe performance drop on MacBook Pros EXP-997 FIX -- Significant FPS degradation in 2.8.0 Beta on Mac equipped ATI video card * Disabled VBO's on mac to avoid stalls in renderer * Placed valid data into the padding between triangles in the vertex buffer to remove uninitialized craziness * Removed invalid rendering checks causing GL errors in debug mode Reviewed by davep --- indra/newview/llface.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'indra/newview/llface.cpp') diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 59c6e904a1..17b6912b63 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -1621,6 +1621,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, if (rebuild_pos) { + llassert(num_vertices > 0); + mVertexBuffer->getVertexStrider(vert, mGeomIndex, mGeomCount, map_range); vertices = (LLVector4a*) vert.get(); @@ -1649,7 +1651,15 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, index_dst += 4; } while (index_dst < index_end); - + + S32 aligned_pad_vertices = mGeomCount - num_vertices; + LLVector4a* last_vec = end - 1; + while (aligned_pad_vertices > 0) + { + --aligned_pad_vertices; + *dst++ = *last_vec; + } + if (map_range) { mVertexBuffer->setBuffer(0); -- cgit v1.2.3 From c3378885536c5b7d3dd503ed6867cf5d6a8b1370 Mon Sep 17 00:00:00 2001 From: Dave Parks Date: Fri, 22 Jul 2011 01:07:48 -0500 Subject: SH-2031 Disable usage of glMapBuffer (again). Despite using MapBufferRange, this is still a source of frame stalls. --- indra/newview/llface.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'indra/newview/llface.cpp') diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 17b6912b63..432e61f6d8 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -1051,6 +1051,13 @@ bool LLFace::canRenderAsMask() static LLFastTimer::DeclareTimer FTM_FACE_GET_GEOM("Face Geom"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_POSITION("Position"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_NORMAL("Normal"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_TEXTURE("Texture"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_COLOR("Color"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_WEIGHTS("Weights"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_BINORMAL("Binormal"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_INDEX("Index"); BOOL LLFace::getGeometryVolume(const LLVolume& volume, const S32 &f, @@ -1184,6 +1191,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, // INDICES if (full_rebuild) { + LLFastTimer t(FTM_FACE_GEOM_INDEX); mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex, mIndicesCount, map_range); __m128i* dst = (__m128i*) indicesp.get(); @@ -1220,6 +1228,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, if (rebuild_tcoord) { + LLFastTimer t(FTM_FACE_GEOM_TEXTURE); bool do_xform; if (tep) @@ -1621,6 +1630,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, if (rebuild_pos) { + LLFastTimer t(FTM_FACE_GEOM_POSITION); llassert(num_vertices > 0); mVertexBuffer->getVertexStrider(vert, mGeomIndex, mGeomCount, map_range); @@ -1668,6 +1678,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, if (rebuild_normal) { + LLFastTimer t(FTM_FACE_GEOM_NORMAL); mVertexBuffer->getNormalStrider(norm, mGeomIndex, mGeomCount, map_range); normals = (LLVector4a*) norm.get(); @@ -1687,6 +1698,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, if (rebuild_binormal) { + LLFastTimer t(FTM_FACE_GEOM_BINORMAL); mVertexBuffer->getBinormalStrider(binorm, mGeomIndex, mGeomCount, map_range); binormals = (LLVector4a*) binorm.get(); @@ -1706,6 +1718,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, if (rebuild_weights && vf.mWeights) { + LLFastTimer t(FTM_FACE_GEOM_WEIGHTS); mVertexBuffer->getWeight4Strider(wght, mGeomIndex, mGeomCount, map_range); weights = (LLVector4a*) wght.get(); LLVector4a::memcpyNonAliased16((F32*) weights, (F32*) vf.mWeights, num_vertices*4*sizeof(F32)); @@ -1717,6 +1730,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, if (rebuild_color) { + LLFastTimer t(FTM_FACE_GEOM_COLOR); mVertexBuffer->getColorStrider(colors, mGeomIndex, mGeomCount, map_range); LLVector4a src; -- cgit v1.2.3