summaryrefslogtreecommitdiff
path: root/indra/newview/llglsandbox.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llglsandbox.cpp')
-rw-r--r--indra/newview/llglsandbox.cpp33
1 files changed, 24 insertions, 9 deletions
diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp
index eb417106b6..698c15bd2d 100644
--- a/indra/newview/llglsandbox.cpp
+++ b/indra/newview/llglsandbox.cpp
@@ -1033,6 +1033,9 @@ F32 gpu_benchmark()
//number of samples to take
const S32 samples = 64;
+ //time limit, allocation operations shouldn't take longer then 30 seconds, same for actual benchmark.
+ const F32 time_limit = 30;
+
ShaderProfileHelper initProfile;
std::vector<LLRenderTarget> dest(count);
@@ -1050,12 +1053,14 @@ F32 gpu_benchmark()
gGL.setColorMask(true, true);
LLGLDepthTest depth(GL_FALSE);
+ LLTimer alloc_timer;
+ alloc_timer.start();
for (U32 i = 0; i < count; ++i)
{
//allocate render targets and textures
if (!dest[i].allocate(res, res, GL_RGBA, false, false, LLTexUnit::TT_TEXTURE, true))
{
- LL_WARNS() << "Failed to allocate render target." << LL_ENDL;
+ LL_WARNS("Benchmark") << "Failed to allocate render target." << LL_ENDL;
// abandon the benchmark test
delete[] pixels;
return -1.f;
@@ -1067,12 +1072,20 @@ F32 gpu_benchmark()
if (!texHolder.bind(i))
{
// can use a dummy value mDummyTexUnit = new LLTexUnit(-1);
- LL_WARNS() << "Failed to bind tex unit." << LL_ENDL;
+ LL_WARNS("Benchmark") << "Failed to bind tex unit." << LL_ENDL;
// abandon the benchmark test
delete[] pixels;
return -1.f;
}
LLImageGL::setManualImage(GL_TEXTURE_2D, 0, GL_RGBA, res,res,GL_RGBA, GL_UNSIGNED_BYTE, pixels);
+
+ if (alloc_timer.getElapsedTimeF32() > time_limit)
+ {
+ // abandon the benchmark test
+ LL_WARNS("Benchmark") << "Allocation operation took longer then 30 seconds, stopping." << LL_ENDL;
+ delete[] pixels;
+ return -1.f;
+ }
}
delete [] pixels;
@@ -1082,7 +1095,7 @@ F32 gpu_benchmark()
if (!buff->allocateBuffer(3, 0, true))
{
- LL_WARNS() << "Failed to allocate buffer during benchmark." << LL_ENDL;
+ LL_WARNS("Benchmark") << "Failed to allocate buffer during benchmark." << LL_ENDL;
// abandon the benchmark test
return -1.f;
}
@@ -1092,7 +1105,7 @@ F32 gpu_benchmark()
if (! buff->getVertexStrider(v))
{
- LL_WARNS() << "GL LLVertexBuffer::getVertexStrider() returned false, "
+ LL_WARNS("Benchmark") << "GL LLVertexBuffer::getVertexStrider() returned false, "
<< "buff->getMappedData() is"
<< (buff->getMappedData()? " not" : "")
<< " NULL" << LL_ENDL;
@@ -1113,7 +1126,8 @@ F32 gpu_benchmark()
buff->setBuffer(LLVertexBuffer::MAP_VERTEX);
glFinish();
- for (S32 c = -1; c < samples; ++c)
+ F32 time_passed = 0; // seconds
+ for (S32 c = -1; c < samples && time_passed < time_limit; ++c)
{
LLTimer timer;
timer.start();
@@ -1130,6 +1144,7 @@ F32 gpu_benchmark()
glFinish();
F32 time = timer.getElapsedTimeF32();
+ time_passed += time;
if (c >= 0) // <-- ignore the first sample as it tends to be artificially slow
{
@@ -1144,12 +1159,12 @@ F32 gpu_benchmark()
F32 gbps = results[results.size()/2];
- LL_INFOS() << "Memory bandwidth is " << llformat("%.3f", gbps) << "GB/sec according to CPU timers" << LL_ENDL;
+ LL_INFOS("Benchmark") << "Memory bandwidth is " << llformat("%.3f", gbps) << "GB/sec according to CPU timers, " << (F32)results.size() << " tests took " << time_passed << " seconds" << LL_ENDL;
#if LL_DARWIN
if (gbps > 512.f)
{
- LL_WARNS() << "Memory bandwidth is improbably high and likely incorrect; discarding result." << LL_ENDL;
+ LL_WARNS("Benchmark") << "Memory bandwidth is improbably high and likely incorrect; discarding result." << LL_ENDL;
//OSX is probably lying, discard result
return -1.f;
}
@@ -1158,11 +1173,11 @@ F32 gpu_benchmark()
F32 ms = gBenchmarkProgram.mTimeElapsed/1000000.f;
F32 seconds = ms/1000.f;
- F64 samples_drawn = res*res*count*samples;
+ F64 samples_drawn = res*res*count*results.size();
F32 samples_sec = (samples_drawn/1000000000.0)/seconds;
gbps = samples_sec*8;
- LL_INFOS() << "Memory bandwidth is " << llformat("%.3f", gbps) << "GB/sec according to ARB_timer_query" << LL_ENDL;
+ LL_INFOS("Benchmark") << "Memory bandwidth is " << llformat("%.3f", gbps) << "GB/sec according to ARB_timer_query, total time " << seconds << " seconds" << LL_ENDL;
return gbps;
}