From 9eeb8344a6dd8721ebc85463e966b05a9b034381 Mon Sep 17 00:00:00 2001 From: Graham Linden Date: Mon, 17 Nov 2014 11:40:28 -0800 Subject: Avoid using GL_ARB_timer_query functionality when not supported and protect against probably-not-NULL current bound shader pointer --- indra/newview/llglsandbox.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'indra/newview/llglsandbox.cpp') diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index 4b8ac2b3cf..7cf17c90e9 100755 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -954,7 +954,7 @@ F32 gpu_benchmark() //make a dummy triangle to draw with LLPointer buff = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, GL_STATIC_DRAW_ARB); - buff->allocateBuffer(3, 0, true); + buff->allocateBuffer(12, 0, true); LLStrider v; LLStrider tc; @@ -964,6 +964,16 @@ F32 gpu_benchmark() v[0].set(-1,1,0); v[1].set(-1,-3,0); v[2].set(3,1,0); + v[3].set(-1,1,0); + v[4].set(-1,-3,0); + v[5].set(3,1,0); + v[6].set(-1,1,0); + v[7].set(-1,-3,0); + v[8].set(3,1,0); + v[9].set(-1,1,0); + v[10].set(-1,-3,0); + v[11].set(3,1,0); + buff->flush(); gBenchmarkProgram.bind(); @@ -983,7 +993,7 @@ F32 gpu_benchmark() { dest[i].bindTarget(); gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, source[i]); - buff->drawArrays(LLRender::TRIANGLES, 0, 3); + buff->drawArrays(LLRender::TRIANGLES, 0, 12); dest[i].flush(); } -- cgit v1.2.3 From de2fe42a5277d1c9609372ac395767ca976d94e7 Mon Sep 17 00:00:00 2001 From: Graham Linden Date: Mon, 17 Nov 2014 14:54:00 -0800 Subject: Attempt wider disable of using profile API when timer query is not present --- indra/newview/llglsandbox.cpp | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) (limited to 'indra/newview/llglsandbox.cpp') diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index 7cf17c90e9..687838a344 100755 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -920,7 +920,10 @@ F32 gpu_benchmark() //number of samples to take const S32 samples = 64; - LLGLSLShader::initProfile(); + if (gGLManager.mHasTimerQuery) + { + LLGLSLShader::initProfile(); + } LLRenderTarget dest[count]; U32 source[count]; @@ -977,15 +980,18 @@ F32 gpu_benchmark() buff->flush(); gBenchmarkProgram.bind(); - buff->setBuffer(LLVertexBuffer::MAP_VERTEX); - - //wait for any previoius GL commands to finish - glFinish(); bool busted_finish = false; + LL_INFOS() << "GPU BENCHMARK START." << LL_ENDL; + for (S32 c = -1; c < samples; ++c) { + buff->setBuffer(LLVertexBuffer::MAP_VERTEX); + glFinish(); + + LL_INFOS() << "GPU BENCHMARK ITERATION." << LL_ENDL; + LLTimer timer; timer.start(); @@ -1023,9 +1029,11 @@ F32 gpu_benchmark() if (!gGLManager.mHasTimerQuery && !busted_finish && gbps > 128.f) { //unrealistically high bandwidth for a card without timer queries, glFinish is probably ignored busted_finish = true; + LL_INFOS() << "GPU BENCHMARK DETECTED GL DRIVER WITH NOT SO MUCH WORKING glFinish." << LL_ENDL; } else { + LL_INFOS() << "GPU BENCHMARK ESTIMATE." << gbps << " Gbps" << LL_ENDL; results.push_back(gbps); } } @@ -1033,10 +1041,12 @@ F32 gpu_benchmark() gBenchmarkProgram.unbind(); - LLGLSLShader::finishProfile(false); - - LLImageGL::deleteTextures(count, source); + if (gGLManager.mHasTimerQuery) + { + LLGLSLShader::finishProfile(false); + } + LLImageGL::deleteTextures(count, source); std::sort(results.begin(), results.end()); -- cgit v1.2.3 From a882d7a02b9e8a58cdbfa945682a313718886ab4 Mon Sep 17 00:00:00 2001 From: Graham Linden Date: Tue, 18 Nov 2014 12:54:13 -0800 Subject: Fix for gpu_bench crash without parallels knock-on --- indra/newview/llglsandbox.cpp | 35 ++++++++++++----------------------- 1 file changed, 12 insertions(+), 23 deletions(-) (limited to 'indra/newview/llglsandbox.cpp') diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index 687838a344..08ec8031e8 100755 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -881,13 +881,14 @@ void LLViewerObjectList::renderObjectBeacons() F32 gpu_benchmark() { - if (!gGLManager.mHasShaderObjects) - { //don't bother benchmarking the fixed function + if (!gGLManager.mHasShaderObjects || !gGLManager.mHasTimerQuery) + { // don't bother benchmarking the fixed function + // or venerable drivers which don't support accurate timing anyway + // and are likely to be correctly identified by the GPU table already. return -1.f; } - - if (gBenchmarkProgram.mProgramObject == 0) + if (gBenchmarkProgram.mProgramObject == 0) { LLViewerShaderMgr::instance()->initAttribsAndUniforms(); @@ -983,15 +984,11 @@ F32 gpu_benchmark() bool busted_finish = false; - LL_INFOS() << "GPU BENCHMARK START." << LL_ENDL; - for (S32 c = -1; c < samples; ++c) { buff->setBuffer(LLVertexBuffer::MAP_VERTEX); glFinish(); - LL_INFOS() << "GPU BENCHMARK ITERATION." << LL_ENDL; - LLTimer timer; timer.start(); @@ -1029,11 +1026,10 @@ F32 gpu_benchmark() if (!gGLManager.mHasTimerQuery && !busted_finish && gbps > 128.f) { //unrealistically high bandwidth for a card without timer queries, glFinish is probably ignored busted_finish = true; - LL_INFOS() << "GPU BENCHMARK DETECTED GL DRIVER WITH NOT SO MUCH WORKING glFinish." << LL_ENDL; + LL_INFOS() << "GPU Benchmark detected GL driver with broken glFinish implementation. Neat." << LL_ENDL; } else { - LL_INFOS() << "GPU BENCHMARK ESTIMATE." << gbps << " Gbps" << LL_ENDL; results.push_back(gbps); } } @@ -1063,21 +1059,14 @@ F32 gpu_benchmark() } #endif - if (gGLManager.mHasTimerQuery) - { - F32 ms = gBenchmarkProgram.mTimeElapsed/1000000.f; - F32 seconds = ms/1000.f; + F32 ms = gBenchmarkProgram.mTimeElapsed/1000000.f; + F32 seconds = ms/1000.f; - F64 samples_drawn = res*res*count*samples; - F32 samples_sec = (samples_drawn/1000000000.0)/seconds; - gbps = samples_sec*8; + F64 samples_drawn = res*res*count*samples; + 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; - } - else - { - LL_INFOS() << "ARB_timer_query unavailable." << LL_ENDL; - } + LL_INFOS() << "Memory bandwidth is " << llformat("%.3f", gbps) << "GB/sec according to ARB_timer_query" << LL_ENDL; return gbps; } -- cgit v1.2.3 From a730187a5fb3624bd18327545a9f50f5b26599ba Mon Sep 17 00:00:00 2001 From: Graham Linden Date: Tue, 18 Nov 2014 15:28:29 -0800 Subject: Adjust gpu_bench thresholds and move VB set outside loop again for speed --- indra/newview/llglsandbox.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'indra/newview/llglsandbox.cpp') diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index 08ec8031e8..04429ddd75 100755 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -984,11 +984,11 @@ F32 gpu_benchmark() bool busted_finish = false; + buff->setBuffer(LLVertexBuffer::MAP_VERTEX); + glFinish(); + for (S32 c = -1; c < samples; ++c) { - buff->setBuffer(LLVertexBuffer::MAP_VERTEX); - glFinish(); - LLTimer timer; timer.start(); -- cgit v1.2.3 From aa49386c44b1379ee095a6e528b1a392a1c0e8da Mon Sep 17 00:00:00 2001 From: Graham Linden Date: Wed, 19 Nov 2014 11:28:04 -0800 Subject: Roll back changes to geo drawn in gpu_bench to stop punishing cards with low fill rate --- indra/newview/llglsandbox.cpp | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) (limited to 'indra/newview/llglsandbox.cpp') diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index 04429ddd75..cc43f787d8 100755 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -958,7 +958,7 @@ F32 gpu_benchmark() //make a dummy triangle to draw with LLPointer buff = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, GL_STATIC_DRAW_ARB); - buff->allocateBuffer(12, 0, true); + buff->allocateBuffer(3, 0, true); LLStrider v; LLStrider tc; @@ -968,15 +968,6 @@ F32 gpu_benchmark() v[0].set(-1,1,0); v[1].set(-1,-3,0); v[2].set(3,1,0); - v[3].set(-1,1,0); - v[4].set(-1,-3,0); - v[5].set(3,1,0); - v[6].set(-1,1,0); - v[7].set(-1,-3,0); - v[8].set(3,1,0); - v[9].set(-1,1,0); - v[10].set(-1,-3,0); - v[11].set(3,1,0); buff->flush(); @@ -996,7 +987,7 @@ F32 gpu_benchmark() { dest[i].bindTarget(); gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, source[i]); - buff->drawArrays(LLRender::TRIANGLES, 0, 12); + buff->drawArrays(LLRender::TRIANGLES, 0, 3); dest[i].flush(); } -- cgit v1.2.3 From cd4babf94b8d29efcf1a03a13bde0d44138dde7b Mon Sep 17 00:00:00 2001 From: Oz Linden Date: Mon, 1 Dec 2014 16:58:07 -0500 Subject: remove unused gpu table code, improve logging for gpu benchmarks --- indra/newview/llglsandbox.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'indra/newview/llglsandbox.cpp') diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index cc43f787d8..64f796e1fd 100755 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -1017,7 +1017,7 @@ F32 gpu_benchmark() if (!gGLManager.mHasTimerQuery && !busted_finish && gbps > 128.f) { //unrealistically high bandwidth for a card without timer queries, glFinish is probably ignored busted_finish = true; - LL_INFOS() << "GPU Benchmark detected GL driver with broken glFinish implementation. Neat." << LL_ENDL; + LL_WARNS() << "GPU Benchmark detected GL driver with broken glFinish implementation." << LL_ENDL; } else { @@ -1044,7 +1044,7 @@ F32 gpu_benchmark() #if LL_DARWIN if (gbps > 512.f) { - LL_INFOS() << "Memory bandwidth is improbably high and likely incorrect." << LL_ENDL; + LL_WARNS() << "Memory bandwidth is improbably high and likely incorrect; discarding result." << LL_ENDL; //OSX is probably lying, discard result gbps = -1.f; } -- cgit v1.2.3