summaryrefslogtreecommitdiff
path: root/indra/llrender
diff options
context:
space:
mode:
authorDave Parks <davep@lindenlab.com>2014-03-19 17:57:00 -0500
committerDave Parks <davep@lindenlab.com>2014-03-19 17:57:00 -0500
commit24f8745914f7cec320d707f36895ac393575b861 (patch)
tree463c9838c4415feb0f0d5311df75aaff7d847a9e /indra/llrender
parentcb2bd577099f87881d467249cac679200bb367f0 (diff)
MAINT-3131 Use benchmark to determine GPU class instead of GPU table.
Diffstat (limited to 'indra/llrender')
-rwxr-xr-xindra/llrender/llglslshader.cpp58
-rwxr-xr-xindra/llrender/llglslshader.h4
-rwxr-xr-xindra/llrender/llrendertarget.cpp1
-rwxr-xr-xindra/llrender/llshadermgr.cpp6
4 files changed, 47 insertions, 22 deletions
diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp
index 1c50a51d02..b99435f39e 100755
--- a/indra/llrender/llglslshader.cpp
+++ b/indra/llrender/llglslshader.cpp
@@ -87,6 +87,7 @@ LLShaderFeatures::LLShaderFeatures()
, mIndexedTextureChannels(0)
, disableTextureIndex(false)
, hasAlphaMask(false)
+ , attachNothing(false)
{
}
@@ -119,28 +120,31 @@ struct LLGLSLShaderCompareTimeElapsed
};
//static
-void LLGLSLShader::finishProfile()
+void LLGLSLShader::finishProfile(bool emit_report)
{
sProfileEnabled = false;
- std::vector<LLGLSLShader*> sorted;
-
- for (std::set<LLGLSLShader*>::iterator iter = sInstances.begin(); iter != sInstances.end(); ++iter)
+ if (emit_report)
{
- sorted.push_back(*iter);
- }
+ std::vector<LLGLSLShader*> sorted;
- std::sort(sorted.begin(), sorted.end(), LLGLSLShaderCompareTimeElapsed());
+ for (std::set<LLGLSLShader*>::iterator iter = sInstances.begin(); iter != sInstances.end(); ++iter)
+ {
+ sorted.push_back(*iter);
+ }
- for (std::vector<LLGLSLShader*>::iterator iter = sorted.begin(); iter != sorted.end(); ++iter)
- {
- (*iter)->dumpStats();
- }
+ std::sort(sorted.begin(), sorted.end(), LLGLSLShaderCompareTimeElapsed());
- llinfos << "-----------------------------------" << llendl;
- llinfos << "Total rendering time: " << llformat("%.4f ms", sTotalTimeElapsed/1000000.f) << llendl;
- llinfos << "Total samples drawn: " << llformat("%.4f million", sTotalSamplesDrawn/1000000.f) << llendl;
- llinfos << "Total triangles drawn: " << llformat("%.3f million", sTotalTrianglesDrawn/1000000.f) << llendl;
+ for (std::vector<LLGLSLShader*>::iterator iter = sorted.begin(); iter != sorted.end(); ++iter)
+ {
+ (*iter)->dumpStats();
+ }
+
+ llinfos << "-----------------------------------" << llendl;
+ llinfos << "Total rendering time: " << llformat("%.4f ms", sTotalTimeElapsed/1000000.f) << llendl;
+ llinfos << "Total samples drawn: " << llformat("%.4f million", sTotalSamplesDrawn/1000000.f) << llendl;
+ llinfos << "Total triangles drawn: " << llformat("%.3f million", sTotalTrianglesDrawn/1000000.f) << llendl;
+ }
}
void LLGLSLShader::clearStats()
@@ -175,7 +179,7 @@ void LLGLSLShader::dumpStats()
}
}
llinfos << "=============================================" << llendl;
-
+
F32 ms = mTimeElapsed/1000000.f;
F32 seconds = ms/1000.f;
@@ -221,6 +225,7 @@ void LLGLSLShader::placeProfileQuery()
#if !LL_DARWIN
if (mTimerQuery == 0)
{
+ glGenQueriesARB(1, &mSamplesQuery);
glGenQueriesARB(1, &mTimerQuery);
}
@@ -257,7 +262,7 @@ void LLGLSLShader::placeProfileQuery()
}
- glBeginQueryARB(GL_SAMPLES_PASSED, 1);
+ glBeginQueryARB(GL_SAMPLES_PASSED, mSamplesQuery);
glBeginQueryARB(GL_TIME_ELAPSED, mTimerQuery);
#endif
}
@@ -272,7 +277,7 @@ void LLGLSLShader::readProfileQuery(U32 count, U32 mode)
glGetQueryObjectui64v(mTimerQuery, GL_QUERY_RESULT, &time_elapsed);
U64 samples_passed = 0;
- glGetQueryObjectui64v(1, GL_QUERY_RESULT, &samples_passed);
+ glGetQueryObjectui64v(mSamplesQuery, GL_QUERY_RESULT, &samples_passed);
sTotalTimeElapsed += time_elapsed;
mTimeElapsed += time_elapsed;
@@ -307,14 +312,15 @@ LLGLSLShader::LLGLSLShader()
mShaderLevel(0),
mShaderGroup(SG_DEFAULT),
mUniformsDirty(FALSE),
- mTimerQuery(0)
+ mTimerQuery(0),
+ mSamplesQuery(0)
+
{
}
LLGLSLShader::~LLGLSLShader()
{
-
}
void LLGLSLShader::unload()
@@ -349,6 +355,18 @@ void LLGLSLShader::unload()
mProgramObject = 0;
}
+ if (mTimerQuery)
+ {
+ glDeleteQueriesARB(1, &mTimerQuery);
+ mTimerQuery = 0;
+ }
+
+ if (mSamplesQuery)
+ {
+ glDeleteQueriesARB(1, &mSamplesQuery);
+ mSamplesQuery = 0;
+ }
+
//hack to make apple not complain
glGetError();
diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h
index 7b2f5f04c2..5abddf274b 100755
--- a/indra/llrender/llglslshader.h
+++ b/indra/llrender/llglslshader.h
@@ -51,6 +51,7 @@ public:
S32 mIndexedTextureChannels;
bool disableTextureIndex;
bool hasAlphaMask;
+ bool attachNothing;
// char numLights;
@@ -80,7 +81,7 @@ public:
static bool sNoFixedFunction;
static void initProfile();
- static void finishProfile();
+ static void finishProfile(bool emit_report = true);
static void startProfile();
static void stopProfile(U32 count, U32 mode);
@@ -184,6 +185,7 @@ public:
//statistcis for profiling shader performance
U32 mTimerQuery;
+ U32 mSamplesQuery;
U64 mTimeElapsed;
static U64 sTotalTimeElapsed;
U32 mTrianglesDrawn;
diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp
index fe8110904d..33ef831cb4 100755
--- a/indra/llrender/llrendertarget.cpp
+++ b/indra/llrender/llrendertarget.cpp
@@ -388,6 +388,7 @@ void LLRenderTarget::release()
//
if (mFBO && (mTex.size() > 1))
{
+ glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
S32 z;
for (z = mTex.size() - 1; z >= 1; z--)
{
diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp
index 6e04fc82df..b81ae9af09 100755
--- a/indra/llrender/llshadermgr.cpp
+++ b/indra/llrender/llshadermgr.cpp
@@ -73,7 +73,11 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
{
llassert_always(shader != NULL);
LLShaderFeatures *features = & shader->mFeatures;
-
+
+ if (features->attachNothing)
+ {
+ return TRUE;
+ }
//////////////////////////////////////
// Attach Vertex Shader Features First
//////////////////////////////////////