From 18e5b9461508ec9f1e165ab6e8612fa88193fa9e Mon Sep 17 00:00:00 2001 From: Shyotl Date: Mon, 17 Oct 2011 12:12:47 -0500 Subject: [PATCH 1/8] Shouldn't need this glFinish as SwapBuffers does the same thing. --- indra/llwindow/llwindowwin32.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 68162447f..c13ea7086 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -2919,7 +2919,6 @@ BOOL LLWindowWin32::resetDisplayResolution() void LLWindowWin32::swapBuffers() { - glFinish(); SwapBuffers(mhDC); } From 06048ae8180399e299e3df62c60aa9f1cce962dc Mon Sep 17 00:00:00 2001 From: Shyotl Date: Mon, 17 Oct 2011 12:16:57 -0500 Subject: [PATCH 2/8] Fixed avatars being invisible when using legacy path. Assumption of no shader use when LLGLSLShader::sNoFixedFunctionis false is not valid with Singularity. --- indra/newview/lldrawpoolavatar.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 4de0b48c8..14b2e20f9 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -826,7 +826,8 @@ void LLDrawPoolAvatar::beginSkinned() } } - if (LLGLSLShader::sNoFixedFunction) + //if (LLGLSLShader::sNoFixedFunction) //Singu Note: sNoFixedFunction being false does not imply shaders are off, unlike in V3. + if (gPipeline.canUseVertexShaders()) //Check if shaders are REALLY used. { sVertexProgram->setAlphaRange(0.2f, 1.f); } From d1b19aa389df5e13093faa08b2c9e5fa27b60af3 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Mon, 17 Oct 2011 12:19:43 -0500 Subject: [PATCH 3/8] Automatically disable new texture batching when using legacy renderpath. --- indra/llrender/llglslshader.cpp | 3 ++- indra/newview/llviewershadermgr.cpp | 3 ++- indra/newview/llvovolume.cpp | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index d84158342..4490f87be 100644 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -133,7 +133,8 @@ BOOL LLGLSLShader::createShader(vector * attributes, mProgramObject = glCreateProgramObjectARB(); static const LLCachedControl no_texture_indexing("ShyotlUseLegacyTextureBatching",false); - if (gGLManager.mGLVersion < 3.1f || no_texture_indexing) + static const LLCachedControl use_legacy_path("ShyotlUseLegacyRenderPath", false); //Legacy does not jive with new batching. + if (gGLManager.mGLVersion < 3.1f || no_texture_indexing || use_legacy_path) { //force indexed texture channels to 1 if GL version is old (performance improvement for drivers with poor branching shader model support) mFeatures.mIndexedTextureChannels = llmin(mFeatures.mIndexedTextureChannels, 1); } diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index f7f860385..f4a84fb2a 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -655,7 +655,8 @@ BOOL LLViewerShaderMgr::loadBasicShaders() S32 ch = gGLManager.mNumTextureImageUnits-1; static const LLCachedControl no_texture_indexing("ShyotlUseLegacyTextureBatching",false); - if (gGLManager.mGLVersion < 3.1f || no_texture_indexing) + static const LLCachedControl use_legacy_path("ShyotlUseLegacyRenderPath", false); //Legacy does not jive with new batching. + if (gGLManager.mGLVersion < 3.1f || no_texture_indexing || use_legacy_path) { //force to 1 texture index channel for old drivers ch = 1; } diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 9029a8188..f07c9c37d 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -3927,7 +3927,8 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: S32 texture_index_channels = gGLManager.mNumTextureImageUnits-1; //always reserve one for shiny for now just for simplicity static const LLCachedControl no_texture_indexing("ShyotlUseLegacyTextureBatching",false); - if (gGLManager.mGLVersion < 3.1f || no_texture_indexing) + static const LLCachedControl use_legacy_path("ShyotlUseLegacyRenderPath", false); //Legacy does not jive with new batching. + if (gGLManager.mGLVersion < 3.1f || no_texture_indexing || use_legacy_path) { texture_index_channels = 1; } From c413d62536b508f90fc2430dec976321d53ef508 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Mon, 17 Oct 2011 14:11:10 -0500 Subject: [PATCH 4/8] Decouple RenderUseFBO from RenderDeferred, as toggling deferred would leave RenderUseFBO enabled regardless of previous setting. --- indra/newview/llappviewer.cpp | 3 ++- indra/newview/llviewercontrol.cpp | 29 +++++++++++++++++++++++------ indra/newview/llviewershadermgr.cpp | 3 --- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 8e2d9f0b1..5dd38f79a 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -495,7 +495,8 @@ static void settings_to_globals() static void settings_modify() { - LLRenderTarget::sUseFBO = gSavedSettings.getBOOL("RenderUseFBO"); + bool can_defer = LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred"); + LLRenderTarget::sUseFBO = gSavedSettings.getBOOL("RenderUseFBO") || (gSavedSettings.getBOOL("RenderDeferred") && can_defer); LLVOAvatar::sUseImpostors = gSavedSettings.getBOOL("RenderUseImpostors"); LLVOSurfacePatch::sLODFactor = gSavedSettings.getF32("RenderTerrainLODFactor"); LLVOSurfacePatch::sLODFactor *= LLVOSurfacePatch::sLODFactor; //square lod factor to get exponential range of [1,4] diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index b5a78b01d..54ccb94dc 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -445,17 +445,34 @@ static bool handleRenderLocalLightsChanged(const LLSD& newvalue) return true; } +static bool handleRenderDeferredChanged(const LLSD& newvalue) +{ + bool can_defer = LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred"); + bool old_deferred = !newvalue.asBoolean() && can_defer; + LLRenderTarget::sUseFBO = (newvalue.asBoolean() && can_defer) || gSavedSettings.getBOOL("RenderUseFBO"); + if (gPipeline.isInit()) + { + gPipeline.updateRenderDeferred(); + gPipeline.releaseGLBuffers(); + gPipeline.createGLBuffers(); + gPipeline.resetVertexBuffers(); + if (old_deferred != newvalue.asBoolean()) + { + LLViewerShaderMgr::instance()->setShaders(); + } + } + return true; +} + static bool handleRenderUseFBOChanged(const LLSD& newvalue) { - LLRenderTarget::sUseFBO = newvalue.asBoolean(); + bool can_defer = LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred"); + LLRenderTarget::sUseFBO = newvalue.asBoolean() || (gSavedSettings.getBOOL("RenderDeferred") && can_defer); if (gPipeline.isInit()) { gPipeline.releaseGLBuffers(); gPipeline.createGLBuffers(); - if (LLPipeline::sRenderDeferred && LLRenderTarget::sUseFBO) - { - LLViewerShaderMgr::instance()->setShaders(); - } + gPipeline.resetVertexBuffers(); } return true; } @@ -682,7 +699,7 @@ void settings_setup_listeners() gSavedSettings.getControl("RenderDebugGL")->getSignal()->connect(boost::bind(&handleRenderDebugGLChanged, _2)); gSavedSettings.getControl("RenderDebugPipeline")->getSignal()->connect(boost::bind(&handleRenderDebugPipelineChanged, _2)); gSavedSettings.getControl("RenderResolutionDivisor")->getSignal()->connect(boost::bind(&handleRenderResolutionDivisorChanged, _2)); - gSavedSettings.getControl("RenderDeferred")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); + gSavedSettings.getControl("RenderDeferred")->getSignal()->connect(boost::bind(&handleRenderDeferredChanged, _2)); gSavedSettings.getControl("RenderShadowDetail")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); gSavedSettings.getControl("RenderDeferredSSAO")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); gSavedSettings.getControl("RenderDeferredGI")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index f4a84fb2a..4bc79c3f3 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -426,9 +426,6 @@ void LLViewerShaderMgr::setShaders() deferred_class = 1; } - //make sure framebuffer objects are enabled - gSavedSettings.setBOOL("RenderUseFBO", TRUE); - //make sure hardware skinning is enabled gSavedSettings.setBOOL("RenderAvatarVP", TRUE); } From 67230a3290f6b89962480a2806ddd05b86000ed0 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Mon, 17 Oct 2011 14:11:30 -0500 Subject: [PATCH 5/8] Line-ending fixup. --- indra/newview/llstartup.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index ba88d237a..11e310cb9 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -372,7 +372,7 @@ bool idle_startup() static U64 first_sim_handle = 0; static LLHost first_sim; static std::string first_sim_seed_cap; - static U32 first_sim_size_x = 256; + static U32 first_sim_size_x = 256; static U32 first_sim_size_y = 256; static LLVector3 initial_sun_direction(1.f, 0.f, 0.f); From 8ce30e9ff7cabc0aa04cb031c7d7a4acd10cbebf Mon Sep 17 00:00:00 2001 From: Shyotl Date: Mon, 17 Oct 2011 19:05:37 -0500 Subject: [PATCH 6/8] Fixed a crash for hardware lacking ARB_shader_objects extension support. --- indra/llrender/llglslshader.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index 4490f87be..d54bdffb2 100644 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -445,9 +445,12 @@ void LLGLSLShader::unbind() void LLGLSLShader::bindNoShader(void) { - glUseProgramObjectARB(0); - sCurBoundShader = 0; - sCurBoundShaderPtr = NULL; + if (gGLManager.mHasShaderObjects) + { + glUseProgramObjectARB(0); + sCurBoundShader = 0; + sCurBoundShaderPtr = NULL; + } } S32 LLGLSLShader::enableTexture(S32 uniform, LLTexUnit::eTextureType mode) From 58ea5f88dce10a8db1532db90878337c16b25807 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Mon, 17 Oct 2011 19:06:22 -0500 Subject: [PATCH 7/8] Spew llinfos for opengl procs that aren't found. --- indra/llrender/llgl.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index 40baf7b33..712582540 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -68,6 +68,16 @@ BOOL gGLActive = FALSE; std::ofstream gFailLog; +void* gl_get_proc_address(const char *pStr) +{ + void* pPtr = (void*)GLH_EXT_GET_PROC_ADDRESS(pStr); + if(!pPtr) + llinfos << "Failed to find symbol '" << pStr << "'" << llendl; + return pPtr; +} +#undef GLH_EXT_GET_PROC_ADDRESS +#define GLH_EXT_GET_PROC_ADDRESS(p) gl_get_proc_address(p) + void ll_init_fail_log(std::string filename) { gFailLog.open(filename.c_str()); From 4446b0fbadad6841f185d95fb8789aed78f36e83 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Mon, 17 Oct 2011 19:19:36 -0500 Subject: [PATCH 8/8] Give each reserved attribute a consistent index across all shaders. --- indra/llrender/llglslshader.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index d54bdffb2..5645c9061 100644 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -38,6 +38,7 @@ #include "llfile.h" #include "llrender.h" #include "llcontrol.h" +#include "llvertexbuffer.h" #if LL_DARWIN #include "OpenGL/OpenGL.h" @@ -260,6 +261,13 @@ void LLGLSLShader::attachObjects(GLhandleARB* objects, S32 count) BOOL LLGLSLShader::mapAttributes(const vector * attributes) { + //before linking, make sure reserved attributes always have consistent locations + for (U32 i = 0; i < LLShaderMgr::instance()->mReservedAttribs.size(); i++) + { + const char* name = LLShaderMgr::instance()->mReservedAttribs[i].c_str(); + glBindAttribLocationARB(mProgramObject, i, (const GLcharARB *) name); + } + //link the program BOOL res = link(); @@ -333,7 +341,7 @@ void LLGLSLShader::mapUniform(GLint index, const vector * uniforms) for (S32 i = 0; i < (S32) LLShaderMgr::instance()->mReservedUniforms.size(); i++) { if ( (mUniform[i] == -1) - && (LLShaderMgr::instance()->mReservedUniforms[i].compare(0, length, name, LLShaderMgr::instance()->mReservedUniforms[i].length()) == 0)) + && (LLShaderMgr::instance()->mReservedUniforms[i] == name)) { //found it mUniform[i] = location; @@ -347,7 +355,7 @@ void LLGLSLShader::mapUniform(GLint index, const vector * uniforms) for (U32 i = 0; i < uniforms->size(); i++) { if ( (mUniform[i+LLShaderMgr::instance()->mReservedUniforms.size()] == -1) - && ((*uniforms)[i].compare(0, length, name, (*uniforms)[i].length()) == 0)) + && ((*uniforms)[i] == name)) { //found it mUniform[i+LLShaderMgr::instance()->mReservedUniforms.size()] = location; @@ -411,6 +419,7 @@ void LLGLSLShader::bind() gGL.flush(); if (gGLManager.mHasShaderObjects) { + LLVertexBuffer::unbind(); glUseProgramObjectARB(mProgramObject); sCurBoundShader = mProgramObject; sCurBoundShaderPtr = this; @@ -436,6 +445,7 @@ void LLGLSLShader::unbind() stop_glerror(); } } + LLVertexBuffer::unbind(); glUseProgramObjectARB(0); sCurBoundShader = 0; sCurBoundShaderPtr = NULL; @@ -445,6 +455,7 @@ void LLGLSLShader::unbind() void LLGLSLShader::bindNoShader(void) { + LLVertexBuffer::unbind(); if (gGLManager.mHasShaderObjects) { glUseProgramObjectARB(0);