From 75b31b415156383b38c4d80536027c0e18de2bf7 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Thu, 8 May 2014 16:24:24 -0500 Subject: [PATCH 01/23] Fix a nullptr usage. --- indra/newview/lldrawpoolalpha.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index 3d88b34ca..457620d96 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -446,7 +446,7 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask, S32 pass) llassert_always(!LLGLSLShader::sCurBoundShaderPtr); bool fullbright = depth_only || params.mFullbright; - if(fullbright == light_enabled || !initialized_lighting) + if(fullbright == !!light_enabled || !initialized_lighting) { light_enabled = !fullbright; initialized_lighting = true; @@ -536,7 +536,7 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask, S32 pass) if (params.mTexture.notNull()) { params.mTexture->addTextureStats(params.mVSize); - if (mat) + if (use_shaders && mat && current_shader) { current_shader->bindTexture(LLShaderMgr::DIFFUSE_MAP, params.mTexture); } From e2a0f801b9776a66ac12796e32aef4070d259a6a Mon Sep 17 00:00:00 2001 From: Shyotl Date: Thu, 8 May 2014 16:29:53 -0500 Subject: [PATCH 02/23] Have LLRender::color4ub fall back to uniform if bound vbo lacks color attribute. Fixed fixed-function call in LLFacePool::LLOverrideFaceColor::setColor. --- indra/llrender/llrender.cpp | 10 +++++++++- indra/newview/lldrawpool.cpp | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index 85c5a0cb5..3eae47b8a 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -2199,7 +2199,15 @@ void LLRender::texCoord2fv(const GLfloat* tc) void LLRender::color4ub(const GLubyte& r, const GLubyte& g, const GLubyte& b, const GLubyte& a) { - mColorsp[mCount] = LLColor4U(r,g,b,a); + if (!LLGLSLShader::sCurBoundShaderPtr || + LLGLSLShader::sCurBoundShaderPtr->mAttributeMask & LLVertexBuffer::MAP_COLOR) + { + mColorsp[mCount] = LLColor4U(r,g,b,a); + } + else + { //not using shaders or shader reads color from a uniform + diffuseColor4ub(r,g,b,a); + } } void LLRender::color4ubv(const GLubyte* c) { diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp index a2aa5abbf..90701c0f4 100644 --- a/indra/newview/lldrawpool.cpp +++ b/indra/newview/lldrawpool.cpp @@ -356,7 +356,7 @@ void LLFacePool::LLOverrideFaceColor::setColor(const LLColor4& color) void LLFacePool::LLOverrideFaceColor::setColor(const LLColor4U& color) { - glColor4ubv(color.mV); + gGL.diffuseColor4ubv(color.mV); } void LLFacePool::LLOverrideFaceColor::setColor(F32 r, F32 g, F32 b, F32 a) From 7e8e8bdb26f6a1babd286aaee5cff61f87e34b31 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Thu, 8 May 2014 16:35:12 -0500 Subject: [PATCH 03/23] Disable some diagnostic gunk eating memory. --- indra/llrender/llimagegl.cpp | 6 +++--- indra/newview/llviewerwindow.cpp | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index ce95d9c69..725d661cf 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -1776,7 +1776,7 @@ void LLImageGL::calcAlphaChannelOffsetAndStride() } } -std::map > > sTextureMaskMap; +//std::map > > sTextureMaskMap; void LLImageGL::analyzeAlpha(const void* data_in, U32 w, U32 h) { if(!mNeedsAlphaAndPickMask || !mCanMask) @@ -1897,7 +1897,7 @@ void LLImageGL::analyzeAlpha(const void* data_in, U32 w, U32 h) mMaskRMSE = sqrt(sum)/255.0; - std::list > &data = sTextureMaskMap[getTexName()]; + /*std::list > &data = sTextureMaskMap[getTexName()]; data.clear(); data.push_back(std::make_pair("RMSE", llformat("%f",mMaskRMSE))); data.push_back(std::make_pair(" sum", llformat("%lf",sum))); @@ -1908,7 +1908,7 @@ void LLImageGL::analyzeAlpha(const void* data_in, U32 w, U32 h) data.push_back(std::make_pair(" stride", llformat("%i",S32(mAlphaOffset)))); data.push_back(std::make_pair(" split", llformat("%u|%u|%u",lowerhalftotal,midrangetotal,upperhalftotal))); data.push_back(std::make_pair(" alphatotal", llformat("%u",alphatotal))); - data.push_back(std::make_pair(" alphatotal/48", llformat("%u",length/48))); + data.push_back(std::make_pair(" alphatotal/48", llformat("%u",length/48)));*/ } diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index f0b74c6e1..69be5d90d 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -259,7 +259,7 @@ extern void toggle_debug_menus(void*); // LLDebugText // -extern std::map > > sTextureMaskMap; +//extern std::map > > sTextureMaskMap; class LLDebugText { @@ -356,7 +356,7 @@ public: LLViewerTexture* imagep = obj->getTEImage(te); if(imagep && imagep != (LLViewerTexture*)LLViewerFetchedTexture::sDefaultImagep.get()) { - LLGLuint tex = imagep->getTexName(); + /*LLGLuint tex = imagep->getTexName(); std::map > >::iterator it = sTextureMaskMap.find(tex); if(it != sTextureMaskMap.end()) { @@ -365,7 +365,7 @@ public: { addText(xpos, ypos, llformat(" %s: %s", it2->first.c_str(), it2->second.c_str())); ypos += y_inc; } - } + }*/ static const LLCachedControl use_rmse_auto_mask("SHUseRMSEAutoMask",false); static const LLCachedControl auto_mask_max_rmse("SHAutoMaskMaxRMSE",.09f); addText(xpos, ypos, llformat("Mask: %s", imagep->getIsAlphaMask(use_rmse_auto_mask ? auto_mask_max_rmse : -1.f) ? "TRUE":"FALSE")); ypos += y_inc; From 98f9a09b3921bb0cd79386923ebccdb383a98d08 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Thu, 8 May 2014 16:39:41 -0500 Subject: [PATCH 04/23] sunlight_color_copy need only be vec3. --- indra/llrender/llrender.cpp | 2 +- .../shaders/class1/windlight/atmosphericsHelpersV.glsl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index 3eae47b8a..2439c75e6 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -1169,7 +1169,7 @@ void LLRender::syncLightState() shader->uniform3fv(LLShaderMgr::LIGHT_DIFFUSE, 8, diffuse[0].mV); shader->uniform4fv(LLShaderMgr::LIGHT_AMBIENT, 1, mAmbientLightColor.mV); //HACK -- duplicate sunlight color for compatibility with drivers that can't deal with multiple shader objects referencing the same uniform - shader->uniform4fv(LLShaderMgr::SUNLIGHT_COLOR, 1, diffuse[0].mV); + shader->uniform3fv(LLShaderMgr::SUNLIGHT_COLOR, 1, diffuse[0].mV); } } diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl index 6ff860362..1e5ede6c0 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsHelpersV.glsl @@ -23,7 +23,7 @@ * $/LicenseInfo$ */ -uniform vec4 sunlight_color_copy; +uniform vec3 sunlight_color_copy; uniform vec4 light_ambient; vec3 atmosAmbient(vec3 light) From 117eca3c98b3a95905906453a2530d5022b7ce0b Mon Sep 17 00:00:00 2001 From: Shyotl Date: Wed, 14 May 2014 03:05:53 -0500 Subject: [PATCH 05/23] Try some swizzling instead of forcing everything to rgba8 with core profile. Avoids manual conversions with scratch buffers. Works for all pixel datatypes. Cleaner. Uses less vram. Also, fixed textures when running core pofile. --- indra/llrender/llimagegl.cpp | 107 +++++++++------------------- indra/llrender/llpostprocess.cpp | 6 +- indra/newview/lldrawpoolterrain.cpp | 8 +-- 3 files changed, 40 insertions(+), 81 deletions(-) diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index 725d661cf..f6ea462d1 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -235,6 +235,8 @@ S32 LLImageGL::dataFormatBits(S32 dataformat) case GL_ALPHA: return 8; case GL_COLOR_INDEX: return 8; case GL_LUMINANCE_ALPHA: return 16; + case GL_RED: return 8; + case GL_RG: return 16; case GL_RGB: return 24; case GL_RGB8: return 24; case GL_RGBA: return 32; @@ -271,6 +273,8 @@ S32 LLImageGL::dataFormatComponents(S32 dataformat) case GL_ALPHA: return 1; case GL_COLOR_INDEX: return 1; case GL_LUMINANCE_ALPHA: return 2; + case GL_RED: return 1; + case GL_RG: return 2; case GL_RGB: return 3; case GL_RGBA: return 4; case GL_BGRA: return 4; // Used for QuickTime media textures on the Mac @@ -811,6 +815,12 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips) glPixelStorei(GL_UNPACK_SWAP_BYTES, 0); stop_glerror(); } + + if (LLRender::sGLCoreProfile) + { + glGenerateMipmap(mTarget); + } + stop_glerror(); } } else @@ -1078,91 +1088,47 @@ static LLFastTimer::DeclareTimer FTM_SET_MANUAL_IMAGE("setManualImage"); void LLImageGL::setManualImage(U32 target, S32 miplevel, S32 intformat, S32 width, S32 height, U32 pixformat, U32 pixtype, const void *pixels, bool allow_compression) { LLFastTimer t(FTM_SET_MANUAL_IMAGE); - bool use_scratch = false; - U32* scratch = NULL; if (LLRender::sGLCoreProfile) { - if (pixformat == GL_ALPHA && pixtype == GL_UNSIGNED_BYTE) + if (pixformat == GL_ALPHA) { //GL_ALPHA is deprecated, convert to RGBA - use_scratch = true; - scratch = new U32[width*height]; - - U32 pixel_count = (U32) (width*height); - for (U32 i = 0; i < pixel_count; i++) - { - U8* pix = (U8*) &scratch[i]; - pix[0] = pix[1] = pix[2] = 0; - pix[3] = ((U8*) pixels)[i]; - } - - pixformat = GL_RGBA; - intformat = GL_RGBA8; + const GLint mask[] = {GL_ZERO, GL_ZERO, GL_ZERO, GL_RED}; + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, mask); + pixformat = GL_RED; + intformat = GL_R8; } - if (pixformat == GL_LUMINANCE && pixtype == GL_UNSIGNED_BYTE) + if (pixformat == GL_LUMINANCE) { //GL_LUMINANCE is deprecated, convert to GL_RGBA - use_scratch = true; - scratch = new U32[width*height]; - - U32 pixel_count = (U32) (width*height); - for (U32 i = 0; i < pixel_count; i++) - { - U8 lum = ((U8*) pixels)[i]; - - U8* pix = (U8*) &scratch[i]; - pix[0] = pix[1] = pix[2] = lum; - pix[3] = 1.f; - } - - pixformat = GL_RGBA; - intformat = GL_RGBA8; + const GLint mask[] = {GL_RED, GL_RED, GL_RED, GL_ONE}; + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, mask); + pixformat = GL_RED; + intformat = GL_R8; } - - if (pixformat == GL_LUMINANCE_ALPHA && pixtype == GL_UNSIGNED_BYTE) + if (pixformat == GL_LUMINANCE_ALPHA) { //GL_LUMINANCE_ALPHA is deprecated, convert to RGBA - use_scratch = true; - scratch = new U32[width*height]; - - U32 pixel_count = (U32) (width*height); - for (U32 i = 0; i < pixel_count; i++) - { - U8 lum = ((U8*) pixels)[i*2+0]; - U8 alpha = ((U8*) pixels)[i*2+1]; - - U8* pix = (U8*) &scratch[i]; - pix[0] = pix[1] = pix[2] = lum; - pix[3] = alpha; - } - - pixformat = GL_RGBA; - intformat = GL_RGBA8; + const GLint mask[] = {GL_RED, GL_RED, GL_RED, GL_GREEN}; + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, mask); + pixformat = GL_RG; + intformat = GL_RG8; } - if (pixformat == GL_LUMINANCE && pixtype == GL_UNSIGNED_BYTE) - { //GL_LUMINANCE_ALPHA is deprecated, convert to RGB - use_scratch = true; - scratch = new U32[width*height]; - U32 pixel_count = (U32) (width*height); - for (U32 i = 0; i < pixel_count; i++) - { - U8 lum = ((U8*) pixels)[i]; - - U8* pix = (U8*) &scratch[i]; - pix[0] = pix[1] = pix[2] = lum; - pix[3] = 255; - } - - pixformat = GL_RGBA; - intformat = GL_RGB8; - } } if (LLImageGL::sCompressTextures && allow_compression) { switch (intformat) { + case GL_RED: + case GL_R8: + intformat = GL_COMPRESSED_RED; + break; + case GL_RG: + case GL_RG8: + intformat = GL_COMPRESSED_RG; + break; case GL_RGB: case GL_RGB8: intformat = GL_COMPRESSED_RGB; @@ -1190,13 +1156,8 @@ void LLImageGL::setManualImage(U32 target, S32 miplevel, S32 intformat, S32 widt } stop_glerror(); - glTexImage2D(target, miplevel, intformat, width, height, 0, pixformat, pixtype, use_scratch ? scratch : pixels); + glTexImage2D(target, miplevel, intformat, width, height, 0, pixformat, pixtype, pixels); stop_glerror(); - - if (use_scratch) - { - delete [] scratch; - } } //create an empty GL texture: just create a texture name diff --git a/indra/llrender/llpostprocess.cpp b/indra/llrender/llpostprocess.cpp index 236adebbf..ebdbc17ef 100644 --- a/indra/llrender/llpostprocess.cpp +++ b/indra/llrender/llpostprocess.cpp @@ -471,10 +471,8 @@ void LLPostProcess::createNoiseTexture() gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mNoiseTexture); stop_glerror(); - if(gGLManager.mGLVersion >= 4.f) - LLImageGL::setManualImage(GL_TEXTURE_2D, 0, GL_R8, NOISE_SIZE, NOISE_SIZE, GL_RED, GL_UNSIGNED_BYTE, &buffer[0], false); - else - LLImageGL::setManualImage(GL_TEXTURE_2D, 0, GL_LUMINANCE8, NOISE_SIZE, NOISE_SIZE, GL_LUMINANCE, GL_UNSIGNED_BYTE, &buffer[0], false); + LLImageGL::setManualImage(GL_TEXTURE_2D, 0, GL_LUMINANCE8, NOISE_SIZE, NOISE_SIZE, GL_LUMINANCE, GL_UNSIGNED_BYTE, &buffer[0], false); + stop_glerror(); gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR); gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_WRAP); diff --git a/indra/newview/lldrawpoolterrain.cpp b/indra/newview/lldrawpoolterrain.cpp index 478374ee7..eb2738078 100644 --- a/indra/newview/lldrawpoolterrain.cpp +++ b/indra/newview/lldrawpoolterrain.cpp @@ -68,8 +68,8 @@ LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerTexture *texturep) : LLFacePool(POOL_TERRAIN), mTexturep(texturep) { - U32 format = GL_ALPHA8; - U32 int_format = GL_ALPHA; + U32 format = GL_ALPHA; + U32 int_format = GL_ALPHA8; // Hack! sDetailScale = 1.f/gSavedSettings.getF32("RenderTerrainScale"); @@ -77,7 +77,7 @@ LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerTexture *texturep) : mAlphaRampImagep = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient.tga", TRUE, LLGLTexture::BOOST_UI, LLViewerTexture::FETCHED_TEXTURE, - format, int_format, + int_format, format, LLUUID("e97cf410-8e61-7005-ec06-629eba4cd1fb")); //gGL.getTexUnit(0)->bind(mAlphaRampImagep.get()); @@ -86,7 +86,7 @@ LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerTexture *texturep) : m2DAlphaRampImagep = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient_2d.j2c", TRUE, LLGLTexture::BOOST_UI, LLViewerTexture::FETCHED_TEXTURE, - format, int_format, + int_format, format, LLUUID("38b86f85-2575-52a9-a531-23108d8da837")); //gGL.getTexUnit(0)->bind(m2DAlphaRampImagep.get()); From 22bcf83cb9e58b99acb92470edf07c5204c0ec2a Mon Sep 17 00:00:00 2001 From: Shyotl Date: Wed, 14 May 2014 03:10:34 -0500 Subject: [PATCH 06/23] Toyed with gl init ordering. Fixes adaptive vsync. May explode on linux, not that adaptive vsync works there, but it should in theory work there if we ever port to sdl2. If it does explode, I'll know shortly... probably. --- indra/llwindow/llwindowsdl.cpp | 20 +++++--------------- indra/llwindow/llwindowwin32.cpp | 2 +- indra/newview/llviewerwindow.cpp | 4 ---- 3 files changed, 6 insertions(+), 20 deletions(-) diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index 923b29be7..37eeff76a 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -235,8 +235,6 @@ LLWindowSDL::LLWindowSDL(LLWindowCallbacks* callbacks, // Create the GL context and set it up for windowed or fullscreen, as appropriate. if(createContext(x, y, width, height, 32, fullscreen, vsync_mode)) { - gGLManager.initGL(); - //start with arrow cursor initCursors(); setCursor( UI_CURSOR_ARROW ); @@ -721,9 +719,11 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B } #endif // LL_X11 + gGLManager.initGL(); + #if SDL_VERSION_ATLEAST(1,3,0) // Disable vertical sync for swap - if (vsync_mode == 0) + if (vsync_mode == 0 || (!gGLManager.mHasAdaptiveVsync && vsync_mode == -1)) { LL_DEBUGS("Window") << "Disabling vertical sync" << LL_ENDL; SDL_GL_SetSwapInterval(0); @@ -744,25 +744,17 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B } #else // SDL_VERSION_ATLEAST(1,3,0) #ifdef SDL_GL_SWAP_CONTROL - if (vsync_mode == 0) + if (vsync_mode <= 0) { LL_DEBUGS("Window") << "Disabling vertical sync" << LL_ENDL; SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 0); } - else if(vsync_mode == -1) - { - LL_DEBUGS("Window") << "Enabling adaptive vertical sync" << LL_ENDL; - if(SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, -1) == -1) - { - LL_DEBUGS("Window") << "Failed to enable adaptive vertical sync. Disabling vsync." << LL_ENDL; - SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 0); - } - } else { LL_DEBUGS("Window") << "Enabling vertical sync" << LL_ENDL; SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 1); } +#endif #endif // SDL_GL_SWAP_CONTROL #endif // SDL_VERSION_ATLEAST(1,3,0) @@ -793,8 +785,6 @@ BOOL LLWindowSDL::switchContext(BOOL fullscreen, const LLCoordScreen &size, cons result = createContext(0, 0, size.mX, size.mY, 0, fullscreen, vsync_mode); if (result) { - gGLManager.initGL(); - //start with arrow cursor initCursors(); setCursor( UI_CURSOR_ARROW ); diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 6b8a1a45b..008c92e0c 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -1652,7 +1652,7 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, co // Disable vertical sync for swap if(wglSwapIntervalEXT) { - if (vsync_mode == 0) + if (vsync_mode == 0 || (!gGLManager.mHasAdaptiveVsync && vsync_mode == -1)) { LL_INFOS("Window") << "Disabling vertical sync" << LL_ENDL; wglSwapIntervalEXT(0); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 69be5d90d..1b9f340e8 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1641,10 +1641,6 @@ LLViewerWindow::LLViewerWindow( resetSnapshotLoc(); S32 vsync_mode = gSavedSettings.getS32("SHRenderVsyncMode"); - if(vsync_mode == -1 && !gGLManager.mHasAdaptiveVsync) - { - vsync_mode = 0; //Disable vsync if adaptive is desired yet isn't supported. - } // create window mWindow = LLWindowManager::createWindow(this, From 3db9c6a9ffd27f819740f701106640b3e83551c0 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Wed, 14 May 2014 03:30:02 -0500 Subject: [PATCH 07/23] Try mask-based object shader configuration, instead of a bazillion hard-coded shader globals. Should be a bit more consistent. (non-deferred only, for now) Also abuse discard in alpha shaders, instead of processing invisible fragments. --- .../shaders/class1/deferred/alphaF.glsl | 12 +- .../shaders/class1/deferred/emissiveF.glsl | 2 + .../shaders/class1/deferred/materialF.glsl | 4 + .../class1/lighting/lightAlphaMaskF.glsl | 2 +- .../lighting/lightAlphaMaskNonIndexedF.glsl | 4 +- .../lighting/lightFullbrightAlphaMaskF.glsl | 4 +- .../lightFullbrightNonIndexedAlphaMaskF.glsl | 4 +- .../lightFullbrightWaterAlphaMaskF.glsl | 2 +- .../class1/lighting/lightNonIndexedF.glsl | 5 + .../class1/lighting/lightWaterAlphaMaskF.glsl | 2 +- .../shaders/class1/lighting/lightWaterF.glsl | 5 + .../lighting/lightWaterNonIndexedF.glsl | 5 + indra/newview/lldrawpoolalpha.cpp | 71 +- indra/newview/lldrawpoolavatar.cpp | 316 +++---- indra/newview/lldrawpoolbump.cpp | 22 +- indra/newview/lldrawpoolsimple.cpp | 55 +- indra/newview/llviewershadermgr.cpp | 800 +++--------------- indra/newview/llviewershadermgr.h | 55 +- 18 files changed, 329 insertions(+), 1041 deletions(-) diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl index b1cacf8b0..8ca317cce 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl @@ -465,15 +465,21 @@ void main() discard; } #endif -#ifdef FOR_IMPOSTOR +/*#ifdef FOR_IMPOSTOR // Insure we don't pollute depth with invis pixels in impostor rendering // if (final_alpha < 0.01) { discard; } -#endif +#endif*/ + //Always do this. + if (final_alpha < 0.004) + { + discard; + } + vec4 pos = vec4(vary_position, 1.0); float shadow = 1.0; @@ -549,7 +555,7 @@ void main() #ifdef FOR_IMPOSTOR - vec4 color = vec4(diff.rgb,final_alpha); + vec4 color = vec4(diff.rgb,final_alpha); //Impostor needs alpha. #else vec4 gamma_diff = diff; diff --git a/indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl b/indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl index 848f52b9a..34efdb10a 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl @@ -42,6 +42,8 @@ void main() float shadow = 1.0; vec4 color = diffuseLookup(vary_texcoord0.xy)*vertex_color; + if(color.a < .01) + discard; color.rgb = pow(color.rgb, vec3(2.2)); color.rgb = fullbrightAtmosTransport(color.rgb); diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl index c1d0ee266..91e16af4b 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl @@ -537,6 +537,10 @@ void main() #endif #if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND) + if(diffcol.a < .01) + { + discard; + } vec3 gamma_diff = diffcol.rgb; diffcol.rgb = srgb_to_linear(diffcol.rgb); #endif diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl index cf29939cb..0eb11afe8 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl @@ -39,7 +39,7 @@ VARYING vec2 vary_texcoord0; void default_lighting() { - vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color; + vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color; //Shader is used on alpha faces too. Need alpha component. if (color.a < minimum_alpha) { diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl index b9ddbc8e1..4070d41f4 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskNonIndexedF.glsl @@ -41,15 +41,13 @@ VARYING vec2 vary_texcoord0; void default_lighting() { - vec4 color = texture2D(diffuseMap,vary_texcoord0.xy); + vec4 color = texture2D(diffuseMap,vary_texcoord0.xy) * vertex_color; if (color.a < minimum_alpha) { discard; } - color.rgb *= vertex_color.rgb; - color.rgb = atmosLighting(color.rgb); color.rgb = scaleSoftClip(color.rgb); diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl index 5740987ab..49fccda5b 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl @@ -40,15 +40,13 @@ VARYING vec2 vary_texcoord0; void fullbright_lighting() { - vec4 color = diffuseLookup(vary_texcoord0.xy); + vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color; //Shader is used on alpha faces too. Need alpha component. if (color.a < minimum_alpha) { discard; } - color.rgb *= vertex_color.rgb; - color.rgb = pow(color.rgb, vec3(texture_gamma)); color.rgb = fullbrightAtmosTransport(color.rgb); diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightNonIndexedAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightNonIndexedAlphaMaskF.glsl index f72f20b03..c6850467e 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightNonIndexedAlphaMaskF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightNonIndexedAlphaMaskF.glsl @@ -42,15 +42,13 @@ VARYING vec2 vary_texcoord0; void fullbright_lighting() { - vec4 color = texture2D(diffuseMap,vary_texcoord0.xy); + vec4 color = texture2D(diffuseMap,vary_texcoord0.xy) * vertex_color; if (color.a < minimum_alpha) { discard; } - color.rgb *= vertex_color.rgb; - color.rgb = pow(color.rgb, vec3(texture_gamma)); color.rgb = fullbrightAtmosTransport(color.rgb); diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterAlphaMaskF.glsl index 9c82056fd..ab2d05a3c 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterAlphaMaskF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightWaterAlphaMaskF.glsl @@ -41,7 +41,7 @@ VARYING vec2 vary_texcoord0; void fullbright_lighting_water() { - vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color; + vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color; //Shader is used on alpha faces too. Need alpha component. if (color.a < minimum_alpha) { diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightNonIndexedF.glsl index 0aca76802..b045a55cf 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightNonIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightNonIndexedF.glsl @@ -41,6 +41,11 @@ void default_lighting() { vec4 color = texture2D(diffuseMap,vary_texcoord0.xy) * vertex_color; + if(color.a < .004) + { + discard; + } + color.rgb = atmosLighting(color.rgb); color.rgb = scaleSoftClip(color.rgb); diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightWaterAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightWaterAlphaMaskF.glsl index b68240ba0..d449a1b32 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightWaterAlphaMaskF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightWaterAlphaMaskF.glsl @@ -39,7 +39,7 @@ VARYING vec2 vary_texcoord0; void default_lighting_water() { - vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color; + vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color; //Shader is used on alpha faces too. Need alpha component. if (color.a < minimum_alpha) { diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl index 00609e93c..3586652cb 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightWaterF.glsl @@ -39,6 +39,11 @@ void default_lighting_water() { vec4 color = diffuseLookup(vary_texcoord0.xy) * vertex_color; + if(color.a < .004) + { + discard; + } + color.rgb = atmosLighting(color.rgb); frag_color = applyWaterFog(color); diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightWaterNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightWaterNonIndexedF.glsl index 13ecb7a63..32494b81f 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightWaterNonIndexedF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightWaterNonIndexedF.glsl @@ -41,6 +41,11 @@ void default_lighting_water() { vec4 color = texture2D(diffuseMap,vary_texcoord0.xy) * vertex_color; + if(color.a < .004) + { + discard; + } + color.rgb = atmosLighting(color.rgb); frag_color = applyWaterFog(color); diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index 457620d96..74ee302a6 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -135,27 +135,13 @@ void LLDrawPoolAlpha::beginPostDeferredPass(S32 pass) gPipeline.mDeferredDepth.copyContents(gPipeline.mDeferredScreen, 0, 0, gPipeline.mDeferredScreen.getWidth(), gPipeline.mDeferredScreen.getHeight(), 0, 0, gPipeline.mDeferredDepth.getWidth(), gPipeline.mDeferredDepth.getHeight(), GL_DEPTH_BUFFER_BIT, GL_NEAREST); gPipeline.mDeferredDepth.bindTarget(); - simple_shader = fullbright_shader = &gObjectFullbrightAlphaMaskProgram; - gObjectFullbrightAlphaMaskProgram.bind(); - gObjectFullbrightAlphaMaskProgram.setMinimumAlpha(0.33f); + simple_shader = fullbright_shader = &gObjectFullbrightProgram[1<bind(); + fullbright_shader->setMinimumAlpha(0.33f); } - - if (LLPipeline::sRenderDeferred) - { - emissive_shader = &gDeferredEmissiveProgram; - } - else - { - if (LLPipeline::sUnderWaterRender) - { - emissive_shader = &gObjectEmissiveWaterProgram; - } - else - { - emissive_shader = &gObjectEmissiveProgram; - } - } + llassert_always(LLPipeline::sRenderDeferred); + emissive_shader = &gDeferredEmissiveProgram; deferred_render = TRUE; @@ -173,7 +159,7 @@ void LLDrawPoolAlpha::endPostDeferredPass(S32 pass) { gPipeline.mDeferredDepth.flush(); gPipeline.mScreen.bindTarget(); - gObjectFullbrightAlphaMaskProgram.unbind(); + gObjectFullbrightProgram[1< 0) { - if (LLPipeline::sImpostorRender) - { - fullbright_shader->bind(); - fullbright_shader->setMinimumAlpha(0.5f); - simple_shader->bind(); - simple_shader->setMinimumAlpha(0.5f); - } - else - { - fullbright_shader->bind(); - fullbright_shader->setMinimumAlpha(0.f); - simple_shader->bind(); - simple_shader->setMinimumAlpha(0.f); - } + float min_alpha = LLPipeline::sImpostorRender ? 0.5f : 0.004f; + + fullbright_shader->bind(); + fullbright_shader->setMinimumAlpha(min_alpha); + simple_shader->bind(); + simple_shader->setMinimumAlpha(min_alpha); + emissive_shader->bind(); + emissive_shader->setMinimumAlpha(min_alpha); } else { diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 4597f6e9d..d6db1c227 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -731,6 +731,12 @@ void LLDrawPoolAvatar::endDeferredRigid() void LLDrawPoolAvatar::beginSkinned() { + if(!gPipeline.canUseVertexShaders()) + { + sVertexProgram = NULL; + return; + } + if (sShaderLevel > 0) { if (LLPipeline::sUnderWaterRender) @@ -765,12 +771,9 @@ void LLDrawPoolAvatar::beginSkinned() } else { - if(gPipeline.canUseVertexShaders()) - { - // software skinning, use a basic shader for windlight. - // TODO: find a better fallback method for software skinning. - sVertexProgram->bind(); - } + // software skinning, use a basic shader for windlight. + // TODO: find a better fallback method for software skinning. + sVertexProgram->bind(); } if (LLGLSLShader::sNoFixedFunction) @@ -787,17 +790,12 @@ void LLDrawPoolAvatar::endSkinned() sRenderingSkinned = FALSE; sVertexProgram->disableTexture(LLViewerShaderMgr::BUMP_MAP); gGL.getTexUnit(0)->activate(); - sVertexProgram->unbind(); sShaderLevel = mVertexShaderLevel; } - else + + if(sVertexProgram) { - if(gPipeline.canUseVertexShaders()) - { - // software skinning, use a basic shader for windlight. - // TODO: find a better fallback method for software skinning. - sVertexProgram->unbind(); - } + sVertexProgram->unbind(); } gGL.getTexUnit(0)->activate(); @@ -805,44 +803,29 @@ void LLDrawPoolAvatar::endSkinned() void LLDrawPoolAvatar::beginRiggedSimple() { - if (sShaderLevel > 0) + sDiffuseChannel = 0; + if(!gPipeline.canUseVertexShaders()) { - if (LLPipeline::sUnderWaterRender) - { - sVertexProgram = &gSkinnedObjectSimpleWaterProgram; - } - else - { - sVertexProgram = &gSkinnedObjectSimpleProgram; - } - } - else - { - if (LLPipeline::sUnderWaterRender) - { - sVertexProgram = &gObjectSimpleNonIndexedWaterProgram; - } - else - { - sVertexProgram = &gObjectSimpleNonIndexedProgram; - } + sVertexProgram = NULL; + return; } - if (sShaderLevel > 0 || gPipeline.canUseVertexShaders()) - { - sDiffuseChannel = 0; - sVertexProgram->bind(); - } + sVertexProgram = &gObjectSimpleProgram[1<0)<mProgramObject > 0); + + sDiffuseChannel = 0; + sVertexProgram->bind(); } void LLDrawPoolAvatar::endRiggedSimple() { LLVertexBuffer::unbind(); - if (sShaderLevel > 0 || gPipeline.canUseVertexShaders()) - { - sVertexProgram->unbind(); - sVertexProgram = NULL; - } + + if(!sVertexProgram) + return; + + sVertexProgram->unbind(); + sVertexProgram = NULL; } void LLDrawPoolAvatar::beginRiggedAlpha() @@ -868,39 +851,21 @@ void LLDrawPoolAvatar::endRiggedFullbrightAlpha() void LLDrawPoolAvatar::beginRiggedGlow() { - if (sShaderLevel > 0) + sDiffuseChannel = 0; + if(!gPipeline.canUseVertexShaders()) { - if (LLPipeline::sUnderWaterRender) - { - sVertexProgram = &gSkinnedObjectEmissiveWaterProgram; - } - else - { - sVertexProgram = &gSkinnedObjectEmissiveProgram; - } - } - else - { - if (LLPipeline::sUnderWaterRender) - { - sVertexProgram = &gObjectEmissiveNonIndexedWaterProgram; - } - else - { - sVertexProgram = &gObjectEmissiveNonIndexedProgram; - } + sVertexProgram = NULL; + return; } - if (sShaderLevel > 0 || gPipeline.canUseVertexShaders()) - { - sDiffuseChannel = 0; - sVertexProgram->bind(); - sVertexProgram->uniform1f(LLShaderMgr::TEXTURE_GAMMA, LLPipeline::sRenderDeferred ? 2.2f : 1.1f); - //F32 gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma"); - //sVertexProgram->uniform1f(LLShaderMgr::DISPLAY_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f/2.2f)); - } + sVertexProgram = &gObjectEmissiveProgram[1<0)<mProgramObject > 0); + + sVertexProgram->bind(); + sVertexProgram->uniform1f(LLShaderMgr::TEXTURE_GAMMA, LLPipeline::sRenderDeferred ? 2.2f : 1.1f); + //F32 gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma"); + //sVertexProgram->uniform1f(LLShaderMgr::DISPLAY_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f/2.2f)); } - void LLDrawPoolAvatar::endRiggedGlow() { endRiggedFullbright(); @@ -908,165 +873,114 @@ void LLDrawPoolAvatar::endRiggedGlow() void LLDrawPoolAvatar::beginRiggedFullbright() { - if (sShaderLevel > 0) + sDiffuseChannel = 0; + if(!gPipeline.canUseVertexShaders()) { - if (LLPipeline::sUnderWaterRender) - { - sVertexProgram = &gSkinnedObjectFullbrightWaterProgram; - } - else - { - if (LLPipeline::sRenderDeferred) - { - sVertexProgram = &gDeferredSkinnedFullbrightProgram; - } - else - { - sVertexProgram = &gSkinnedObjectFullbrightProgram; - } - } + sVertexProgram = NULL; + return; + } + if (sShaderLevel > 0 && !LLPipeline::sUnderWaterRender && LLPipeline::sRenderDeferred) + { + sVertexProgram = &gDeferredSkinnedFullbrightProgram; } else { - if (LLPipeline::sUnderWaterRender) - { - sVertexProgram = &gObjectFullbrightNonIndexedWaterProgram; - } - else - { - sVertexProgram = &gObjectFullbrightNonIndexedProgram; - } + sVertexProgram = &gObjectFullbrightProgram[1<0)<mProgramObject > 0); - if (sShaderLevel > 0 || gPipeline.canUseVertexShaders()) + sVertexProgram->bind(); + if (LLPipeline::sRenderingHUDs || !LLPipeline::sRenderDeferred) { - sDiffuseChannel = 0; - sVertexProgram->bind(); - if (LLPipeline::sRenderingHUDs || !LLPipeline::sRenderDeferred) - { - sVertexProgram->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 1.0f); - } - else - { - sVertexProgram->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f); - //F32 gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma"); - //sVertexProgram->uniform1f(LLShaderMgr::DISPLAY_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f/2.2f)); - } + sVertexProgram->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 1.0f); + } + else + { + sVertexProgram->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f); + //F32 gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma"); + //sVertexProgram->uniform1f(LLShaderMgr::DISPLAY_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f/2.2f)); } } void LLDrawPoolAvatar::endRiggedFullbright() { LLVertexBuffer::unbind(); - if (sShaderLevel > 0 || gPipeline.canUseVertexShaders()) - { - sVertexProgram->unbind(); - sVertexProgram = NULL; - } + + if(!sVertexProgram) + return; + + sVertexProgram->unbind(); + sVertexProgram = NULL; } void LLDrawPoolAvatar::beginRiggedShinySimple() { - if (sShaderLevel > 0) + if(!gPipeline.canUseVertexShaders()) { - if (LLPipeline::sUnderWaterRender) - { - sVertexProgram = &gSkinnedObjectShinySimpleWaterProgram; - } - else - { - sVertexProgram = &gSkinnedObjectShinySimpleProgram; - } - } - else - { - if (LLPipeline::sUnderWaterRender) - { - sVertexProgram = &gObjectShinyNonIndexedWaterProgram; - } - else - { - sVertexProgram = &gObjectShinyNonIndexedProgram; - } + sVertexProgram = NULL; + return; } - if (sShaderLevel > 0 || gPipeline.canUseVertexShaders()) - { - sVertexProgram->bind(); - LLDrawPoolBump::bindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false); - } + sVertexProgram = &gObjectSimpleProgram[1<0)<mProgramObject > 0); + + sVertexProgram->bind(); + LLDrawPoolBump::bindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false); } void LLDrawPoolAvatar::endRiggedShinySimple() { LLVertexBuffer::unbind(); - if (sShaderLevel > 0 || gPipeline.canUseVertexShaders()) - { - LLDrawPoolBump::unbindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false); - sVertexProgram->unbind(); - sVertexProgram = NULL; - } + + if(!sVertexProgram) + return; + + LLDrawPoolBump::unbindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false); + sVertexProgram->unbind(); + sVertexProgram = NULL; } void LLDrawPoolAvatar::beginRiggedFullbrightShiny() { - if (sShaderLevel > 0) + if(!gPipeline.canUseVertexShaders()) { - if (LLPipeline::sUnderWaterRender) - { - sVertexProgram = &gSkinnedObjectFullbrightShinyWaterProgram; - } - else - { - if (LLPipeline::sRenderDeferred) - { - sVertexProgram = &gDeferredSkinnedFullbrightShinyProgram; - } - else - { - sVertexProgram = &gSkinnedObjectFullbrightShinyProgram; - } - } + sVertexProgram = NULL; + return; + } + if (sShaderLevel > 0 && !LLPipeline::sUnderWaterRender && LLPipeline::sRenderDeferred) + { + sVertexProgram = &gDeferredSkinnedFullbrightShinyProgram; } else { - if (LLPipeline::sUnderWaterRender) - { - sVertexProgram = &gObjectFullbrightShinyNonIndexedWaterProgram; - } - else - { - sVertexProgram = &gObjectFullbrightShinyNonIndexedProgram; - } + sVertexProgram = &gObjectFullbrightProgram[1<0)<mProgramObject > 0); - - if (sShaderLevel > 0 || gPipeline.canUseVertexShaders()) + sVertexProgram->bind(); + LLDrawPoolBump::bindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false); + if (LLPipeline::sRenderingHUDs || !LLPipeline::sRenderDeferred) { - sVertexProgram->bind(); - LLDrawPoolBump::bindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false); - if (LLPipeline::sRenderingHUDs || !LLPipeline::sRenderDeferred) - { - sVertexProgram->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 1.0f); - } - else - { - sVertexProgram->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f); - //F32 gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma"); - //sVertexProgram->uniform1f(LLShaderMgr::DISPLAY_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f/2.2f)); - } + sVertexProgram->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 1.0f); + } + else + { + sVertexProgram->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f); + //F32 gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma"); + //sVertexProgram->uniform1f(LLShaderMgr::DISPLAY_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f/2.2f)); } } void LLDrawPoolAvatar::endRiggedFullbrightShiny() { LLVertexBuffer::unbind(); - if (sShaderLevel > 0 || gPipeline.canUseVertexShaders()) - { - LLDrawPoolBump::unbindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false); - sVertexProgram->unbind(); - sVertexProgram = NULL; - } + + if(!sVertexProgram) + return; + + LLDrawPoolBump::unbindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false); + sVertexProgram->unbind(); + sVertexProgram = NULL; } @@ -1690,7 +1604,7 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow) const LLTextureEntry* te = face->getTextureEntry(); LLMaterial* mat = te->getMaterialParams().get(); - if (mat) + if (mat && is_deferred_render) { gGL.getTexUnit(sDiffuseChannel)->bind(face->getTexture(LLRender::DIFFUSE_MAP)); gGL.getTexUnit(normal_channel)->bind(face->getTexture(LLRender::NORMAL_MAP)); @@ -1720,7 +1634,7 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow) } else { - sVertexProgram->setMinimumAlpha(0.f); + sVertexProgram->setMinimumAlpha(0.004f); } for (U32 i = 0; i < LLRender::NUM_TEXTURE_CHANNELS; ++i) @@ -1735,7 +1649,19 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow) else { gGL.getTexUnit(sDiffuseChannel)->bind(face->getTexture()); - sVertexProgram->setMinimumAlpha(0.f); + + if(sVertexProgram) + { + if (mat && mat->getDiffuseAlphaMode() == LLMaterial::DIFFUSE_ALPHA_MODE_MASK) + { + sVertexProgram->setMinimumAlpha(mat->getAlphaMaskCutoff()/255.f); + } + else + { + sVertexProgram->setMinimumAlpha(0.004f); + } + } + if (normal_channel > -1) { LLDrawPoolBump::bindBumpMap(face, normal_channel); @@ -1864,7 +1790,7 @@ void LLDrawPoolAvatar::renderRiggedAlpha(LLVOAvatar* avatar) LLRender::BF_ONE_MINUS_SOURCE_ALPHA); renderRigged(avatar, RIGGED_ALPHA); - //gGL.setSceneBlendType(LLRender::BT_ALPHA); + gGL.setSceneBlendType(LLRender::BT_ALPHA); gGL.setColorMask(true, false); } } @@ -1882,7 +1808,7 @@ void LLDrawPoolAvatar::renderRiggedFullbrightAlpha(LLVOAvatar* avatar) LLRender::BF_ONE_MINUS_SOURCE_ALPHA); renderRigged(avatar, RIGGED_FULLBRIGHT_ALPHA); - //gGL.setSceneBlendType(LLRender::BT_ALPHA); + gGL.setSceneBlendType(LLRender::BT_ALPHA); gGL.setColorMask(true, false); } } diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index 6a4c1b2ba..f0d7b4241 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -349,14 +349,7 @@ void LLDrawPoolBump::beginShiny(bool invisible) if (getVertexShaderLevel() > 0) { - if (LLPipeline::sUnderWaterRender) - { - shader = &gObjectShinyWaterProgram; - } - else - { - shader = &gObjectShinyProgram; - } + shader = &gObjectSimpleProgram[LLPipeline::sUnderWaterRender<bind(); } else @@ -516,20 +509,13 @@ void LLDrawPoolBump::beginFullbrightShiny() // Second pass: environment map - if (LLPipeline::sUnderWaterRender) + if(!LLPipeline::sUnderWaterRender && LLPipeline::sRenderDeferred) { - shader = &gObjectFullbrightShinyWaterProgram; + shader = &gDeferredFullbrightShinyProgram; } else { - if (LLPipeline::sRenderDeferred) - { - shader = &gDeferredFullbrightShinyProgram; - } - else - { - shader = &gObjectFullbrightShinyProgram; - } + shader = &gObjectFullbrightProgram[LLPipeline::sUnderWaterRender<getCubeMap() : NULL; diff --git a/indra/newview/lldrawpoolsimple.cpp b/indra/newview/lldrawpoolsimple.cpp index a0d6dbf92..2baf675fd 100644 --- a/indra/newview/lldrawpoolsimple.cpp +++ b/indra/newview/lldrawpoolsimple.cpp @@ -108,7 +108,7 @@ void LLDrawPoolGlow::render(S32 pass) //should never get here without basic shaders enabled llassert(shader_level > 0); - LLGLSLShader* shader = LLPipeline::sUnderWaterRender ? &gObjectEmissiveWaterProgram : &gObjectEmissiveProgram; + LLGLSLShader* shader = &gObjectEmissiveProgram[LLPipeline::sUnderWaterRender<bind(); if (LLPipeline::sRenderDeferred) { @@ -154,18 +154,7 @@ void LLDrawPoolSimple::beginRenderPass(S32 pass) { LLFastTimer t(FTM_RENDER_SIMPLE); - if (LLPipeline::sImpostorRender) - { - simple_shader = &gObjectSimpleImpostorProgram; - } - else if (LLPipeline::sUnderWaterRender) - { - simple_shader = &gObjectSimpleWaterProgram; - } - else - { - simple_shader = &gObjectSimpleProgram; - } + simple_shader = &gObjectSimpleProgram[LLPipeline::sUnderWaterRender< 0) { @@ -251,14 +240,7 @@ void LLDrawPoolAlphaMask::beginRenderPass(S32 pass) { LLFastTimer t(FTM_RENDER_ALPHA_MASK); - if (LLPipeline::sUnderWaterRender) - { - simple_shader = &gObjectSimpleWaterAlphaMaskProgram; - } - else - { - simple_shader = &gObjectSimpleAlphaMaskProgram; - } + simple_shader = &gObjectSimpleProgram[1< 0) { @@ -324,14 +306,7 @@ void LLDrawPoolFullbrightAlphaMask::beginRenderPass(S32 pass) { LLFastTimer t(FTM_RENDER_ALPHA_MASK); - if (LLPipeline::sUnderWaterRender) - { - simple_shader = &gObjectFullbrightWaterAlphaMaskProgram; - } - else - { - simple_shader = &gObjectFullbrightAlphaMaskProgram; - } + simple_shader = &gObjectFullbrightProgram[1< 0) { @@ -460,11 +435,7 @@ void LLDrawPoolGrass::beginRenderPass(S32 pass) if (LLPipeline::sUnderWaterRender) { - simple_shader = &gObjectAlphaMaskNonIndexedWaterProgram; - } - else - { - simple_shader = &gObjectAlphaMaskNonIndexedProgram; + simple_shader = &gObjectSimpleProgram[1< 0) @@ -592,14 +563,7 @@ void LLDrawPoolFullbright::beginRenderPass(S32 pass) { LLFastTimer t(FTM_RENDER_FULLBRIGHT); - if (LLPipeline::sUnderWaterRender) - { - fullbright_shader = &gObjectFullbrightWaterProgram; - } - else - { - fullbright_shader = &gObjectFullbrightProgram; - } + fullbright_shader = &gObjectFullbrightProgram[LLPipeline::sUnderWaterRender< gObjectSimpleProgram[1< gObjectFullbrightProgram[1< gObjectEmissiveProgram[1< 0) - { //load hardware skinned attachment shaders - if (success) - { - gSkinnedObjectSimpleProgram.mName = "Skinned Simple Shader"; - gSkinnedObjectSimpleProgram.mFeatures.calculatesLighting = true; - gSkinnedObjectSimpleProgram.mFeatures.calculatesAtmospherics = true; - gSkinnedObjectSimpleProgram.mFeatures.hasGamma = true; - gSkinnedObjectSimpleProgram.mFeatures.hasAtmospherics = true; - gSkinnedObjectSimpleProgram.mFeatures.hasLighting = true; - gSkinnedObjectSimpleProgram.mFeatures.hasObjectSkinning = true; - gSkinnedObjectSimpleProgram.mFeatures.hasAlphaMask = true; - gSkinnedObjectSimpleProgram.mFeatures.disableTextureIndex = true; - gSkinnedObjectSimpleProgram.mShaderFiles.clear(); - gSkinnedObjectSimpleProgram.mShaderFiles.push_back(make_pair("objects/simpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB)); - gSkinnedObjectSimpleProgram.mShaderFiles.push_back(make_pair("objects/simpleF.glsl", GL_FRAGMENT_SHADER_ARB)); - gSkinnedObjectSimpleProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; - success = gSkinnedObjectSimpleProgram.createShader(NULL, NULL); - } - - if (success) - { - gSkinnedObjectFullbrightProgram.mName = "Skinned Fullbright Shader"; - gSkinnedObjectFullbrightProgram.mFeatures.calculatesAtmospherics = true; - gSkinnedObjectFullbrightProgram.mFeatures.hasGamma = true; - gSkinnedObjectFullbrightProgram.mFeatures.hasTransport = true; - gSkinnedObjectFullbrightProgram.mFeatures.isFullbright = true; - gSkinnedObjectFullbrightProgram.mFeatures.hasObjectSkinning = true; - gSkinnedObjectFullbrightProgram.mFeatures.hasAlphaMask = true; - gSkinnedObjectFullbrightProgram.mFeatures.disableTextureIndex = true; - gSkinnedObjectFullbrightProgram.mShaderFiles.clear(); - gSkinnedObjectFullbrightProgram.mShaderFiles.push_back(make_pair("objects/fullbrightSkinnedV.glsl", GL_VERTEX_SHADER_ARB)); - gSkinnedObjectFullbrightProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB)); - gSkinnedObjectFullbrightProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; - success = gSkinnedObjectFullbrightProgram.createShader(NULL, NULL); - } - - if (success) - { - gSkinnedObjectEmissiveProgram.mName = "Skinned Emissive Shader"; - gSkinnedObjectEmissiveProgram.mFeatures.calculatesAtmospherics = true; - gSkinnedObjectEmissiveProgram.mFeatures.hasGamma = true; - gSkinnedObjectEmissiveProgram.mFeatures.hasTransport = true; - gSkinnedObjectEmissiveProgram.mFeatures.isFullbright = true; - gSkinnedObjectEmissiveProgram.mFeatures.hasObjectSkinning = true; - gSkinnedObjectEmissiveProgram.mFeatures.disableTextureIndex = true; - gSkinnedObjectEmissiveProgram.mShaderFiles.clear(); - gSkinnedObjectEmissiveProgram.mShaderFiles.push_back(make_pair("objects/emissiveSkinnedV.glsl", GL_VERTEX_SHADER_ARB)); - gSkinnedObjectEmissiveProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB)); - gSkinnedObjectEmissiveProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; - success = gSkinnedObjectEmissiveProgram.createShader(NULL, NULL); - } - - if (success) - { - gSkinnedObjectEmissiveWaterProgram.mName = "Skinned Emissive Water Shader"; - gSkinnedObjectEmissiveWaterProgram.mFeatures.calculatesAtmospherics = true; - gSkinnedObjectEmissiveWaterProgram.mFeatures.hasGamma = true; - gSkinnedObjectEmissiveWaterProgram.mFeatures.hasTransport = true; - gSkinnedObjectEmissiveWaterProgram.mFeatures.isFullbright = true; - gSkinnedObjectEmissiveWaterProgram.mFeatures.hasObjectSkinning = true; - gSkinnedObjectEmissiveWaterProgram.mFeatures.disableTextureIndex = true; - gSkinnedObjectEmissiveWaterProgram.mFeatures.hasWaterFog = true; - gSkinnedObjectEmissiveWaterProgram.mShaderFiles.clear(); - gSkinnedObjectEmissiveWaterProgram.mShaderFiles.push_back(make_pair("objects/emissiveSkinnedV.glsl", GL_VERTEX_SHADER_ARB)); - gSkinnedObjectEmissiveWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB)); - gSkinnedObjectEmissiveWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; - success = gSkinnedObjectEmissiveWaterProgram.createShader(NULL, NULL); - } - - if (success) - { - gSkinnedObjectFullbrightShinyProgram.mName = "Skinned Fullbright Shiny Shader"; - gSkinnedObjectFullbrightShinyProgram.mFeatures.calculatesAtmospherics = true; - gSkinnedObjectFullbrightShinyProgram.mFeatures.hasGamma = true; - gSkinnedObjectFullbrightShinyProgram.mFeatures.hasTransport = true; - gSkinnedObjectFullbrightShinyProgram.mFeatures.isShiny = true; - gSkinnedObjectFullbrightShinyProgram.mFeatures.isFullbright = true; - gSkinnedObjectFullbrightShinyProgram.mFeatures.hasObjectSkinning = true; - gSkinnedObjectFullbrightShinyProgram.mFeatures.hasAlphaMask = true; - gSkinnedObjectFullbrightShinyProgram.mFeatures.disableTextureIndex = true; - gSkinnedObjectFullbrightShinyProgram.mShaderFiles.clear(); - gSkinnedObjectFullbrightShinyProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinySkinnedV.glsl", GL_VERTEX_SHADER_ARB)); - gSkinnedObjectFullbrightShinyProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyF.glsl", GL_FRAGMENT_SHADER_ARB)); - gSkinnedObjectFullbrightShinyProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; - success = gSkinnedObjectFullbrightShinyProgram.createShader(NULL, NULL); - } - - if (success) - { - gSkinnedObjectShinySimpleProgram.mName = "Skinned Shiny Simple Shader"; - gSkinnedObjectShinySimpleProgram.mFeatures.calculatesLighting = true; - gSkinnedObjectShinySimpleProgram.mFeatures.calculatesAtmospherics = true; - gSkinnedObjectShinySimpleProgram.mFeatures.hasGamma = true; - gSkinnedObjectShinySimpleProgram.mFeatures.hasAtmospherics = true; - gSkinnedObjectShinySimpleProgram.mFeatures.hasObjectSkinning = true; - gSkinnedObjectShinySimpleProgram.mFeatures.hasAlphaMask = true; - gSkinnedObjectShinySimpleProgram.mFeatures.isShiny = true; - gSkinnedObjectShinySimpleProgram.mFeatures.disableTextureIndex = true; - gSkinnedObjectShinySimpleProgram.mShaderFiles.clear(); - gSkinnedObjectShinySimpleProgram.mShaderFiles.push_back(make_pair("objects/shinySimpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB)); - gSkinnedObjectShinySimpleProgram.mShaderFiles.push_back(make_pair("objects/shinyF.glsl", GL_FRAGMENT_SHADER_ARB)); - gSkinnedObjectShinySimpleProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; - success = gSkinnedObjectShinySimpleProgram.createShader(NULL, NULL); - } - - if (success) - { - gSkinnedObjectSimpleWaterProgram.mName = "Skinned Simple Water Shader"; - gSkinnedObjectSimpleWaterProgram.mFeatures.calculatesLighting = true; - gSkinnedObjectSimpleWaterProgram.mFeatures.calculatesAtmospherics = true; - gSkinnedObjectSimpleWaterProgram.mFeatures.hasGamma = true; - gSkinnedObjectSimpleWaterProgram.mFeatures.hasAtmospherics = true; - gSkinnedObjectSimpleWaterProgram.mFeatures.hasLighting = true; - gSkinnedObjectSimpleWaterProgram.mFeatures.disableTextureIndex = true; - gSkinnedObjectSimpleWaterProgram.mFeatures.hasWaterFog = true; - gSkinnedObjectSimpleWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER; - gSkinnedObjectSimpleWaterProgram.mFeatures.hasObjectSkinning = true; - gSkinnedObjectSimpleWaterProgram.mFeatures.disableTextureIndex = true; - gSkinnedObjectSimpleWaterProgram.mShaderFiles.clear(); - gSkinnedObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB)); - gSkinnedObjectSimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/simpleWaterF.glsl", GL_FRAGMENT_SHADER_ARB)); - gSkinnedObjectSimpleWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; - success = gSkinnedObjectSimpleWaterProgram.createShader(NULL, NULL); - } - - if (success) - { - gSkinnedObjectFullbrightWaterProgram.mName = "Skinned Fullbright Water Shader"; - gSkinnedObjectFullbrightWaterProgram.mFeatures.calculatesAtmospherics = true; - gSkinnedObjectFullbrightWaterProgram.mFeatures.hasGamma = true; - gSkinnedObjectFullbrightWaterProgram.mFeatures.hasTransport = true; - gSkinnedObjectFullbrightWaterProgram.mFeatures.isFullbright = true; - gSkinnedObjectFullbrightWaterProgram.mFeatures.hasObjectSkinning = true; - gSkinnedObjectFullbrightWaterProgram.mFeatures.hasAlphaMask = true; - gSkinnedObjectFullbrightWaterProgram.mFeatures.hasWaterFog = true; - gSkinnedObjectFullbrightWaterProgram.mFeatures.disableTextureIndex = true; - gSkinnedObjectFullbrightWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER; - gSkinnedObjectFullbrightWaterProgram.mShaderFiles.clear(); - gSkinnedObjectFullbrightWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightSkinnedV.glsl", GL_VERTEX_SHADER_ARB)); - gSkinnedObjectFullbrightWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB)); - gSkinnedObjectFullbrightWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; - success = gSkinnedObjectFullbrightWaterProgram.createShader(NULL, NULL); - } - - if (success) - { - gSkinnedObjectFullbrightShinyWaterProgram.mName = "Skinned Fullbright Shiny Water Shader"; - gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.calculatesAtmospherics = true; - gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.hasGamma = true; - gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.hasTransport = true; - gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.isShiny = true; - gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.isFullbright = true; - gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.hasObjectSkinning = true; - gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.hasAlphaMask = true; - gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.hasWaterFog = true; - gSkinnedObjectFullbrightShinyWaterProgram.mFeatures.disableTextureIndex = true; - gSkinnedObjectFullbrightShinyWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER; - gSkinnedObjectFullbrightShinyWaterProgram.mShaderFiles.clear(); - gSkinnedObjectFullbrightShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinySkinnedV.glsl", GL_VERTEX_SHADER_ARB)); - gSkinnedObjectFullbrightShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB)); - gSkinnedObjectFullbrightShinyWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; - success = gSkinnedObjectFullbrightShinyWaterProgram.createShader(NULL, NULL); - } - - if (success) - { - gSkinnedObjectShinySimpleWaterProgram.mName = "Skinned Shiny Simple Water Shader"; - gSkinnedObjectShinySimpleWaterProgram.mFeatures.calculatesLighting = true; - gSkinnedObjectShinySimpleWaterProgram.mFeatures.calculatesAtmospherics = true; - gSkinnedObjectShinySimpleWaterProgram.mFeatures.hasGamma = true; - gSkinnedObjectShinySimpleWaterProgram.mFeatures.hasAtmospherics = true; - gSkinnedObjectShinySimpleWaterProgram.mFeatures.hasObjectSkinning = true; - gSkinnedObjectShinySimpleWaterProgram.mFeatures.hasAlphaMask = true; - gSkinnedObjectShinySimpleWaterProgram.mFeatures.isShiny = true; - gSkinnedObjectShinySimpleWaterProgram.mFeatures.hasWaterFog = true; - gSkinnedObjectShinySimpleWaterProgram.mFeatures.disableTextureIndex = true; - gSkinnedObjectShinySimpleWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER; - gSkinnedObjectShinySimpleWaterProgram.mShaderFiles.clear(); - gSkinnedObjectShinySimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/shinySimpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB)); - gSkinnedObjectShinySimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/shinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB)); - gSkinnedObjectShinySimpleWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; - success = gSkinnedObjectShinySimpleWaterProgram.createShader(NULL, NULL); - } - } if( !success ) { diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index feea7cfbc..8ee913d06 100644 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -32,6 +32,16 @@ #define LL_DEFERRED_MULTI_LIGHT_COUNT 16 +enum +{ + SHD_ALPHA_MASK_BIT = 0, + SHD_WATER_BIT, + SHD_NO_INDEX_BIT, + SHD_SKIN_BIT, + SHD_SHINY_BIT, + SHD_COUNT +}; + class LLViewerShaderMgr: public LLShaderMgr { public: @@ -208,32 +218,17 @@ extern LLGLSLShader gTwoTextureAddProgram; extern LLGLSLShader gOneTextureNoColorProgram; //object shaders -extern LLGLSLShader gObjectSimpleProgram; -extern LLGLSLShader gObjectSimpleImpostorProgram; + +extern LLGLSLShaderArray gObjectSimpleProgram[1< gObjectFullbrightProgram[1< gObjectEmissiveProgram[1< Date: Wed, 14 May 2014 03:38:16 -0500 Subject: [PATCH 08/23] Determine if to stuff shiny data into alpha component a bit differently. Cuts out a lot of crazy logic and lets us choose based off of target renderpass. --- indra/newview/lldrawpoolavatar.cpp | 2 ++ indra/newview/llface.cpp | 56 ++++-------------------------- indra/newview/llface.h | 2 ++ indra/newview/llvovolume.cpp | 51 +++++++++++++++++++++++---- 4 files changed, 56 insertions(+), 55 deletions(-) diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index d6db1c227..ae09282b4 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -1878,6 +1878,8 @@ void LLDrawPoolAvatar::addRiggedFace(LLFace* facep, U32 type) facep->setRiggedIndex(type, mRiggedFace[type].size()); facep->setPool(this); mRiggedFace[type].push_back(facep); + + facep->mShinyInAlpha = type == RIGGED_DEFERRED_SIMPLE || type == RIGGED_DEFERRED_BUMP || type == RIGGED_FULLBRIGHT_SHINY || type == RIGGED_SHINY; } void LLDrawPoolAvatar::removeRiggedFace(LLFace* facep) diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 692724a38..9263b63da 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -166,6 +166,8 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp) mBoundingSphereRadius = 0.0f ; mHasMedia = FALSE ; + + mShinyInAlpha = false; } void LLFace::destroy() @@ -1298,53 +1300,9 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, if (rebuild_color) // FALSE if tep == NULL { //decide if shiny goes in alpha channel of color - static const LLCachedControl alt_batching("SHAltBatching",true); - if (tep && - ((!alt_batching && getPoolType() != LLDrawPool::POOL_ALPHA) || - (alt_batching && getPoolType() != LLDrawPool::POOL_ALPHA && - getPoolType() != LLDrawPool::POOL_ALPHA_MASK && - getPoolType() != LLDrawPool::POOL_FULLBRIGHT_ALPHA_MASK && // <--- alpha channel MUST contain transparency, not shiny - (getPoolType() != LLDrawPool::POOL_SIMPLE || LLPipeline::sRenderDeferred)))) // Impostor pass for simple uses alpha masking. Need to be opaque. + if(mShinyInAlpha) { - LLMaterial* mat = tep->getMaterialParams().get(); - - bool shiny_in_alpha = alt_batching ? true : false; - - if(alt_batching) - { - if (LLPipeline::sRenderDeferred) - { //store shiny in alpha if we don't have a specular map - if (getPoolType() == LLDrawPool::POOL_MATERIALS && mat->getSpecularID().notNull()) - { - shiny_in_alpha = false; - } - } - } - else - { - if (LLPipeline::sRenderDeferred) - { - if (!mat || mat->getSpecularID().isNull()) - { - shiny_in_alpha = true; - } - } - else - { - if (!mat || mat->getDiffuseAlphaMode() != LLMaterial::DIFFUSE_ALPHA_MODE_MASK) - { - shiny_in_alpha = true; - } - } - } - - if(getPoolType() == LLDrawPool::POOL_FULLBRIGHT) - { - color.mV[3] = 1.f; //Simple fullbright reads alpha for fog contrib, not shiny/transparency, so since opaque, force to 1. - } - else if (shiny_in_alpha) - { - GLfloat alpha[4] = + GLfloat alpha[4] = { 0.00f, 0.25f, @@ -1352,9 +1310,9 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, 0.75f }; - llassert(tep->getShiny() <= 3); - color.mV[3] = U8 (alpha[tep->getShiny()] * 255); - } + llassert(tep->getShiny() <= 3); + + color.mV[3] = U8 (alpha[tep->getShiny()] * 255); } } diff --git a/indra/newview/llface.h b/indra/newview/llface.h index 470375b04..feae55853 100644 --- a/indra/newview/llface.h +++ b/indra/newview/llface.h @@ -263,6 +263,8 @@ public: LLMatrix4* mNormalMapMatrix; LLDrawInfo* mDrawInfo; + bool mShinyInAlpha; + private: LLPointer mVertexBuffer; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 2c7aa39aa..c157cf236 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -4142,6 +4142,13 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, return; } + if(!facep->mShinyInAlpha) + facep->mShinyInAlpha = (type == LLRenderPass::PASS_FULLBRIGHT_SHINY) || + (type == LLRenderPass::PASS_INVISI_SHINY) || + (type == LLRenderPass::PASS_SHINY) || + (LLPipeline::sRenderDeferred && type == LLRenderPass::PASS_BUMP) || + (LLPipeline::sRenderDeferred && type == LLRenderPass::PASS_SIMPLE); + //add face to drawmap LLSpatialGroup::drawmap_elem_t& draw_vec = group->mDrawMap[type]; @@ -4199,8 +4206,9 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, U32 pool_type = facep->getPoolType(); bool cmp_bump = (type == LLRenderPass::PASS_BUMP) || (type == LLRenderPass::PASS_POST_BUMP); - bool cmp_mat = (!alt_batching) || LLPipeline::sRenderDeferred && /*facep->getTextureEntry()->getColor().mV[3] >= 0.999f &&*/ - ((pool_type == LLDrawPool::POOL_MATERIALS) || (pool_type == LLDrawPool::POOL_ALPHA)); + bool cmp_mat = (!alt_batching) || LLPipeline::sRenderDeferred && + ((pool_type == LLDrawPool::POOL_MATERIALS) || (pool_type == LLDrawPool::POOL_ALPHA)) || + pool_type == LLDrawPool::POOL_ALPHA_MASK || pool_type == LLDrawPool::POOL_FULLBRIGHT_ALPHA_MASK; bool cmp_shiny = (!alt_batching) ? !!mat : (mat && cmp_mat); bool cmp_fullbright = !alt_batching || cmp_shiny || pool_type == LLDrawPool::POOL_ALPHA; @@ -5864,7 +5872,8 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFac //for debugging, set last time face was updated vs moved facep->updateRebuildFlags(); - if (!LLPipeline::sDelayVBUpdate) + //Singu Note: Moved to after registerFace calls, as those update LLFace::mShinyInAlpha, which is needed before updating the vertex buffer. + /*if (!LLPipeline::sDelayVBUpdate) { //copy face geometry into vertex buffer LLDrawable* drawablep = facep->getDrawable(); LLVOVolume* vobj = drawablep->getVOVolume(); @@ -5889,11 +5898,10 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFac { vobj->updateRelativeXform(false); } - } + }*/ } - index_offset += facep->getGeomCount(); - indices_index += facep->getIndicesCount(); + facep->mShinyInAlpha = false; static const LLCachedControl alt_batching("SHAltBatching",true); @@ -6309,6 +6317,37 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFac registerFace(group, facep, LLRenderPass::PASS_GLOW); } } + + //Singu Note: LLFace::mShinyInAlpha has been updated by now. We're good to go. + if (!LLPipeline::sDelayVBUpdate) + { //copy face geometry into vertex buffer + LLDrawable* drawablep = facep->getDrawable(); + LLVOVolume* vobj = drawablep->getVOVolume(); + LLVolume* volume = vobj->getVolume(); + + if (drawablep->isState(LLDrawable::ANIMATED_CHILD)) + { + vobj->updateRelativeXform(true); + } + + U32 te_idx = facep->getTEOffset(); + + llassert(!facep->isState(LLFace::RIGGED)); + + if (!facep->getGeometryVolume(*volume, te_idx, + vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), index_offset,true)) + { + llwarns << "Failed to get geometry for face!" << llendl; + } + + if (drawablep->isState(LLDrawable::ANIMATED_CHILD)) + { + vobj->updateRelativeXform(false); + } + } + + index_offset += facep->getGeomCount(); + indices_index += facep->getIndicesCount(); ++face_iter; } From 846d573dd0d50da2dc91c4851f72d26feeb08576 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Wed, 14 May 2014 16:45:55 -0500 Subject: [PATCH 09/23] Kill stray #endif that snuck into commit. --- indra/llwindow/llwindowsdl.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index 37eeff76a..341739d1d 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -754,7 +754,6 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B LL_DEBUGS("Window") << "Enabling vertical sync" << LL_ENDL; SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 1); } -#endif #endif // SDL_GL_SWAP_CONTROL #endif // SDL_VERSION_ATLEAST(1,3,0) From 7d98030edc256475da52890341d467df23c98b59 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Wed, 14 May 2014 19:43:03 -0500 Subject: [PATCH 10/23] Use the right diffuse shader for skinned deferred diffuse simple object shader. --- indra/newview/llviewershadermgr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 161cfd5c0..67ec117a7 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -1053,7 +1053,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredSkinnedDiffuseProgram.mFeatures.hasObjectSkinning = true; gDeferredSkinnedDiffuseProgram.mShaderFiles.clear(); gDeferredSkinnedDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseSkinnedV.glsl", GL_VERTEX_SHADER_ARB)); - gDeferredSkinnedDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseAlphaMaskF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredSkinnedDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseF.glsl", GL_FRAGMENT_SHADER_ARB)); gDeferredSkinnedDiffuseProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; success = gDeferredSkinnedDiffuseProgram.createShader(NULL, NULL); } From c3771e2fd5cea1842b24b6a85d725274ebbfcb32 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Thu, 15 May 2014 16:23:14 -0500 Subject: [PATCH 11/23] Removed unused preprocessor definition in objectSkinV.glsl --- .../newview/app_settings/shaders/class1/avatar/objectSkinV.glsl | 2 -- 1 file changed, 2 deletions(-) diff --git a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl index f4e86409c..7df4f96ce 100644 --- a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl +++ b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl @@ -22,8 +22,6 @@ * $/LicenseInfo$ */ -#define FLT_MAX 3.402823466e+38 - ATTRIBUTE vec4 weight4; uniform mat3 matrixPalette[52]; From e0997f1f04b0ad140d0033069dd03771914283b0 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Thu, 15 May 2014 18:39:35 -0500 Subject: [PATCH 12/23] Decouple vbo validation from LLDrawInfo. Such required vbo's to be initialized before drawinfo creation/modification, which is no longer the case with llvovolume. ('RenderDelayVBUpdate'[although removed in Singu] also fails the same assumption.) --- indra/newview/llspatialpartition.cpp | 2 +- indra/newview/llvograss.cpp | 5 +++++ indra/newview/llvopartgroup.cpp | 5 +++++ indra/newview/llvovolume.cpp | 9 +++++++-- 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 9ad74f7a0..627df738a 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -4462,7 +4462,7 @@ LLDrawInfo::LLDrawInfo(U16 start, U16 end, U32 count, U32 offset, mAlphaMaskCutoff(0.5f), mDiffuseAlphaMode(0) { - mVertexBuffer->validateRange(mStart, mEnd, mCount, mOffset); + //mVertexBuffer->validateRange(mStart, mEnd, mCount, mOffset); mDebugColor = (rand() << 16) + rand(); } diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp index f45fc6de2..9d802740f 100644 --- a/indra/newview/llvograss.cpp +++ b/indra/newview/llvograss.cpp @@ -777,6 +777,11 @@ void LLGrassPartition::getGeometry(LLSpatialGroup* group) } } + if(vertex_count > 0) + { + buffer->validateRange(0, vertex_count - 1, index_count, 0); + } + buffer->flush(); mFaceList.clear(); } diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp index 09d2037e2..c1c57ab32 100644 --- a/indra/newview/llvopartgroup.cpp +++ b/indra/newview/llvopartgroup.cpp @@ -988,6 +988,11 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group) //for alpha sorting facep->setDrawInfo(info); } + + if(facep->getGeomCount() > 0) + { + buffer->validateRange(facep->getGeomIndex(), facep->getGeomCount() - 1, facep->getIndicesCount(), 0); + } } mFaceList.clear(); diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index c157cf236..b88b673f6 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -4288,7 +4288,7 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, draw_vec[idx]->mTextureList.resize(index+1); draw_vec[idx]->mTextureList[index] = tex; } - draw_vec[idx]->validate(); + //draw_vec[idx]->validate(); update_min_max(draw_vec[idx]->mExtents[0], draw_vec[idx]->mExtents[1], facep->mExtents[0]); update_min_max(draw_vec[idx]->mExtents[0], draw_vec[idx]->mExtents[1], facep->mExtents[1]); } @@ -4372,7 +4372,7 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, draw_info->mTextureList[index] = tex; } - draw_info->validate(); + //draw_info->validate(); } } @@ -6352,6 +6352,11 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFac ++face_iter; } + if(index_offset > 0) + { + buffer->validateRange(0, index_offset - 1, indices_index, 0); + } + buffer->flush(); } From fdcf2eda5a747ced5ed949bd99189ca595488941 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Thu, 15 May 2014 18:44:10 -0500 Subject: [PATCH 13/23] Decouple vbo validation from LLDrawInfo. Such required vbo's to be initialized before drawinfo creation/modification, which is no longer the case with llvovolume. ('RenderDelayVBUpdate'[although removed in Singu] also fails the same assumption.) --- indra/newview/llspatialpartition.cpp | 2 +- indra/newview/llvograss.cpp | 5 +++++ indra/newview/llvopartgroup.cpp | 5 +++++ indra/newview/llvovolume.cpp | 9 +++++++-- 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 9ad74f7a0..627df738a 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -4462,7 +4462,7 @@ LLDrawInfo::LLDrawInfo(U16 start, U16 end, U32 count, U32 offset, mAlphaMaskCutoff(0.5f), mDiffuseAlphaMode(0) { - mVertexBuffer->validateRange(mStart, mEnd, mCount, mOffset); + //mVertexBuffer->validateRange(mStart, mEnd, mCount, mOffset); mDebugColor = (rand() << 16) + rand(); } diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp index f45fc6de2..9d802740f 100644 --- a/indra/newview/llvograss.cpp +++ b/indra/newview/llvograss.cpp @@ -777,6 +777,11 @@ void LLGrassPartition::getGeometry(LLSpatialGroup* group) } } + if(vertex_count > 0) + { + buffer->validateRange(0, vertex_count - 1, index_count, 0); + } + buffer->flush(); mFaceList.clear(); } diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp index 09d2037e2..c1c57ab32 100644 --- a/indra/newview/llvopartgroup.cpp +++ b/indra/newview/llvopartgroup.cpp @@ -988,6 +988,11 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group) //for alpha sorting facep->setDrawInfo(info); } + + if(facep->getGeomCount() > 0) + { + buffer->validateRange(facep->getGeomIndex(), facep->getGeomCount() - 1, facep->getIndicesCount(), 0); + } } mFaceList.clear(); diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index c157cf236..b88b673f6 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -4288,7 +4288,7 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, draw_vec[idx]->mTextureList.resize(index+1); draw_vec[idx]->mTextureList[index] = tex; } - draw_vec[idx]->validate(); + //draw_vec[idx]->validate(); update_min_max(draw_vec[idx]->mExtents[0], draw_vec[idx]->mExtents[1], facep->mExtents[0]); update_min_max(draw_vec[idx]->mExtents[0], draw_vec[idx]->mExtents[1], facep->mExtents[1]); } @@ -4372,7 +4372,7 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep, draw_info->mTextureList[index] = tex; } - draw_info->validate(); + //draw_info->validate(); } } @@ -6352,6 +6352,11 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFac ++face_iter; } + if(index_offset > 0) + { + buffer->validateRange(0, index_offset - 1, indices_index, 0); + } + buffer->flush(); } From 67c8ac2b048c0c49a16b1dadcdc9e486143381d0 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Sat, 17 May 2014 03:31:45 -0500 Subject: [PATCH 14/23] Skinned shaders were exceeding maximum amount of vertex uniforms on amd hardware. -Changed the transform matrix uniform to a 3x4 matrix and packed translation into it to free up uniforms. (3x3 is converted to 3x4 internally, so we were needlessly eating 3*52 extra uniform slots. translationPalette might also have been treated as a vec4 internally too, wasting 52 more slots.) -matrix3x4 requires opengl2.1 and newer, so added a new featuretable mask. -Also added a featuretable mask to disable hardware skinning and deferred shading on hardware with less than 1024 vertex uniforms. NOTE: On old old old amd hardware, evidently a 3x4 matrix might be upgraded to 4x4. I'm unsure, but I doubt such hardware has 1024+ uniform components available to begin with. 4x3 supposedly doesn't do this, but opengl is column-major, so this makes little sense. --- indra/llrender/llgl.cpp | 11 ++++++- indra/llrender/llgl.h | 2 ++ indra/llrender/llglheaders.h | 3 ++ indra/llrender/llglslshader.cpp | 17 +++++++++++ indra/llrender/llglslshader.h | 1 + .../shaders/class1/avatar/objectSkinV.glsl | 28 ++++++++--------- indra/newview/featuretable.txt | 9 ++++++ indra/newview/featuretable_linux.txt | 10 +++++++ indra/newview/featuretable_mac.txt | 9 ++++++ indra/newview/lldrawpoolavatar.cpp | 30 ++++++++----------- indra/newview/llfeaturemanager.cpp | 16 +++++++--- indra/newview/llviewershadermgr.cpp | 2 +- 12 files changed, 98 insertions(+), 40 deletions(-) diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index 064183d49..1886a4d48 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -304,6 +304,7 @@ PFNGLUNIFORM3IVARBPROC glUniform3ivARB = NULL; PFNGLUNIFORM4IVARBPROC glUniform4ivARB = NULL; PFNGLUNIFORMMATRIX2FVARBPROC glUniformMatrix2fvARB = NULL; PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB = NULL; +PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3x4fvARB = NULL; PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB = NULL; PFNGLGETOBJECTPARAMETERFVARBPROC glGetObjectParameterfvARB = NULL; PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB = NULL; @@ -469,7 +470,8 @@ LLGLManager::LLGLManager() : mGLSLVersionMinor(0), mVRAM(0), mGLMaxVertexRange(0), - mGLMaxIndexRange(0) + mGLMaxIndexRange(0), + mGLMaxVertexUniformComponents(0) { } @@ -715,6 +717,12 @@ bool LLGLManager::initGL() mNumTextureImageUnits = llmin(num_tex_image_units, 32); } + if (mHasVertexShader) + { + //According to the spec, the resulting value should never be less than 512. We need at least 1024 to use skinned shaders. + glGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB, &mGLMaxVertexUniformComponents); + } + if (LLRender::sGLCoreProfile) { mNumTextureUnits = llmin(mNumTextureImageUnits, MAX_GL_TEXTURE_UNITS); @@ -1269,6 +1277,7 @@ void LLGLManager::initExtensions() glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniform4ivARB"); glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniformMatrix2fvARB"); glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniformMatrix3fvARB"); + glUniformMatrix3x4fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniformMatrix3x4fv"); glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniformMatrix4fvARB"); glGetObjectParameterfvARB = (PFNGLGETOBJECTPARAMETERFVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetObjectParameterfvARB"); glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetObjectParameterivARB"); diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h index 9b277c70a..7a11d1b2e 100644 --- a/indra/llrender/llgl.h +++ b/indra/llrender/llgl.h @@ -151,6 +151,8 @@ public: S32 mVRAM; // VRAM in MB S32 mGLMaxVertexRange; S32 mGLMaxIndexRange; + + S32 mGLMaxVertexUniformComponents; void getPixelFormat(); // Get the best pixel format diff --git a/indra/llrender/llglheaders.h b/indra/llrender/llglheaders.h index 11074a7fd..341c3adc9 100644 --- a/indra/llrender/llglheaders.h +++ b/indra/llrender/llglheaders.h @@ -152,6 +152,7 @@ extern PFNGLUNIFORM3IVARBPROC glUniform3ivARB; extern PFNGLUNIFORM4IVARBPROC glUniform4ivARB; extern PFNGLUNIFORMMATRIX2FVARBPROC glUniformMatrix2fvARB; extern PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB; +extern PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3x4fvARB; extern PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB; extern PFNGLGETOBJECTPARAMETERFVARBPROC glGetObjectParameterfvARB; extern PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB; @@ -415,6 +416,7 @@ extern PFNGLUNIFORM3IVARBPROC glUniform3ivARB; extern PFNGLUNIFORM4IVARBPROC glUniform4ivARB; extern PFNGLUNIFORMMATRIX2FVARBPROC glUniformMatrix2fvARB; extern PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB; +extern PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3x4fvARB; extern PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB; extern PFNGLGETOBJECTPARAMETERFVARBPROC glGetObjectParameterfvARB; extern PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB; @@ -656,6 +658,7 @@ extern PFNGLUNIFORM3IVARBPROC glUniform3ivARB; extern PFNGLUNIFORM4IVARBPROC glUniform4ivARB; extern PFNGLUNIFORMMATRIX2FVARBPROC glUniformMatrix2fvARB; extern PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB; +extern PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3x4fvARB; extern PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB; extern PFNGLGETOBJECTPARAMETERFVARBPROC glGetObjectParameterfvARB; extern PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB; diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index 974bbb3b5..7f09a3be8 100644 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -933,6 +933,23 @@ void LLGLSLShader::uniformMatrix3fv(U32 index, U32 count, GLboolean transpose, c } } +void LLGLSLShader::uniformMatrix3x4fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v) +{ + if (mProgramObject > 0) + { + if (mUniform.size() <= index) + { + UNIFORM_ERRS << "Uniform index out of bounds." << LL_ENDL; + return; + } + + if (mUniform[index] >= 0) + { + glUniformMatrix3x4fvARB(mUniform[index], count, transpose, v); + } + } +} + void LLGLSLShader::uniformMatrix4fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v) { if (mProgramObject > 0) diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h index 1f134a881..a530d2658 100644 --- a/indra/llrender/llglslshader.h +++ b/indra/llrender/llglslshader.h @@ -100,6 +100,7 @@ public: void uniform2i(const LLStaticHashedString& uniform, GLint i, GLint j); void uniformMatrix2fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v); void uniformMatrix3fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v); + void uniformMatrix3x4fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v); void uniformMatrix4fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v); void uniform1i(const LLStaticHashedString& uniform, GLint i); void uniform1f(const LLStaticHashedString& uniform, GLfloat v); diff --git a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl index 7df4f96ce..6acbf0aaf 100644 --- a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl +++ b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl @@ -24,12 +24,9 @@ ATTRIBUTE vec4 weight4; -uniform mat3 matrixPalette[52]; -uniform vec3 translationPalette[52]; +uniform mat3x4 matrixPalette[52]; uniform float maxWeight; - - mat4 getObjectSkinnedTransform() { int i; @@ -47,22 +44,21 @@ mat4 getObjectSkinnedTransform() int i3 = int(index.z); int i4 = int(index.w); + mat3 mat = mat3(matrixPalette[i1])*w.x; + mat += mat3(matrixPalette[i2])*w.y; + mat += mat3(matrixPalette[i3])*w.z; + mat += mat3(matrixPalette[i4])*w.w; - mat3 mat = matrixPalette[i1]*w.x; - mat += matrixPalette[i2]*w.y; - mat += matrixPalette[i3]*w.z; - mat += matrixPalette[i4]*w.w; - - vec3 trans = translationPalette[i1]*w.x; - trans += translationPalette[i2]*w.y; - trans += translationPalette[i3]*w.z; - trans += translationPalette[i4]*w.w; + vec3 trans = vec3(matrixPalette[i1][0].w,matrixPalette[i1][1].w,matrixPalette[i1][2].w)*w.x; + trans += vec3(matrixPalette[i2][0].w,matrixPalette[i2][1].w,matrixPalette[i2][2].w)*w.y; + trans += vec3(matrixPalette[i3][0].w,matrixPalette[i3][1].w,matrixPalette[i3][2].w)*w.z; + trans += vec3(matrixPalette[i4][0].w,matrixPalette[i4][1].w,matrixPalette[i4][2].w)*w.w; mat4 ret; - ret[0] = vec4(mat[0].xyz, 0); - ret[1] = vec4(mat[1].xyz, 0); - ret[2] = vec4(mat[2].xyz, 0); + ret[0] = vec4(mat[0], 0); + ret[1] = vec4(mat[1], 0); + ret[2] = vec4(mat[2], 0); ret[3] = vec4(trans, sum); return ret; diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt index 111c7a431..90dd09387 100644 --- a/indra/newview/featuretable.txt +++ b/indra/newview/featuretable.txt @@ -301,6 +301,10 @@ RenderObjectBump 0 0 list OpenGLPre15 RenderVBOEnable 1 0 +list OpenGLPre21 +RenderAvatarVP 0 0 +RenderAvatarCloth 0 0 + list OpenGLPre30 RenderDeferred 0 0 RenderMaxTextureIndex 1 1 @@ -486,6 +490,7 @@ Disregard128DefaultDrawDistance 1 0 list ATIOldDriver RenderAvatarVP 0 0 RenderAvatarCloth 0 0 +RenderDeferred 0 0 // ATI cards generally perform better when not using VBOs for streaming data @@ -596,3 +601,7 @@ RenderShaderLightingMaxLevel 1 2 list NVIDIA_GeForce_Go_7900 RenderShaderLightingMaxLevel 1 2 +list VertexUniformsLT1024 +RenderAvatarVP 0 0 +RenderAvatarCloth 0 0 +RenderDeferred 0 0 diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt index 90b788f4f..043d44866 100644 --- a/indra/newview/featuretable_linux.txt +++ b/indra/newview/featuretable_linux.txt @@ -301,6 +301,11 @@ RenderObjectBump 0 0 list OpenGLPre15 RenderVBOEnable 1 0 +list OpenGLPre21 +RenderAvatarVP 0 0 +RenderAvatarCloth 0 0 +RenderDeferred 0 0 + list IntelPre30 RenderAnisotropic 1 0 // Avoid some Intel crashes on Linux @@ -458,6 +463,7 @@ Disregard128DefaultDrawDistance 1 0 list ATIOldDriver RenderAvatarVP 0 0 RenderAvatarCloth 0 0 +RenderDeferred 0 0 // Avoid driver crashes with some features on Linux with old ATI drivers UseOcclusion 0 0 WindLightUseAtmosShaders 0 0 @@ -563,3 +569,7 @@ RenderShaderLightingMaxLevel 1 2 list NVIDIA_GeForce_Go_7900 RenderShaderLightingMaxLevel 1 2 +list VertexUniformsLT1024 +RenderAvatarVP 0 0 +RenderAvatarCloth 0 0 +RenderDeferred 0 0 \ No newline at end of file diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index 874254439..96384d700 100644 --- a/indra/newview/featuretable_mac.txt +++ b/indra/newview/featuretable_mac.txt @@ -296,6 +296,11 @@ RenderObjectBump 0 0 list OpenGLPre15 RenderVBOEnable 1 0 +list OpenGLPre21 +RenderAvatarVP 0 0 +RenderAvatarCloth 0 0 +RenderDeferred 0 0 + list TexUnit8orLess RenderDeferredSSAO 0 0 @@ -521,3 +526,7 @@ Disregard128DefaultDrawDistance 1 0 list NVIDIA_GeForce_Go_7400 Disregard128DefaultDrawDistance 1 0 +list VertexUniformsLT1024 +RenderAvatarVP 0 0 +RenderAvatarCloth 0 0 +RenderDeferred 0 0 \ No newline at end of file diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index ae09282b4..dacc26422 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -1547,41 +1547,35 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow) stop_glerror(); - F32 mp[JOINT_COUNT*9]; - - F32 transp[JOINT_COUNT*3]; + F32 mp[JOINT_COUNT*12]; for (U32 i = 0; i < count; ++i) { F32* m = (F32*) mat[i].mMatrix; - U32 idx = i*9; + U32 idx = i*12; mp[idx+0] = m[0]; mp[idx+1] = m[1]; mp[idx+2] = m[2]; + mp[idx+3] = m[12]; - mp[idx+3] = m[4]; - mp[idx+4] = m[5]; - mp[idx+5] = m[6]; + mp[idx+4] = m[4]; + mp[idx+5] = m[5]; + mp[idx+6] = m[6]; + mp[idx+7] = m[13]; - mp[idx+6] = m[8]; - mp[idx+7] = m[9]; - mp[idx+8] = m[10]; - - idx = i*3; - - transp[idx+0] = m[12]; - transp[idx+1] = m[13]; - transp[idx+2] = m[14]; + mp[idx+8] = m[8]; + mp[idx+9] = m[9]; + mp[idx+10] = m[10]; + mp[idx+11] = m[14]; } - LLDrawPoolAvatar::sVertexProgram->uniformMatrix3fv(LLViewerShaderMgr::AVATAR_MATRIX, + LLDrawPoolAvatar::sVertexProgram->uniformMatrix3x4fv(LLViewerShaderMgr::AVATAR_MATRIX, count, FALSE, (GLfloat*) mp); - LLDrawPoolAvatar::sVertexProgram->uniform3fv(LLShaderMgr::AVATAR_TRANSLATION, count, transp); LLDrawPoolAvatar::sVertexProgram->uniform1f(LLShaderMgr::AVATAR_MAX_WEIGHT, F32(count-1)); stop_glerror(); diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index c3d0bc8a6..f58f1f577 100644 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -634,13 +634,17 @@ void LLFeatureManager::applyBaseMasks() { maskFeatures("Intel"); } - if (gGLManager.mGLVersion < 1.5f) - { - maskFeatures("OpenGLPre15"); - } if (gGLManager.mGLVersion < 3.f) { maskFeatures("OpenGLPre30"); + if(gGLManager.mGLVersion < 2.1f || glUniformMatrix3x4fvARB == NULL) //glUniformMatrix3x4fv is part of glsl 1.20 spec. + { + maskFeatures("OpenGLPre21"); + if (gGLManager.mGLVersion < 1.5f) + { + maskFeatures("OpenGLPre15"); + } + } } if (gGLManager.mNumTextureImageUnits <= 8) { @@ -650,6 +654,10 @@ void LLFeatureManager::applyBaseMasks() { maskFeatures("MapBufferRange"); } + if (gGLManager.mGLMaxVertexUniformComponents < 1024) + { + maskFeatures("VertexUniformsLT1024"); + } // now mask by gpu string // Replaces ' ' with '_' in mGPUString to deal with inability for parser to handle spaces diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 67ec117a7..4c1a50296 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -436,7 +436,7 @@ void LLViewerShaderMgr::setShaders() mVertexShaderLevel[SHADER_AVATAR] = 3; mMaxAvatarShaderLevel = 3; - if (gSavedSettings.getBOOL("RenderAvatarVP") && loadShadersObject()) + if (LLFeatureManager::getInstance()->isFeatureAvailable("RenderAvatarVP") && gSavedSettings.getBOOL("RenderAvatarVP") && loadShadersObject()) { //hardware skinning is enabled and rigged attachment shaders loaded correctly BOOL avatar_cloth = gSavedSettings.getBOOL("RenderAvatarCloth"); S32 avatar_class = 1; From a9c3e13e5e76e7c9eddada6d5627139cd5233654 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Sat, 17 May 2014 03:32:40 -0500 Subject: [PATCH 15/23] Removed some diagnostic spam pertaining to shaders. --- indra/newview/llviewershadermgr.cpp | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 4c1a50296..d29dc6cef 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -2026,25 +2026,16 @@ BOOL LLViewerShaderMgr::loadShadersObject() if(no_index && !mask) { - llinfos << "Skipping Simple" << name << llendl; - llinfos << "Skipping Fullbright" << name << llendl; - llinfos << "Skipping Emissive" << name << llendl; continue; //all non-indexed shaders here have alphamasks; } if(skin && (!no_index || mVertexShaderLevel[SHADER_AVATAR] < 1)) { - llinfos << "Skipping Simple" << name << llendl; - llinfos << "Skipping Fullbright" << name << llendl; - llinfos << "Skipping Emissive" << name << llendl; continue; //Skins are always non-indexed. } if(shiny && mask && !skin && !no_index) { - llinfos << "Skipping Simple" << name << llendl; - llinfos << "Skipping Fullbright" << name << llendl; - llinfos << "Skipping Emissive" << name << llendl; continue; //non-skinned indexed shiny does not support alphamasking } @@ -2063,8 +2054,6 @@ BOOL LLViewerShaderMgr::loadShadersObject() features.hasObjectSkinning = skin; features.isShiny = shiny; - llinfos << "Compiling Simple" << name << llendl; - gObjectSimpleProgram[i].mName = std::string("Simple") + name + " Shader"; gObjectSimpleProgram[i].mFeatures = features; gObjectSimpleProgram[i].mShaderFiles.clear(); @@ -2091,8 +2080,6 @@ BOOL LLViewerShaderMgr::loadShadersObject() features.isFullbright = true; features.hasGamma |= (shiny && fog); - llinfos << "Compiling Fullbright" << name << llendl; - gObjectFullbrightProgram[i].mName = std::string("Fullbright") + name + " Shader"; gObjectFullbrightProgram[i].mFeatures = features; gObjectFullbrightProgram[i].mShaderFiles.clear(); @@ -2114,8 +2101,6 @@ BOOL LLViewerShaderMgr::loadShadersObject() if(!shiny) { - llinfos << "Compiling Emissive" << name << llendl; - gObjectEmissiveProgram[i].mName = std::string("Emissive") + name + " Shader"; gObjectEmissiveProgram[i].mFeatures = features; gObjectEmissiveProgram[i].mShaderFiles.clear(); @@ -2127,10 +2112,6 @@ BOOL LLViewerShaderMgr::loadShadersObject() if(!(success = gObjectEmissiveProgram[i].createShader(NULL, NULL))) break; } - else - { - llinfos << "Skipping Emissive" << name << llendl; - } } } From a756943628b0977b3fa30ba63f597fb1c08a093a Mon Sep 17 00:00:00 2001 From: Shyotl Date: Sat, 17 May 2014 03:33:33 -0500 Subject: [PATCH 16/23] Fix a LLVertexBuffer::validateRange call that I hosed up pretty badly. --- indra/newview/llvopartgroup.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp index c1c57ab32..0e17c77ef 100644 --- a/indra/newview/llvopartgroup.cpp +++ b/indra/newview/llvopartgroup.cpp @@ -991,7 +991,7 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group) if(facep->getGeomCount() > 0) { - buffer->validateRange(facep->getGeomIndex(), facep->getGeomCount() - 1, facep->getIndicesCount(), 0); + buffer->validateRange(facep->getGeomIndex(), facep->getGeomIndex() + facep->getGeomCount() - 1, facep->getIndicesCount(), facep->getIndicesStart()); } } From e35039faf785ada861d4d1bd62631e7528b94fd0 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Sat, 17 May 2014 03:34:33 -0500 Subject: [PATCH 17/23] Remove deprecated gl call in renderComplexityDisplay. --- indra/newview/llspatialpartition.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 627df738a..41890cdaa 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -2777,7 +2777,7 @@ void renderComplexityDisplay(LLDrawable* drawablep) // don't highlight objects below the threshold if (cost > gSavedSettings.getS32("RenderComplexityThreshold")) { - glColor4f(color[0],color[1],color[2],0.5f); + gGL.diffuseColor4f(color[0],color[1],color[2],0.5f); S32 num_faces = drawablep->getNumFaces(); From 0a89503edd5bfc2b62498c256aa0586446468963 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Sat, 17 May 2014 04:04:33 -0500 Subject: [PATCH 18/23] Renamed glUniformMatrix3x4fvARB to glUniformMatrix3x4fv, since I don't think it ever had the ARB postfix. Also use its the properly named (although identical to the current) function pointer signature. --- indra/llrender/llgl.cpp | 4 ++-- indra/llrender/llglheaders.h | 6 +++--- indra/llrender/llglslshader.cpp | 2 +- indra/newview/llfeaturemanager.cpp | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index 1886a4d48..2b1aacdfe 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -304,7 +304,7 @@ PFNGLUNIFORM3IVARBPROC glUniform3ivARB = NULL; PFNGLUNIFORM4IVARBPROC glUniform4ivARB = NULL; PFNGLUNIFORMMATRIX2FVARBPROC glUniformMatrix2fvARB = NULL; PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB = NULL; -PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3x4fvARB = NULL; +PFNGLUNIFORMMATRIX3X4FVPROC glUniformMatrix3x4fv = NULL; PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB = NULL; PFNGLGETOBJECTPARAMETERFVARBPROC glGetObjectParameterfvARB = NULL; PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB = NULL; @@ -1277,7 +1277,7 @@ void LLGLManager::initExtensions() glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniform4ivARB"); glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniformMatrix2fvARB"); glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniformMatrix3fvARB"); - glUniformMatrix3x4fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniformMatrix3x4fv"); + glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC) GLH_EXT_GET_PROC_ADDRESS("glUniformMatrix3x4fv"); glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glUniformMatrix4fvARB"); glGetObjectParameterfvARB = (PFNGLGETOBJECTPARAMETERFVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetObjectParameterfvARB"); glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetObjectParameterivARB"); diff --git a/indra/llrender/llglheaders.h b/indra/llrender/llglheaders.h index 341c3adc9..5aeed87ae 100644 --- a/indra/llrender/llglheaders.h +++ b/indra/llrender/llglheaders.h @@ -152,7 +152,7 @@ extern PFNGLUNIFORM3IVARBPROC glUniform3ivARB; extern PFNGLUNIFORM4IVARBPROC glUniform4ivARB; extern PFNGLUNIFORMMATRIX2FVARBPROC glUniformMatrix2fvARB; extern PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB; -extern PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3x4fvARB; +extern PFNGLUNIFORMMATRIX3X4FVPROC glUniformMatrix3x4fv; extern PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB; extern PFNGLGETOBJECTPARAMETERFVARBPROC glGetObjectParameterfvARB; extern PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB; @@ -416,7 +416,7 @@ extern PFNGLUNIFORM3IVARBPROC glUniform3ivARB; extern PFNGLUNIFORM4IVARBPROC glUniform4ivARB; extern PFNGLUNIFORMMATRIX2FVARBPROC glUniformMatrix2fvARB; extern PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB; -extern PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3x4fvARB; +extern PFNGLUNIFORMMATRIX3X4FVPROC glUniformMatrix3x4fv; extern PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB; extern PFNGLGETOBJECTPARAMETERFVARBPROC glGetObjectParameterfvARB; extern PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB; @@ -658,7 +658,7 @@ extern PFNGLUNIFORM3IVARBPROC glUniform3ivARB; extern PFNGLUNIFORM4IVARBPROC glUniform4ivARB; extern PFNGLUNIFORMMATRIX2FVARBPROC glUniformMatrix2fvARB; extern PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3fvARB; -extern PFNGLUNIFORMMATRIX3FVARBPROC glUniformMatrix3x4fvARB; +extern PFNGLUNIFORMMATRIX3X4FVPROC glUniformMatrix3x4fv; extern PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB; extern PFNGLGETOBJECTPARAMETERFVARBPROC glGetObjectParameterfvARB; extern PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB; diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index 7f09a3be8..19c2722e7 100644 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -945,7 +945,7 @@ void LLGLSLShader::uniformMatrix3x4fv(U32 index, U32 count, GLboolean transpose, if (mUniform[index] >= 0) { - glUniformMatrix3x4fvARB(mUniform[index], count, transpose, v); + glUniformMatrix3x4fv(mUniform[index], count, transpose, v); } } } diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index f58f1f577..f662ab31d 100644 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -637,7 +637,7 @@ void LLFeatureManager::applyBaseMasks() if (gGLManager.mGLVersion < 3.f) { maskFeatures("OpenGLPre30"); - if(gGLManager.mGLVersion < 2.1f || glUniformMatrix3x4fvARB == NULL) //glUniformMatrix3x4fv is part of glsl 1.20 spec. + if(gGLManager.mGLVersion < 2.1f || glUniformMatrix3x4fv == NULL) //glUniformMatrix3x4fv is part of glsl 1.20 spec. { maskFeatures("OpenGLPre21"); if (gGLManager.mGLVersion < 1.5f) From a1eb30ae873aafd2ca03248b81b3650e2d5fdade Mon Sep 17 00:00:00 2001 From: Shyotl Date: Sat, 17 May 2014 18:25:21 -0500 Subject: [PATCH 19/23] Keep old non-swizzle method around since GL_ARB_texture_swizzle has poor support prior to 3.3 (on osx especially) --- indra/llrender/llgl.cpp | 5 ++ indra/llrender/llgl.h | 1 + indra/llrender/llimagegl.cpp | 107 +++++++++++++++++++++++++++-------- 3 files changed, 90 insertions(+), 23 deletions(-) diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index 2b1aacdfe..11d8fa557 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -972,6 +972,10 @@ void LLGLManager::initExtensions() mHasAdaptiveVsync = ExtensionExists("GLX_EXT_swap_control_tear", gGLHExts.mSysExts); #endif +#ifdef GL_ARB_texture_swizzle + mHasTextureSwizzle = ExtensionExists("GL_ARB_texture_swizzle", gGLHExts.mSysExts); +#endif + #if LL_LINUX || LL_SOLARIS llinfos << "initExtensions() checking shell variables to adjust features..." << llendl; // Our extension support for the Linux Client is very young with some @@ -997,6 +1001,7 @@ void LLGLManager::initExtensions() mHasVertexShader = FALSE; mHasFragmentShader = FALSE; mHasAdaptiveVsync = FALSE; + mHasTextureSwizzle = FALSE; LL_WARNS("RenderInit") << "GL extension support DISABLED via LL_GL_NOEXT" << LL_ENDL; } else if (getenv("LL_GL_BASICEXT")) /* Flawfinder: ignore */ diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h index 7a11d1b2e..7b691e021 100644 --- a/indra/llrender/llgl.h +++ b/indra/llrender/llgl.h @@ -114,6 +114,7 @@ public: BOOL mHasDebugOutput; BOOL mHasAdaptiveVsync; + BOOL mHasTextureSwizzle; // Vendor-specific extensions BOOL mIsATI; diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index f6ea462d1..2ad5d355e 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -1088,35 +1088,96 @@ static LLFastTimer::DeclareTimer FTM_SET_MANUAL_IMAGE("setManualImage"); void LLImageGL::setManualImage(U32 target, S32 miplevel, S32 intformat, S32 width, S32 height, U32 pixformat, U32 pixtype, const void *pixels, bool allow_compression) { LLFastTimer t(FTM_SET_MANUAL_IMAGE); + std::vector scratch; if (LLRender::sGLCoreProfile) { - if (pixformat == GL_ALPHA) - { //GL_ALPHA is deprecated, convert to RGBA - const GLint mask[] = {GL_ZERO, GL_ZERO, GL_ZERO, GL_RED}; - glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, mask); - pixformat = GL_RED; - intformat = GL_R8; +#ifdef GL_ARB_texture_swizzle + if(gGLManager.mHasTextureSwizzle) + { + if (pixformat == GL_ALPHA) + { //GL_ALPHA is deprecated, convert to RGBA + const GLint mask[] = {GL_ZERO, GL_ZERO, GL_ZERO, GL_RED}; + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, mask); + pixformat = GL_RED; + intformat = GL_R8; + } + + if (pixformat == GL_LUMINANCE) + { //GL_LUMINANCE is deprecated, convert to GL_RGBA + const GLint mask[] = {GL_RED, GL_RED, GL_RED, GL_ONE}; + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, mask); + pixformat = GL_RED; + intformat = GL_R8; + } + + if (pixformat == GL_LUMINANCE_ALPHA) + { //GL_LUMINANCE_ALPHA is deprecated, convert to RGBA + const GLint mask[] = {GL_RED, GL_RED, GL_RED, GL_GREEN}; + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, mask); + pixformat = GL_RG; + intformat = GL_RG8; + } } + else +#endif + { + if (pixformat == GL_ALPHA && pixtype == GL_UNSIGNED_BYTE) + { //GL_ALPHA is deprecated, convert to RGBA + scratch.resize(width*height); + pixels = &scratch[0]; - if (pixformat == GL_LUMINANCE) - { //GL_LUMINANCE is deprecated, convert to GL_RGBA - const GLint mask[] = {GL_RED, GL_RED, GL_RED, GL_ONE}; - glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, mask); - pixformat = GL_RED; - intformat = GL_R8; + U32 pixel_count = (U32) (width*height); + for (U32 i = 0; i < pixel_count; i++) + { + U8* pix = (U8*) &scratch[i]; + pix[0] = pix[1] = pix[2] = 0; + pix[3] = ((U8*) pixels)[i]; + } + + pixformat = GL_RGBA; + intformat = GL_RGBA8; + } + + if (pixformat == GL_LUMINANCE_ALPHA && pixtype == GL_UNSIGNED_BYTE) + { //GL_LUMINANCE_ALPHA is deprecated, convert to RGBA + scratch.resize(width*height); + pixels = &scratch[0]; + + U32 pixel_count = (U32) (width*height); + for (U32 i = 0; i < pixel_count; i++) + { + U8 lum = ((U8*) pixels)[i*2+0]; + U8 alpha = ((U8*) pixels)[i*2+1]; + + U8* pix = (U8*) &scratch[i]; + pix[0] = pix[1] = pix[2] = lum; + pix[3] = alpha; + } + + pixformat = GL_RGBA; + intformat = GL_RGBA8; + } + + if (pixformat == GL_LUMINANCE && pixtype == GL_UNSIGNED_BYTE) + { //GL_LUMINANCE_ALPHA is deprecated, convert to RGB + scratch.resize(width*height); + pixels = &scratch[0]; + + U32 pixel_count = (U32) (width*height); + for (U32 i = 0; i < pixel_count; i++) + { + U8 lum = ((U8*) pixels)[i]; + + U8* pix = (U8*) &scratch[i]; + pix[0] = pix[1] = pix[2] = lum; + pix[3] = 255; + } + + pixformat = GL_RGBA; + intformat = GL_RGB8; + } } - - if (pixformat == GL_LUMINANCE_ALPHA) - { //GL_LUMINANCE_ALPHA is deprecated, convert to RGBA - const GLint mask[] = {GL_RED, GL_RED, GL_RED, GL_GREEN}; - glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, mask); - pixformat = GL_RG; - intformat = GL_RG8; - } - - } - if (LLImageGL::sCompressTextures && allow_compression) { switch (intformat) From 4851f1ad486228361fb4d141f9b1639c95dcfb8e Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Sun, 25 May 2014 04:07:34 +0200 Subject: [PATCH 20/23] Branding support for Linux packaging --- indra/newview/viewer_manifest.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 77e5907d6..51d47563e 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -741,13 +741,13 @@ class LinuxManifest(ViewerManifest): self.path("featuretable_linux.txt") def wrapper_name(self): - return 'singularity' + return self.viewer_branding_id() def binary_name(self): - return 'singularity-do-not-run-directly' + return self.viewer_branding_id() + '-do-not-run-directly' def icon_name(self): - return "singularity_icon.png" + return self.viewer_branding_id() + "_icon.png" def package_finish(self): if 'installer_name' in self.args: From 22cded7cccd8537a60d0c200d52b2fdd68b057c7 Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Sun, 25 May 2014 08:27:00 +0200 Subject: [PATCH 21/23] Made breakpad symbols generation branding neutral --- indra/newview/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 008e1d420..1d9ed39c6 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1798,7 +1798,7 @@ if (PACKAGE) if (LINUX) list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/packaged") set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-linux.tar.bz2") - set(VIEWER_EXE_GLOBS "singularity-do-not-run-directly SLPlugin") + set(VIEWER_EXE_GLOBS "${VIEWER_BRANDING_ID}-do-not-run-directly SLPlugin") set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}*") set(VIEWER_COPY_MANIFEST copy_l_viewer_manifest) endif (LINUX) From 1dbd913d9db26799c16765e0e1fc1e773790f219 Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Sun, 25 May 2014 16:57:35 +0200 Subject: [PATCH 22/23] Branding: generate wrapper script with cmake --- indra/cmake/BuildVersion.cmake | 7 +++++++ indra/newview/linux_tools/{wrapper.sh => wrapper.sh.in} | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) rename indra/newview/linux_tools/{wrapper.sh => wrapper.sh.in} (97%) diff --git a/indra/cmake/BuildVersion.cmake b/indra/cmake/BuildVersion.cmake index d2981fcd3..271ee864a 100644 --- a/indra/cmake/BuildVersion.cmake +++ b/indra/cmake/BuildVersion.cmake @@ -52,6 +52,13 @@ if (DARWIN) ) endif (DARWIN) +if (LINUX) + configure_file( + ${CMAKE_SOURCE_DIR}/newview/linux_tools/wrapper.sh.in + ${CMAKE_SOURCE_DIR}/newview/linux_tools/wrapper.sh + ) +endif (LINUX) + # Compose the version. set(viewer_VERSION "${vMAJOR}.${vMINOR}.${vPATCH}.${vBUILD}") if (viewer_VERSION MATCHES "^[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+$") diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh.in similarity index 97% rename from indra/newview/linux_tools/wrapper.sh rename to indra/newview/linux_tools/wrapper.sh.in index 9dd8caf36..d1fd3104d 100755 --- a/indra/newview/linux_tools/wrapper.sh +++ b/indra/newview/linux_tools/wrapper.sh.in @@ -64,7 +64,7 @@ if [ -n "$ASCENDED_DEVELOPER" ]; then elif [ "$ASCENDED_DEVELOPER" = "2" ]; then export LL_WRAPPER='valgrind --smc-check=all --error-limit=no --log-file=secondlife.vg --leak-check=full --suppressions=/usr/lib/valgrind/glibc-2.5.supp --suppressions=secondlife-i686.supp' elif [ "$ASCENDED_DEVELOPER" = "3" ]; then - export LL_WRAPPER='strace -f -ff -o singularity.strace' + export LL_WRAPPER='strace -f -ff -o ${VIEWER_BRANDING_ID}.strace' fi fi @@ -142,7 +142,7 @@ if [ -n "$LL_TCMALLOC" ]; then fi fi -export VIEWER_BINARY='singularity-do-not-run-directly' +export VIEWER_BINARY='${VIEWER_BRANDING_ID}-do-not-run-directly' BINARY_TYPE=$(expr match "$(file -b bin/$VIEWER_BINARY)" '\(.*executable\)' | sed -e 's/ / /g') if [ "${BINARY_TYPE}" == "ELF 64-bit LSB executable" ]; then SL_ENV+='LD_LIBRARY_PATH="`pwd`/lib64:`pwd`/lib32:$LD_LIBRARY_PATH"' From 8497ba18983486e8dc3df23bf62558c009b760b4 Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Tue, 27 May 2014 17:35:37 +0200 Subject: [PATCH 23/23] Use @style@ cmake escapes for the linux wrapper script This avoids cmake messing up shell variables --- indra/cmake/BuildVersion.cmake | 1 + indra/newview/linux_tools/wrapper.sh.in | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/indra/cmake/BuildVersion.cmake b/indra/cmake/BuildVersion.cmake index 271ee864a..81b5d5dee 100644 --- a/indra/cmake/BuildVersion.cmake +++ b/indra/cmake/BuildVersion.cmake @@ -56,6 +56,7 @@ if (LINUX) configure_file( ${CMAKE_SOURCE_DIR}/newview/linux_tools/wrapper.sh.in ${CMAKE_SOURCE_DIR}/newview/linux_tools/wrapper.sh + @ONLY ) endif (LINUX) diff --git a/indra/newview/linux_tools/wrapper.sh.in b/indra/newview/linux_tools/wrapper.sh.in index d1fd3104d..40719f8d1 100755 --- a/indra/newview/linux_tools/wrapper.sh.in +++ b/indra/newview/linux_tools/wrapper.sh.in @@ -64,7 +64,7 @@ if [ -n "$ASCENDED_DEVELOPER" ]; then elif [ "$ASCENDED_DEVELOPER" = "2" ]; then export LL_WRAPPER='valgrind --smc-check=all --error-limit=no --log-file=secondlife.vg --leak-check=full --suppressions=/usr/lib/valgrind/glibc-2.5.supp --suppressions=secondlife-i686.supp' elif [ "$ASCENDED_DEVELOPER" = "3" ]; then - export LL_WRAPPER='strace -f -ff -o ${VIEWER_BRANDING_ID}.strace' + export LL_WRAPPER='strace -f -ff -o @VIEWER_BRANDING_ID@.strace' fi fi @@ -142,7 +142,7 @@ if [ -n "$LL_TCMALLOC" ]; then fi fi -export VIEWER_BINARY='${VIEWER_BRANDING_ID}-do-not-run-directly' +export VIEWER_BINARY='@VIEWER_BRANDING_ID@-do-not-run-directly' BINARY_TYPE=$(expr match "$(file -b bin/$VIEWER_BINARY)" '\(.*executable\)' | sed -e 's/ / /g') if [ "${BINARY_TYPE}" == "ELF 64-bit LSB executable" ]; then SL_ENV+='LD_LIBRARY_PATH="`pwd`/lib64:`pwd`/lib32:$LD_LIBRARY_PATH"'