Skip to content
Snippets Groups Projects
Commit dfc07858 authored by Nat Goodspeed's avatar Nat Goodspeed
Browse files

MAINT-7977: If getVertexStrider() returns false, abandon benchmark.

Ruslan tracked the observed crash to assignments (to create a dummy triangle)
through an LLStrider<LLVector3> obtained from getVertexStrider(). When
getVertexStrider() returns false, produce a warning and just skip the rest of
the benchmark test.

The one bit of explicit cleanup apparently required by that early exit is a
call to LLImageGL::deleteTextures() to match the preceding generateTextures()
call. Wrap both in a new TextureHolder class whose destructor takes care of
cleanup. The only other references to the corresponding U32 array are a couple
calls to LLTexUnit::bindManual(); add a bind() method to support that.

Also fix apparent bug in the LL_DARWIN special case for "improbably high and
likely incorrect": the code assigned -1.f (the "couldn't compute" value) to
gbps, overlooking the fact that gbps is unconditionally recomputed below. In
the "likely incorrect" stanza, simply return -1.f instead.
parent d310159b
No related branches found
No related tags found
No related merge requests found
...@@ -64,6 +64,8 @@ ...@@ -64,6 +64,8 @@
#include "llspatialpartition.h" #include "llspatialpartition.h"
#include "llviewershadermgr.h" #include "llviewershadermgr.h"
#include <vector>
// Height of the yellow selection highlight posts for land // Height of the yellow selection highlight posts for land
const F32 PARCEL_POST_HEIGHT = 0.666f; const F32 PARCEL_POST_HEIGHT = 0.666f;
...@@ -926,9 +928,40 @@ F32 gpu_benchmark() ...@@ -926,9 +928,40 @@ F32 gpu_benchmark()
LLGLSLShader::initProfile(); LLGLSLShader::initProfile();
} }
// This struct is used to ensure that each generateTextures() call is
// matched by a corresponding deleteTextures() call. It also handles the
// bindManual() calls using those textures.
struct TextureHolder
{
TextureHolder(U32 unit, U32 size):
texUnit(gGL.getTexUnit(unit)),
source(size) // preallocate vector
{
// takes (count, pointer)
// &vector[0] gets pointer to contiguous array
LLImageGL::generateTextures(source.size(), &source[0]);
}
~TextureHolder()
{
// ensure that we delete these textures regardless of how we exit
LLImageGL::deleteTextures(source.size(), &source[0]);
}
void bind(U32 index)
{
texUnit->bindManual(LLTexUnit::TT_TEXTURE, source[index]);
}
// capture which LLTexUnit we're going to use
LLTexUnit* texUnit;
// use std::vector for implicit resource management
std::vector<U32> source;
};
LLRenderTarget dest[count]; LLRenderTarget dest[count];
U32 source[count]; TextureHolder texHolder(0, count);
LLImageGL::generateTextures(count, source);
std::vector<F32> results; std::vector<F32> results;
//build a random texture //build a random texture
...@@ -950,7 +983,7 @@ F32 gpu_benchmark() ...@@ -950,7 +983,7 @@ F32 gpu_benchmark()
dest[i].clear(); dest[i].clear();
dest[i].flush(); dest[i].flush();
gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, source[i]); texHolder.bind(i);
LLImageGL::setManualImage(GL_TEXTURE_2D, 0, GL_RGBA, res,res,GL_RGBA, GL_UNSIGNED_BYTE, pixels); LLImageGL::setManualImage(GL_TEXTURE_2D, 0, GL_RGBA, res,res,GL_RGBA, GL_UNSIGNED_BYTE, pixels);
} }
...@@ -963,17 +996,21 @@ F32 gpu_benchmark() ...@@ -963,17 +996,21 @@ F32 gpu_benchmark()
LLStrider<LLVector3> v; LLStrider<LLVector3> v;
LLStrider<LLVector2> tc; LLStrider<LLVector2> tc;
if (buff->getVertexStrider(v)) if (! buff->getVertexStrider(v))
{ {
v[0].set(-1, 1, 0); LL_WARNS() << "GL LLVertexBuffer::getVertexStrider() returned false, "
v[1].set(-1, -3, 0); << "buff->getMappedData() is"
v[2].set(3, 1, 0); << (buff->getMappedData()? " not" : "")
} << " NULL" << LL_ENDL;
else // abandon the benchmark test
{ return -1.f;
LL_WARNS() << "GL LLVertexBuffer::getVertexStrider() return false " << (NULL == buff->getMappedData() ? "buff->getMappedData() is NULL" : "buff->getMappedData() not NULL") << LL_ENDL;
} }
// generate dummy triangle
v[0].set(-1, 1, 0);
v[1].set(-1, -3, 0);
v[2].set(3, 1, 0);
buff->flush(); buff->flush();
gBenchmarkProgram.bind(); gBenchmarkProgram.bind();
...@@ -991,7 +1028,7 @@ F32 gpu_benchmark() ...@@ -991,7 +1028,7 @@ F32 gpu_benchmark()
for (U32 i = 0; i < count; ++i) for (U32 i = 0; i < count; ++i)
{ {
dest[i].bindTarget(); dest[i].bindTarget();
gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, source[i]); texHolder.bind(i);
buff->drawArrays(LLRender::TRIANGLES, 0, 3); buff->drawArrays(LLRender::TRIANGLES, 0, 3);
dest[i].flush(); dest[i].flush();
} }
...@@ -1038,8 +1075,6 @@ F32 gpu_benchmark() ...@@ -1038,8 +1075,6 @@ F32 gpu_benchmark()
LLGLSLShader::finishProfile(false); LLGLSLShader::finishProfile(false);
} }
LLImageGL::deleteTextures(count, source);
std::sort(results.begin(), results.end()); std::sort(results.begin(), results.end());
F32 gbps = results[results.size()/2]; F32 gbps = results[results.size()/2];
...@@ -1051,7 +1086,7 @@ F32 gpu_benchmark() ...@@ -1051,7 +1086,7 @@ F32 gpu_benchmark()
{ {
LL_WARNS() << "Memory bandwidth is improbably high and likely incorrect; discarding result." << LL_ENDL; LL_WARNS() << "Memory bandwidth is improbably high and likely incorrect; discarding result." << LL_ENDL;
//OSX is probably lying, discard result //OSX is probably lying, discard result
gbps = -1.f; return -1.f;
} }
#endif #endif
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment