diff options
Diffstat (limited to 'indra')
80 files changed, 5244 insertions, 1961 deletions
| diff --git a/indra/llcommon/llprofiler.h b/indra/llcommon/llprofiler.h index f6a4d24747..d058f50c97 100644 --- a/indra/llcommon/llprofiler.h +++ b/indra/llcommon/llprofiler.h @@ -71,7 +71,7 @@  #define LL_PROFILER_CONFIG_TRACY_FAST_TIMER 3  // Profiling on: Fast Timers + Tracy  #ifndef LL_PROFILER_CONFIGURATION -#define LL_PROFILER_CONFIGURATION           LL_PROFILER_CONFIG_FAST_TIMER +#define LL_PROFILER_CONFIGURATION           0  #endif  extern thread_local bool gProfilerEnabled; @@ -88,6 +88,7 @@ extern thread_local bool gProfilerEnabled;      #endif +      #if LL_PROFILER_CONFIGURATION == LL_PROFILER_CONFIG_TRACY          #define LL_PROFILER_FRAME_END                   FrameMark          #define LL_PROFILER_SET_THREAD_NAME( name )     tracy::SetThreadName( name );    gProfilerEnabled = true; @@ -155,6 +156,28 @@ extern thread_local bool gProfilerEnabled;  #else      #define LL_PROFILER_FRAME_END      #define LL_PROFILER_SET_THREAD_NAME( name ) (void)(name) + +        #define LL_PROFILER_FRAME_END +        #define LL_PROFILER_SET_THREAD_NAME( name )      (void)(name) +        #define LL_RECORD_BLOCK_TIME(name) +        #define LL_PROFILE_ZONE_NAMED(name)             // LL_PROFILE_ZONE_NAMED is a no-op when Tracy is disabled +        #define LL_PROFILE_ZONE_NAMED_COLOR(name,color) // LL_PROFILE_ZONE_NAMED_COLOR is a no-op when Tracy is disabled +        #define LL_PROFILE_ZONE_SCOPED                  // LL_PROFILE_ZONE_SCOPED is a no-op when Tracy is disabled +        #define LL_PROFILE_ZONE_COLOR(name,color)       // LL_RECORD_BLOCK_TIME(name) + +        #define LL_PROFILE_ZONE_NUM( val )              (void)( val );                // Not supported +        #define LL_PROFILE_ZONE_TEXT( text, size )      (void)( text ); void( size ); // Not supported + +        #define LL_PROFILE_ZONE_ERR(name)               (void)(name); // Not supported +        #define LL_PROFILE_ZONE_INFO(name)              (void)(name); // Not supported +        #define LL_PROFILE_ZONE_WARN(name)              (void)(name); // Not supported + +        #define LL_PROFILE_MUTEX(type, varname) type varname +        #define LL_PROFILE_MUTEX_NAMED(type, varname, desc) type varname +        #define LL_PROFILE_MUTEX_SHARED(type, varname) type varname +        #define LL_PROFILE_MUTEX_SHARED_NAMED(type, varname, desc) type varname +        #define LL_PROFILE_MUTEX_LOCK(varname) // LL_PROFILE_MUTEX_LOCK is a no-op when Tracy is disabled +  #endif // LL_PROFILER  #if LL_PROFILER_ENABLE_TRACY_OPENGL diff --git a/indra/llrender/llcubemaparray.cpp b/indra/llrender/llcubemaparray.cpp index fb35e002df..e0a8782c33 100644 --- a/indra/llrender/llcubemaparray.cpp +++ b/indra/llrender/llcubemaparray.cpp @@ -114,6 +114,8 @@ LLCubeMapArray::LLCubeMapArray(LLCubeMapArray& lhs, U32 width, U32 count) : mTex      allocate(mWidth, lhs.mImage->getComponents(), count, lhs.mImage->getUseMipMaps(), lhs.mHDR);      // Copy each cubemap from the incoming array to the new array +    // The call to glTexSubImage3D causes an INVALID OPERATION OpenGL error. For now we comment this.. +    /*      U32 min_count = std::min(count, lhs.mCount);      for (U32 i = 0; i < min_count * 6; ++i)      { @@ -133,6 +135,7 @@ LLCubeMapArray::LLCubeMapArray(LLCubeMapArray& lhs, U32 width, U32 count) : mTex              glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 0, 0, i, mWidth, mWidth, 1, components, GL_UNSIGNED_BYTE, scaled_image->getData());          }      } +    */  }  LLCubeMapArray::~LLCubeMapArray() diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index ac66faaf5a..cc619e2086 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -2279,26 +2279,28 @@ void rotate_quat(LLQuaternion& rotation)  void flush_glerror()  { +    if(!gDebugGL) return;      glGetError();  } -//this function outputs gl error to the log file, does not crash the code. -void log_glerror() +void log_glerror(std::string comment)  { +    if(!gDebugGL) return; +      if (LL_UNLIKELY(!gGLManager.mInited))      {          return ;      } -    //  Create or update texture to be used with this data +      GLenum error;      error = glGetError(); -    while (LL_UNLIKELY(error)) +    if (error != GL_NO_ERROR)      {  #if GLU_VERSION_1_1          GLubyte const * gl_error_msg = gluErrorString(error);          if (NULL != gl_error_msg)          { -            LL_WARNS() << "GL Error: " << error << " GL Error String: " << gl_error_msg << LL_ENDL ; +            LL_WARNS() << "GL Error (" << comment << ")" << error << ": " << gl_error_msg << LL_ENDL;          }          else  #endif // GLU_VERSION_1_1 @@ -2307,7 +2309,6 @@ void log_glerror()              // you'll probably have to grep for the number in glext.h.              LL_WARNS() << "GL Error: UNKNOWN 0x" << std::hex << error << std::dec << LL_ENDL;          } -        error = glGetError();      }  } @@ -2385,6 +2386,7 @@ void assert_glerror()  void clear_glerror()  { +    if(!gDebugGL) return;      glGetError();      glGetError();  } diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h index bf8368a7b3..130b06f9df 100644 --- a/indra/llrender/llgl.h +++ b/indra/llrender/llgl.h @@ -154,17 +154,20 @@ void rotate_quat(LLQuaternion& rotation);  void flush_glerror(); // Flush GL errors when we know we're handling them correctly. -void log_glerror(); +void log_glerror(std::string comment);  void assert_glerror();  void clear_glerror(); -#if !LL_RELEASE_FOR_DOWNLOAD -# define stop_glerror() assert_glerror() -# define llglassertok() assert_glerror() -# define STOP_GLERROR stop_glerror() +//#if !LL_RELEASE_FOR_DOWNLOAD +#if 1 +# define LOG_GLERROR(COMMENT) log_glerror(COMMENT) +# define stop_glerror() log_glerror("stop") +# define llglassertok() log_glerror("ASSERTOK") +# define STOP_GLERROR log_glerror("STOP")  #else +# define LOG_GLERROR(COMMENT)  # define stop_glerror()  # define llglassertok()  # define STOP_GLERROR diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index 558c3b062a..42af68c276 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -358,6 +358,7 @@ S32 LLImageGL::dataFormatBits(S32 dataformat)  #endif      case GL_DEPTH_COMPONENT:                        return 24;      case GL_DEPTH_COMPONENT24:                      return 24; +    case GL_RGBA16:                                 return 64;      case GL_R16F:                                   return 16;      case GL_RG16F:                                  return 32;      case GL_RGB16F:                                 return 48; @@ -1290,7 +1291,7 @@ bool LLImageGL::setSubImageFromFrameBuffer(S32 fb_x, S32 fb_y, S32 x_pos, S32 y_      {          glCopyTexSubImage2D(GL_TEXTURE_2D, 0, fb_x, fb_y, x_pos, y_pos, width, height);          mGLTextureCreated = true; -        stop_glerror(); +        LOG_GLERROR("LLImageGL::setSubImageFromFrameBuffer()");          return true;      }      else @@ -2583,6 +2584,8 @@ bool LLImageGL::scaleDown(S32 desired_discard)          return false;      } +    //LL_WARNS() << "scaleDown" << LL_ENDL; +      S32 mip = desired_discard - mCurrentDiscardLevel;      S32 desired_width = getWidth(desired_discard); @@ -2600,6 +2603,7 @@ bool LLImageGL::scaleDown(S32 desired_discard)              free_tex_image(mTexName);              glTexImage2D(mTarget, 0, mFormatInternal, desired_width, desired_height, 0, mFormatPrimary, mFormatType, nullptr);              glCopyTexSubImage2D(mTarget, 0, 0, 0, 0, 0, desired_width, desired_height); +            LOG_GLERROR("LLImageGL::scaleDown() - glCopyTexSubImage2D");              alloc_tex_image(desired_width, desired_height, mFormatInternal, 1);              mTexOptionsDirty = true; @@ -2609,6 +2613,7 @@ bool LLImageGL::scaleDown(S32 desired_discard)                  LL_PROFILE_ZONE_NAMED_CATEGORY_TEXTURE("scaleDown - glGenerateMipmap");                  gGL.getTexUnit(0)->bind(this);                  glGenerateMipmap(mTarget); +                LOG_GLERROR("LLImageGL::scaleDown() - glGenerateMipmap");                  gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);              }          } diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index cbb178b6f8..d0e268f08c 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -1,4 +1,4 @@ - /** +/**   * @file llrender.cpp   * @brief LLRender implementation   * @@ -139,21 +139,21 @@ U32 LLTexUnit::getInternalType(eTextureType type)  void LLTexUnit::refreshState(void)  { -    // We set dirty to true so that the tex unit knows to ignore caching -    // and we reset the cached tex unit state +// We set dirty to true so that the tex unit knows to ignore caching +// and we reset the cached tex unit state -    gGL.flush(); +gGL.flush(); -    glActiveTexture(GL_TEXTURE0 + mIndex); +glActiveTexture(GL_TEXTURE0 + mIndex); -    if (mCurrTexType != TT_NONE) -    { -        glBindTexture(sGLTextureType[mCurrTexType], mCurrTexture); -    } -    else -    { -        glBindTexture(GL_TEXTURE_2D, 0); -    } +if (mCurrTexType != TT_NONE) +{ +    glBindTexture(sGLTextureType[mCurrTexType], mCurrTexture); +} +else +{ +    glBindTexture(GL_TEXTURE_2D, 0); +}  }  void LLTexUnit::activate(void) @@ -203,6 +203,7 @@ void LLTexUnit::bindFast(LLTexture* texture)      glActiveTexture(GL_TEXTURE0 + mIndex);      gGL.mCurrTextureUnitIndex = mIndex;      mCurrTexture = gl_tex->getTexName(); +    mCurrTexType = gl_tex->getTarget();      if (!mCurrTexture)      {          LL_PROFILE_ZONE_NAMED("MISSING TEXTURE"); @@ -479,41 +480,49 @@ void LLTexUnit::setTextureFilteringOption(LLTexUnit::eTextureFilterOptions optio  {      if (mIndex < 0 || mCurrTexture == 0 || mCurrTexType == LLTexUnit::TT_MULTISAMPLE_TEXTURE) return; +    GLenum target = sGLTextureType[mCurrTexType]; + +    if (mCurrTexType == LLTexUnit::TT_NONE) +    { +        LL_WARNS() << "setTextureFilteringOption() Error: mCurrTexType==TT_NONE texture: " << mCurrTexture << LL_ENDL; +        gGL.debugTexUnits(); +    } +      gGL.flush();      if (option == TFO_POINT)      { -        glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_MAG_FILTER, GL_NEAREST); +        glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);      }      else      { -        glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_MAG_FILTER, GL_LINEAR); +        glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);      }      if (option >= TFO_TRILINEAR && mHasMipMaps)      { -        glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); +        glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);      }      else if (option >= TFO_BILINEAR)      {          if (mHasMipMaps)          { -            glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); +            glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);          }          else          { -            glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_MIN_FILTER, GL_LINEAR); +            glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);          }      }      else      {          if (mHasMipMaps)          { -            glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); +            glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);          }          else          { -            glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_MIN_FILTER, GL_NEAREST); +            glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);          }      } @@ -521,11 +530,11 @@ void LLTexUnit::setTextureFilteringOption(LLTexUnit::eTextureFilterOptions optio      {          if (LLImageGL::sGlobalUseAnisotropic && option == TFO_ANISOTROPIC)          { -            glTexParameterf(sGLTextureType[mCurrTexType], GL_TEXTURE_MAX_ANISOTROPY_EXT, gGLManager.mMaxAnisotropy); +            glTexParameterf(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, gGLManager.mMaxAnisotropy);          }          else          { -            glTexParameterf(sGLTextureType[mCurrTexType], GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.f); +            glTexParameterf(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.f);          }      }  } @@ -651,12 +660,12 @@ void LLTexUnit::debugTextureUnit(void)  LLLightState::LLLightState(S32 index)  : mIndex(index), -  mEnabled(false), -  mConstantAtten(1.f), -  mLinearAtten(0.f), -  mQuadraticAtten(0.f), -  mSpotExponent(0.f), -  mSpotCutoff(180.f) +mEnabled(false), +mConstantAtten(1.f), +mLinearAtten(0.f), +mQuadraticAtten(0.f), +mSpotExponent(0.f), +mSpotCutoff(180.f)  {      if (mIndex == 0)      { @@ -815,7 +824,7 @@ void LLLightState::setSpotDirection(const LLVector3& direction)  }  LLRender::LLRender() -  : mDirty(false), +: mDirty(false),      mCount(0),      mMode(LLRender::TRIANGLES),      mCurrTextureUnitIndex(0) @@ -908,13 +917,12 @@ bool LLRender::init(bool needs_vertex_buffer)  void LLRender::initVertexBuffer()  {      llassert_always(mBuffer.isNull()); -    stop_glerror();      mBuffer = new LLVertexBuffer(immediate_mask); -    mBuffer->allocateBuffer(4096, 0); +    mBuffer->allocateBuffer(16384, 0);      mBuffer->getVertexStrider(mVerticesp);      mBuffer->getTexCoord0Strider(mTexcoordsp);      mBuffer->getColorStrider(mColorsp); -    stop_glerror(); +    LOG_GLERROR("LLRender::initVertexBuffer()");  }  void LLRender::resetVertexBuffer() @@ -1000,7 +1008,6 @@ void LLRender::syncLightState()  void LLRender::syncMatrices()  { -    STOP_GLERROR;      LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;      static const U32 name[] = @@ -1145,7 +1152,7 @@ void LLRender::syncMatrices()              syncLightState();          }      } -    STOP_GLERROR; +    LOG_GLERROR("LLRender::syncMatrices()");  }  void LLRender::translatef(const GLfloat& x, const GLfloat& y, const GLfloat& z) @@ -1448,7 +1455,7 @@ void LLRender::blendFunc(eBlendFactor sfactor, eBlendFactor dfactor)  }  void LLRender::blendFunc(eBlendFactor color_sfactor, eBlendFactor color_dfactor, -             eBlendFactor alpha_sfactor, eBlendFactor alpha_dfactor) +            eBlendFactor alpha_sfactor, eBlendFactor alpha_dfactor)  {      llassert(color_sfactor < BF_UNDEF);      llassert(color_dfactor < BF_UNDEF); @@ -1465,7 +1472,7 @@ void LLRender::blendFunc(eBlendFactor color_sfactor, eBlendFactor color_dfactor,          flush();          glBlendFuncSeparate(sGLBlendFactor[color_sfactor], sGLBlendFactor[color_dfactor], -                           sGLBlendFactor[alpha_sfactor], sGLBlendFactor[alpha_dfactor]); +                        sGLBlendFactor[alpha_sfactor], sGLBlendFactor[alpha_dfactor]);      }  } @@ -1555,7 +1562,7 @@ void LLRender::begin(const GLuint& mode)              mMode == LLRender::TRIANGLES ||              mMode == LLRender::POINTS)          { -            flush(); +            flush("LLRender::begin");          }          else if (mCount != 0)          { @@ -1566,7 +1573,7 @@ void LLRender::begin(const GLuint& mode)      }  } -void LLRender::end() +void LLRender::end(std::string comment_)  {      if (mCount == 0)      { @@ -1579,13 +1586,13 @@ void LLRender::end()          mMode != LLRender::POINTS) ||          mCount > 2048)      { -        flush(); +        flush("from end  " + comment_);      }  } -void LLRender::flush() +void LLRender::flush(std::string comment_)  { -    STOP_GLERROR; +    LOG_GLERROR("LLRender::flush() begin " + comment_);      if (mCount > 0)      {          LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE; @@ -1604,8 +1611,8 @@ void LLRender::flush()          {              if (mCount%3 != 0)              { -            count -= (mCount % 3); -            LL_WARNS() << "Incomplete triangle requested." << LL_ENDL; +                count -= (mCount % 3); +                LL_WARNS() << "Incomplete triangle requested." << LL_ENDL;              }          } @@ -1655,6 +1662,8 @@ void LLRender::flush()          resetStriders(count);      } + +    LOG_GLERROR("LLRender::flush() end " + comment_);  }  LLVertexBuffer* LLRender::bufferfromCache(U32 attribute_mask, U32 count) @@ -2026,7 +2035,8 @@ void LLRender::debugTexUnits(void)      std::string active_enabled = "false";      for (U32 i = 0; i < mTexUnits.size(); i++)      { -        if (getTexUnit(i)->mCurrTexType != LLTexUnit::TT_NONE) +        //if (getTexUnit(i)->mCurrTexType != LLTexUnit::TT_NONE) +        if(1)          {              if (i == mCurrTextureUnitIndex) active_enabled = "true";              LL_INFOS("TextureUnit") << "TexUnit: " << i << " Enabled" << LL_ENDL; @@ -2044,8 +2054,19 @@ void LLRender::debugTexUnits(void)                  case LLTexUnit::TT_CUBE_MAP:                      LL_CONT << "Cube Map";                      break; +                case LLTexUnit::TT_CUBE_MAP_ARRAY: +                LL_CONT << "Cube Map Array"; +                    break; + +                case LLTexUnit::TT_MULTISAMPLE_TEXTURE: +                LL_CONT << "Multisample Texture"; +                    break; + +                case LLTexUnit::TT_TEXTURE_3D: +                LL_CONT << "Texture 3D"; +                    break;                  default: -                    LL_CONT << "ARGH!!! NONE!"; +                    LL_CONT << "ARGH!!! NONE! -> type = " << getTexUnit(i)->mCurrTexType;                      break;              }              LL_CONT << ", Texture Bound: " << getTexUnit(i)->mCurrTexture << LL_ENDL; @@ -2108,9 +2129,9 @@ glm::vec3 mul_mat4_vec3(const glm::mat4& mat, const glm::vec3& vec)  #if 1 // SIMD path results in strange crashes. Fall back to scalar for now.      const float w = vec[0] * mat[0][3] + vec[1] * mat[1][3] + vec[2] * mat[2][3] + mat[3][3];      return glm::vec3( -       (vec[0] * mat[0][0] + vec[1] * mat[1][0] + vec[2] * mat[2][0] + mat[3][0]) / w, -       (vec[0] * mat[0][1] + vec[1] * mat[1][1] + vec[2] * mat[2][1] + mat[3][1]) / w, -       (vec[0] * mat[0][2] + vec[1] * mat[1][2] + vec[2] * mat[2][2] + mat[3][2]) / w +    (vec[0] * mat[0][0] + vec[1] * mat[1][0] + vec[2] * mat[2][0] + mat[3][0]) / w, +    (vec[0] * mat[0][1] + vec[1] * mat[1][1] + vec[2] * mat[2][1] + mat[3][1]) / w, +    (vec[0] * mat[0][2] + vec[1] * mat[1][2] + vec[2] * mat[2][2] + mat[3][2]) / w      );  #else      LLVector4a x, y, z, s, t, p, q; diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h index 97c47bcae9..f0f9cd4364 100644 --- a/indra/llrender/llrender.h +++ b/indra/llrender/llrender.h @@ -421,14 +421,14 @@ public:      LLVector3 getUITranslation();      LLVector3 getUIScale(); -    void flush(); +    void flush(std::string comment_ = "");      // if list is set, will store buffers in list for later use, if list isn't set, will use cache      void beginList(std::list<LLVertexBufferData> *list);      void endList();      void begin(const GLuint& mode); -    void end(); +    void end(std::string comment_ = "");      U8 getMode() const { return mMode; } diff --git a/indra/llrender/llrender2dutils.cpp b/indra/llrender/llrender2dutils.cpp index 9144ce6d62..0ee47dec6d 100644 --- a/indra/llrender/llrender2dutils.cpp +++ b/indra/llrender/llrender2dutils.cpp @@ -833,8 +833,7 @@ void gl_line_3d( const LLVector3& start, const LLVector3& end, const LLColor4& c  {      gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], color.mV[VALPHA]); -    gGL.flush(); -    glLineWidth(2.5f); +    LLRender2D::setLineWidth(2.5f);      gGL.begin(LLRender::LINES);      { @@ -1802,12 +1801,10 @@ void LLRender2D::setLineWidth(F32 width)      // If outside the allowed range, glLineWidth fails with "invalid value".      // On Darwin, the range is [1, 1].      static GLfloat range[2]{0.0}; -#if GL_VERSION_1_2      if (range[1] == 0)      {          glGetFloatv(GL_SMOOTH_LINE_WIDTH_RANGE, range);      } -#endif      width *= lerp(LLRender::sUIGLScaleFactor.mV[VX], LLRender::sUIGLScaleFactor.mV[VY], 0.5f);      glLineWidth(llclamp(width, range[0], range[1]));  } diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp index 0e4aa2ee7a..957c85b606 100644 --- a/indra/llrender/llrendertarget.cpp +++ b/indra/llrender/llrendertarget.cpp @@ -158,6 +158,8 @@ void LLRenderTarget::setColorAttachment(LLImageGL* img, LLGLuint use_name)      llassert(mTex.empty()); // mTex must be empty with this mode (binding target should be done via LLImageGL)      llassert(!isBoundInStack()); +    U32 target = getTarget(); +      if (mFBO == 0)      {          glGenFramebuffers(1, (GLuint*)&mFBO); @@ -174,14 +176,14 @@ void LLRenderTarget::setColorAttachment(LLImageGL* img, LLGLuint use_name)      mTex.push_back(use_name); -    glBindFramebuffer(GL_FRAMEBUFFER, mFBO); -    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, +    glBindFramebuffer(target, mFBO); +    glFramebufferTexture2D(target, GL_COLOR_ATTACHMENT0,              LLTexUnit::getInternalType(mUsage), use_name, 0);          stop_glerror();      check_framebuffer_status(); -    glBindFramebuffer(GL_FRAMEBUFFER, sCurFBO); +    glBindFramebuffer(target, sCurFBO);  }  void LLRenderTarget::releaseColorAttachment() @@ -194,6 +196,7 @@ void LLRenderTarget::releaseColorAttachment()      glBindFramebuffer(GL_FRAMEBUFFER, mFBO);      glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, LLTexUnit::getInternalType(mUsage), 0, 0);      glBindFramebuffer(GL_FRAMEBUFFER, sCurFBO); +    LOG_GLERROR(mName + " releaseColorAttachment()");      mTex.clear();  } @@ -208,6 +211,8 @@ bool LLRenderTarget::addColorAttachment(U32 color_fmt)          return true;      } +    U32 target = getTarget(); +      U32 offset = static_cast<U32>(mTex.size());      if( offset >= 4 ) @@ -226,12 +231,76 @@ bool LLRenderTarget::addColorAttachment(U32 color_fmt)      LLImageGL::generateTextures(1, &tex);      gGL.getTexUnit(0)->bindManual(mUsage, tex); -    stop_glerror(); - +    U32 miplevel = mMipLevels; +    U32 intformat = color_fmt; +    U32 pixformat = GL_RGBA; +    U32 pixtype = GL_UNSIGNED_BYTE;      { -        clear_glerror(); -        LLImageGL::setManualImage(LLTexUnit::getInternalType(mUsage), 0, color_fmt, mResX, mResY, GL_RGBA, GL_UNSIGNED_BYTE, NULL, false); +        //clear_glerror(); + +        if(color_fmt == GL_RGB10_A2) +        { +            pixformat = GL_RGBA; +            pixtype = GL_UNSIGNED_BYTE; +        } +        else if(color_fmt == GL_R11F_G11F_B10F) +        { +            pixformat = GL_RGB; +            pixtype = GL_HALF_FLOAT; +        } +        else if(color_fmt == GL_R8) +        { +            pixformat = GL_RED; +            pixtype = GL_UNSIGNED_BYTE; +        } +        else if(color_fmt == GL_R16F) +        { +            pixformat = GL_RED; +            pixtype = GL_HALF_FLOAT; +        } +        else if(color_fmt ==  GL_RG16F) +        { +            pixformat = GL_RG; +            pixtype = GL_HALF_FLOAT; +        } +        else if(color_fmt == GL_RGBA16F) +        { +            pixformat = GL_RGBA; +            pixtype = GL_HALF_FLOAT; +        } +        else if(color_fmt == GL_RGB16F) +        { +            pixformat = GL_RGB; +            pixtype = GL_HALF_FLOAT; +        } +        else if(color_fmt == GL_RGB8) +        { +            pixformat = GL_RGB; +            pixtype = GL_UNSIGNED_BYTE; +        } +        else if(color_fmt == GL_RGB) +        { +            pixformat = GL_RGB; +            pixtype = GL_UNSIGNED_BYTE; +        } +        else if(color_fmt == GL_RGBA) +        { +            pixformat = GL_RGBA; +            pixtype = GL_UNSIGNED_BYTE; +        } +        else if(color_fmt == GL_RGBA8) +        { +            pixformat = GL_RGBA; +            pixtype = GL_UNSIGNED_BYTE; +        } +        else +        { +            pixformat = GL_RGBA; +            pixtype = GL_UNSIGNED_BYTE; +        } + +        LLImageGL::setManualImage(LLTexUnit::getInternalType(mUsage), 0, color_fmt, mResX, mResY, pixformat, pixtype, NULL, false);          if (glGetError() != GL_NO_ERROR)          {              LL_WARNS() << "Could not allocate color buffer for render target." << LL_ENDL; @@ -241,32 +310,30 @@ bool LLRenderTarget::addColorAttachment(U32 color_fmt)      sBytesAllocated += mResX*mResY*4; -    stop_glerror(); - -      if (offset == 0)      { //use bilinear filtering on single texture render targets that aren't multisampled          gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR); -        stop_glerror(); +        LOG_GLERROR(mName + " setting filtering to TFO_BILINEAR");      }      else      { //don't filter data attachments          gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT); -        stop_glerror(); +        LOG_GLERROR(mName + " setting filtering to TFO_POINT");      }  #if GL_VERSION_3_1      if (mUsage != LLTexUnit::TT_RECT_TEXTURE)      {          gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_MIRROR); -        stop_glerror(); +        LOG_GLERROR(mName + " setting address mode to TAM_MIRROR"); +      }      else  #endif      {          // ATI doesn't support mirrored repeat for rectangular textures.          gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); -        stop_glerror(); +        LOG_GLERROR(mName + " setting address mode to TAM_CLAMP");      }      if (mFBO) @@ -285,7 +352,7 @@ bool LLRenderTarget::addColorAttachment(U32 color_fmt)      if (gDebugGL)      { //bind and unbind to validate target -        bindTarget(); +        bindTarget(mName, mMode);          flush();      } @@ -300,16 +367,15 @@ bool LLRenderTarget::allocateDepth()      gGL.getTexUnit(0)->bindManual(mUsage, mDepth);      U32 internal_type = LLTexUnit::getInternalType(mUsage); -    stop_glerror(); -    clear_glerror(); -    LLImageGL::setManualImage(internal_type, 0, GL_DEPTH_COMPONENT24, mResX, mResY, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL, false); + +    LLImageGL::setManualImage(internal_type, 0, GL_DEPTH_COMPONENT24, mResX, mResY, GL_DEPTH_COMPONENT, GL_FLOAT, NULL, false);      gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT);      sBytesAllocated += mResX*mResY*4;      if (glGetError() != GL_NO_ERROR)      { -        LL_WARNS() << "Unable to allocate depth buffer for render target." << LL_ENDL; +        LL_WARNS() << "Unable to allocate depth buffer for render target " << mName << LL_ENDL;          return false;      } @@ -345,6 +411,8 @@ void LLRenderTarget::shareDepthBuffer(LLRenderTarget& target)          glBindFramebuffer(GL_FRAMEBUFFER, sCurFBO); +        LOG_GLERROR(mName + " shareDepthBuffer()"); +          target.mUseDepth = true;      }  } @@ -408,19 +476,32 @@ void LLRenderTarget::release()          LLImageGL::deleteTextures(1, &mTex[0]);      } +    LOG_GLERROR(mName + " release()"); +      mTex.clear();      mInternalFormat.clear();      mResX = mResY = 0;  } -void LLRenderTarget::bindTarget() +void LLRenderTarget::bindTarget(std::string name_, U32 mode_)  {      LL_PROFILE_GPU_ZONE("bindTarget");      llassert(mFBO);      llassert(!isBoundInStack()); -    glBindFramebuffer(GL_FRAMEBUFFER, mFBO); +    //mode_ = 0; + +    mMode = mode_; +    mName = name_; + +    U32 target = getTarget(); + +    glBindFramebuffer(target, mFBO); +    LOG_GLERROR(mName+" bindTarget()"); + +    //attach(); +      sCurFBO = mFBO;      //setup multiple render targets @@ -430,17 +511,34 @@ void LLRenderTarget::bindTarget()                              GL_COLOR_ATTACHMENT3};      if (mTex.empty()) -    { //no color buffer to draw to -        GLenum buffers[] = {GL_NONE}; -        glDrawBuffers(0, buffers); +    {   //no color buffer to draw to +        if(!mUseDepth) LL_WARNS() << mName << " HAS NO COLOR BUFFER AND NO DEPTH!!" << LL_ENDL; +        glDrawBuffer(GL_NONE);          glReadBuffer(GL_NONE);      } -    else +    else if(mMode == 0)      {          glDrawBuffers(static_cast<GLsizei>(mTex.size()), drawbuffers);          glReadBuffer(GL_COLOR_ATTACHMENT0); + +        LOG_GLERROR(mName+" read and write buffers"); + +    } +    else if(mMode == 1) +    { +        glDrawBuffers(static_cast<GLsizei>(mTex.size()), drawbuffers); +        glReadBuffer(GL_NONE); +        LOG_GLERROR(mName+" draw buffer"); +    } +    else if(mMode == 2) +    { +        glDrawBuffer(GL_NONE); +        glReadBuffer(GL_COLOR_ATTACHMENT0); +        LOG_GLERROR(mName+" read buffer");      } +      check_framebuffer_status(); +    LOG_GLERROR(mName+" checked status");      glViewport(0, 0, mResX, mResY);      sCurResX = mResX; @@ -454,24 +552,22 @@ void LLRenderTarget::clear(U32 mask_in)  {      LL_PROFILE_GPU_ZONE("clear");      llassert(mFBO); -    U32 mask = GL_COLOR_BUFFER_BIT; -    if (mUseDepth) -    { -        mask |= GL_DEPTH_BUFFER_BIT; +    U32 mask = 0; + +    if(!mTex.empty()) mask |= GL_COLOR_BUFFER_BIT; +    if (mUseDepth) mask |= GL_DEPTH_BUFFER_BIT; -    }      if (mFBO)      {          check_framebuffer_status(); -        stop_glerror();          glClear(mask & mask_in); -        stop_glerror(); +        LOG_GLERROR(mName + "clear()");      }      else      {          LLGLEnable scissor(GL_SCISSOR_TEST);          glScissor(0, 0, mResX, mResY); -        stop_glerror(); +        LOG_GLERROR("");          glClear(mask & mask_in);      }  } @@ -514,29 +610,43 @@ void LLRenderTarget::bindTexture(U32 index, S32 channel, LLTexUnit::eTextureFilt      }      gGL.getTexUnit(channel)->setTextureFilteringOption(filter_options); + +    LOG_GLERROR(mName + " bindTexture()");  }  void LLRenderTarget::flush()  {      LL_PROFILE_GPU_ZONE("rt flush"); + +    LOG_GLERROR(mName+" rt flush() A"); +      gGL.flush();      llassert(mFBO);      llassert(sCurFBO == mFBO);      llassert(sBoundTarget == this); -    if (mGenerateMipMaps == LLTexUnit::TMG_AUTO) +    if (mGenerateMipMaps == LLTexUnit::TMG_AUTO && mMode != 2)      {          LL_PROFILE_GPU_ZONE("rt generate mipmaps"); -        bindTexture(0, 0, LLTexUnit::TFO_TRILINEAR); +        //bindTexture(0, 0, LLTexUnit::TFO_TRILINEAR); +        bindTexture(0, 0, LLTexUnit::TFO_ANISOTROPIC);          glGenerateMipmap(GL_TEXTURE_2D); +        LOG_GLERROR(mName + " glGenerateMipmap()");      } +    LOG_GLERROR(mName + " rt flush() B"); + +    unbind(); +} + +void LLRenderTarget::unbind() +{      if (mPreviousRT)      {          // a bit hacky -- pop the RT stack back two frames and push          // the previous frame back on to play nice with the GL state machine          sBoundTarget = mPreviousRT->mPreviousRT; -        mPreviousRT->bindTarget(); +        mPreviousRT->bindTarget(mPreviousRT->mName, mPreviousRT->mMode);      }      else      { @@ -547,9 +657,10 @@ void LLRenderTarget::flush()          sCurResX = gGLViewport[2];          sCurResY = gGLViewport[3];          glReadBuffer(GL_BACK); -        GLenum drawbuffers[] = {GL_BACK}; -        glDrawBuffers(1, drawbuffers); +        glDrawBuffer(GL_BACK);      } + +    LOG_GLERROR(mName + " rt unbind()");  }  bool LLRenderTarget::isComplete() const @@ -604,3 +715,13 @@ void LLRenderTarget::swapFBORefs(LLRenderTarget& other)      std::swap(mFBO, other.mFBO);      std::swap(mTex, other.mTex);  } + +U32 LLRenderTarget::getTarget() +{ +    U32 target = GL_FRAMEBUFFER; + +    if(mMode == 1) target = GL_DRAW_FRAMEBUFFER; +    else if(mMode == 2) target = GL_READ_FRAMEBUFFER; + +    return target; +}
\ No newline at end of file diff --git a/indra/llrender/llrendertarget.h b/indra/llrender/llrendertarget.h index cd3290cf66..583d0054ac 100644 --- a/indra/llrender/llrendertarget.h +++ b/indra/llrender/llrendertarget.h @@ -33,9 +33,9 @@  #include "llrender.h"  /* - Wrapper around OpenGL framebuffer objects for use in render-to-texture +Wrapper around OpenGL framebuffer objects for use in render-to-texture - SAMPLE USAGE: +SAMPLE USAGE:      LLRenderTarget target; @@ -126,7 +126,7 @@ public:      //  If an LLRenderTarget is currently bound, stores a reference to that LLRenderTarget      //  and restores previous binding on flush() (maintains a stack of Render Targets)      //  Asserts that this target is not currently bound in the stack -    void bindTarget(); +    void bindTarget(std::string name_ = "nd", U32 mode_ = 0);      //clear render targer, clears depth buffer if present,      //uses scissor rect if in copy-to-texture mode @@ -158,6 +158,7 @@ public:      // If an LLRenderTarget was bound when bindTarget was called, binds that RenderTarget for rendering (maintains RT stack)      // asserts  that this target is currently bound      void flush(); +    void unbind();      //Returns TRUE if target is ready to be rendered into.      //That is, if the target has been allocated with at least @@ -174,11 +175,15 @@ public:      static LLRenderTarget* sBoundTarget; +    U32 mMode; +    std::string mName; +  protected:      U32 mResX;      U32 mResY;      std::vector<U32> mTex;      std::vector<U32> mInternalFormat; +    std::vector<U32> mPixFormat;      U32 mFBO;      LLRenderTarget* mPreviousRT = nullptr; @@ -188,6 +193,10 @@ protected:      U32 mMipLevels;      LLTexUnit::eTextureType mUsage; + +private: +    U32 getTarget(); +  };  #endif diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index 4807c12226..3bc71a7413 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -451,7 +451,7 @@ void LLShaderMgr::dumpObjectLog(GLuint ret, bool warns, const std::string& filen          LL_SHADER_LOADING_WARNS() << "Shader loading from " << fname << LL_ENDL;          LL_SHADER_LOADING_WARNS() << "\n" << log << LL_ENDL;      } - } +}  GLuint LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shader_level, GLenum type, std::map<std::string, std::string>* defines, S32 texture_index_channels)  { @@ -571,7 +571,7 @@ GLuint LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shader_lev              }              else              { -                shader_code_text[shader_code_count++] = strdup("#version 400\n"); +                shader_code_text[shader_code_count++] = strdup("#version 410\n");              }          }          else if (major_version == 3) @@ -740,7 +740,7 @@ GLuint LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shader_lev      //copy file into memory      enum { -          flag_write_to_out_of_extra_block_area = 0x01 +        flag_write_to_out_of_extra_block_area = 0x01          , flag_extra_block_marker_was_found = 0x02      }; @@ -756,7 +756,7 @@ GLuint LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shader_lev  #endif      while(NULL != fgets((char *)buff, 1024, file) -          && shader_code_count < (LL_ARRAY_SIZE(shader_code_text) - LL_ARRAY_SIZE(extra_code_text))) +        && shader_code_count < (LL_ARRAY_SIZE(shader_code_text) - LL_ARRAY_SIZE(extra_code_text)))      {          file_lines_count++; @@ -1501,6 +1501,18 @@ void LLShaderMgr::initAttribsAndUniforms()      mReservedUniforms.push_back("searchTex");      mReservedUniforms.push_back("blendTex"); +    mReservedUniforms.push_back("bloomEMap"); +    mReservedUniforms.push_back("bloomBlurredMap"); +    mReservedUniforms.push_back("bloomHorizontal"); +    mReservedUniforms.push_back("bloomBlurRadius"); +    mReservedUniforms.push_back("bloomExtractBrightness"); +    mReservedUniforms.push_back("bloomStrength"); +    mReservedUniforms.push_back("bloomExtractEmissive"); +    mReservedUniforms.push_back("bloomExtractEmissive2"); +    mReservedUniforms.push_back("bloomExtractORM"); +    mReservedUniforms.push_back("bloomExtractMetal"); +    mReservedUniforms.push_back("bloomExtractNonMetal"); +      llassert(mReservedUniforms.size() == END_RESERVED_UNIFORMS);      std::set<std::string> dupe_check; diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h index 46788841a5..8b0bfc6bbe 100644 --- a/indra/llrender/llshadermgr.h +++ b/indra/llrender/llshadermgr.h @@ -341,6 +341,18 @@ public:          SMAA_SEARCH_TEX,                    //  "searchTex"          SMAA_BLEND_TEX,                     //  "blendTex" +        BLOOM_EMAP,                         //  "bloomEMap" +        BLOOM_BMAP,                         //  "bloomBlurredMap" +        BLOOM_BLURH,                        //  "bloomHorizontal" +        BLOOM_BLUR_RADIUS,                  //  "bloomRadius" +        BLOOM_EXTRACT_BRIGHTNESS,           //  "bloomExtractBrightness" +        BLOOM_STRENGTH,                     //  "bloomStrength" +        BLOOM_EXTRACT_EMISSIVE,             //  "bloomExtractEmissive" +        BLOOM_EXTRACT_EMISSIVE2,            //  "bloomExtractEmissive2" +        BLOOM_EXTRACT_ORM,                  //  "bloomExtractORM" +        BLOOM_EXTRACT_METAL,                //  "bloomExtractMetal" +        BLOOM_EXTRACT_NONMETAL,             //  "bloomExtractNonMetal" +          END_RESERVED_UNIFORMS      } eGLSLReservedUniforms;      // clang-format on diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index ac6db0b34f..2a0acab05a 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -345,7 +345,7 @@ public:      void allocate(GLenum type, U32 size, GLuint& name, U8*& data) override      {          LL_PROFILE_ZONE_SCOPED_CATEGORY_VERTEX; -        STOP_GLERROR; +          llassert(type == GL_ARRAY_BUFFER || type == GL_ELEMENT_ARRAY_BUFFER);          llassert(name == 0); // non zero name indicates a gl name that wasn't freed          llassert(data == nullptr);  // non null data indicates a buffer that wasn't freed @@ -355,10 +355,19 @@ public:          { //allocate a new buffer              LL_PROFILE_GPU_ZONE("vbo alloc"); -            // ON OS X, we don't allocate a VBO until the last possible moment -            // in unmapBuffer +              data = (U8*) ll_aligned_malloc_16(size); -            STOP_GLERROR; + +            if (type == GL_ARRAY_BUFFER) +            { +                glGenBuffers(1, &name); +                LLVertexBuffer::sGLRenderBuffer = name; +            } +            else +            { +                glGenBuffers(1, &name); +                LLVertexBuffer::sGLRenderIndices = name; +            }          }      } @@ -374,12 +383,12 @@ public:          }          mAllocated -= size; -        STOP_GLERROR; +          if (name)          {              delete_buffers(1, &name);          } -        STOP_GLERROR; +        //LOG_GLERROR("LLAppleVBOPool::free()");      }  }; @@ -783,7 +792,6 @@ void LLVertexBuffer::drawElements(U32 mode, const LLVector4a* pos, const LLVecto      LL_PROFILE_ZONE_SCOPED_CATEGORY_VERTEX;      llassert(LLGLSLShader::sCurBoundShaderPtr != NULL); -    STOP_GLERROR;      gGL.syncMatrices(); @@ -909,10 +917,8 @@ void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indi      llassert(mGLBuffer == sGLRenderBuffer);      llassert(mGLIndices == sGLRenderIndices);      gGL.syncMatrices(); -    STOP_GLERROR;      glDrawRangeElements(sGLMode[mode], start, end, count, mIndicesType,          (GLvoid*) (indices_offset * (size_t) mIndicesStride)); -    STOP_GLERROR;  }  void LLVertexBuffer::drawRangeFast(U32 mode, U32 start, U32 end, U32 count, U32 indices_offset) const @@ -935,9 +941,8 @@ void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const      llassert(mGLIndices == sGLRenderIndices);      gGL.syncMatrices(); -    STOP_GLERROR;      glDrawArrays(sGLMode[mode], first, count); -    STOP_GLERROR; +    LOG_GLERROR("LLVertexBuffer::drawArrays()");  }  //static @@ -970,10 +975,8 @@ void LLVertexBuffer::initClass(LLWindow* window)  //static  void LLVertexBuffer::unbind()  { -    STOP_GLERROR;      glBindBuffer(GL_ARRAY_BUFFER, 0);      glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); -    STOP_GLERROR;      sGLRenderBuffer = 0;      sGLRenderIndices = 0;  } @@ -1366,7 +1369,7 @@ void LLVertexBuffer::flush_vbo(GLenum target, U32 start, U32 end, void* data, U8          // _mapBuffer to tag the buffer for flushing to GL          _mapBuffer();          LL_PROFILE_ZONE_NAMED_CATEGORY_VERTEX("vb memcpy"); -        STOP_GLERROR; +        //LOG_GLERROR("LLVertexBuffer::flush_vbo()");          // copy into mapped buffer          memcpy(dst+start, data, end-start+1);      } @@ -1412,7 +1415,6 @@ void LLVertexBuffer::_mapBuffer()  void LLVertexBuffer::_unmapBuffer()  { -    STOP_GLERROR;      if (!mMapped)      {          return; @@ -1428,14 +1430,14 @@ void LLVertexBuffer::_unmapBuffer()      if (gGLManager.mIsApple)      { -        STOP_GLERROR; +        LOG_GLERROR("LLVertexBuffer::_unmapBuffer() - apple 1");          if (mMappedData)          { -            if (mGLBuffer) +            if(mGLBuffer == 0)              { -                delete_buffers(1, &mGLBuffer); +                LL_WARNS() << "mGLBuffer is ZERO in unmapbuffer" << LL_ENDL; +                glGenBuffers(1, &mGLBuffer);              } -            mGLBuffer = gen_buffer();              glBindBuffer(GL_ARRAY_BUFFER, mGLBuffer);              sGLRenderBuffer = mGLBuffer;              glBufferData(GL_ARRAY_BUFFER, mSize, mMappedData, GL_STATIC_DRAW); @@ -1445,16 +1447,16 @@ void LLVertexBuffer::_unmapBuffer()              glBindBuffer(GL_ARRAY_BUFFER, mGLBuffer);              sGLRenderBuffer = mGLBuffer;          } -        STOP_GLERROR; +        LOG_GLERROR("LLVertexBuffer::_unmapBuffer() - apple 2");          if (mMappedIndexData)          { -            if (mGLIndices) +            if (mGLIndices == 0)              { -                delete_buffers(1, &mGLIndices); +                LL_WARNS() << "mGLIndices is ZERO in unmapbuffer" << LL_ENDL; +                glGenBuffers(1, &mGLIndices);              } -            mGLIndices = gen_buffer();              glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mGLIndices);              sGLRenderIndices = mGLIndices; @@ -1465,7 +1467,7 @@ void LLVertexBuffer::_unmapBuffer()              glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mGLIndices);              sGLRenderIndices = mGLIndices;          } -        STOP_GLERROR; +        LOG_GLERROR("LLVertexBuffer::_unmapBuffer() - apple 3");      }      else      { @@ -1656,11 +1658,10 @@ bool LLVertexBuffer::getClothWeightStrider(LLStrider<LLVector4>& strider, U32 in  // Set for rendering  void LLVertexBuffer::setBuffer()  { -    STOP_GLERROR;      if (mMapped)      { -        LL_WARNS_ONCE() << "Missing call to unmapBuffer or flushBuffers" << LL_ENDL; +        LL_WARNS() << "Missing call to unmapBuffer or flushBuffers" << LL_ENDL;          _unmapBuffer();      } @@ -1674,12 +1675,15 @@ void LLVertexBuffer::setBuffer()      U32 data_mask = LLGLSLShader::sCurBoundShaderPtr->mAttributeMask;      // this Vertex Buffer must provide all necessary attributes for currently bound shader -    llassert_msg((data_mask & mTypeMask) == data_mask, -        "Attribute mask mismatch! mTypeMask should be a superset of data_mask.  data_mask: 0x" -                << std::hex << data_mask << " mTypeMask: 0x" << mTypeMask << " Missing: 0x" << (data_mask & ~mTypeMask) <<  std::dec); +    llassert_msg((data_mask & mTypeMask) == data_mask, "Attribute mask mismatch! mTypeMask should be a superset of data_mask.  data_mask: 0x" << std::hex << data_mask << " mTypeMask: 0x" << mTypeMask << " Missing: 0x" << (data_mask & ~mTypeMask) <<  std::dec);      if (sGLRenderBuffer != mGLBuffer)      { +        if(mGLBuffer == 0) +        { +            LL_WARNS() << "mGLBuffer is ZERO: sGLRenderBuffer=" << sGLRenderBuffer << LL_ENDL; +        } +          glBindBuffer(GL_ARRAY_BUFFER, mGLBuffer);          sGLRenderBuffer = mGLBuffer; @@ -1697,14 +1701,14 @@ void LLVertexBuffer::setBuffer()          sGLRenderIndices = mGLIndices;      } -    STOP_GLERROR; +    LOG_GLERROR("LLVertexBuffer::setBuffer()");  }  // virtual (default)  void LLVertexBuffer::setupVertexBuffer()  { -    STOP_GLERROR; +    LOG_GLERROR("LLVertexBuffer::setupVertexBuffer()");      U8* base = nullptr;      AttributeType loc; @@ -1712,98 +1716,141 @@ void LLVertexBuffer::setupVertexBuffer()      U32 data_mask = LLGLSLShader::sCurBoundShaderPtr->mAttributeMask; +    if (data_mask & MAP_VERTEX) +    { +        loc = TYPE_VERTEX; +        ptr = (void*)(base + mOffsets[TYPE_VERTEX]); +        glVertexAttribPointer(loc, 3, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_VERTEX], ptr); + +        LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_VERTEX"); +    } +      if (data_mask & MAP_NORMAL)      {          loc = TYPE_NORMAL;          ptr = (void*)(base + mOffsets[TYPE_NORMAL]);          glVertexAttribPointer(loc, 3, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_NORMAL], ptr); + +        LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_NORMAL");      } -    if (data_mask & MAP_TEXCOORD3) -    { -        loc = TYPE_TEXCOORD3; -        ptr = (void*)(base + mOffsets[TYPE_TEXCOORD3]); -        glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD3], ptr); -    } -    if (data_mask & MAP_TEXCOORD2) + +    if (data_mask & MAP_TEXCOORD0)      { -        loc = TYPE_TEXCOORD2; -        ptr = (void*)(base + mOffsets[TYPE_TEXCOORD2]); -        glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD2], ptr); +        loc = TYPE_TEXCOORD0; +        //glEnableVertexAttribArray(loc); +        ptr = (void*)(base + mOffsets[TYPE_TEXCOORD0]); +        glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD0], ptr); + +        LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_TEXCOORD0");      } +      if (data_mask & MAP_TEXCOORD1)      {          loc = TYPE_TEXCOORD1;          ptr = (void*)(base + mOffsets[TYPE_TEXCOORD1]);          glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD1], ptr); + +        LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_TEXCOORD1");      } -    if (data_mask & MAP_TANGENT) + +    if (data_mask & MAP_TEXCOORD2)      { -        loc = TYPE_TANGENT; -        ptr = (void*)(base + mOffsets[TYPE_TANGENT]); -        glVertexAttribPointer(loc, 4, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TANGENT], ptr); +        loc = TYPE_TEXCOORD2; +        ptr = (void*)(base + mOffsets[TYPE_TEXCOORD2]); +        glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD2], ptr); + +        LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_TEXCOORD2");      } -    if (data_mask & MAP_TEXCOORD0) + +    if (data_mask & MAP_TEXCOORD3)      { -        loc = TYPE_TEXCOORD0; -        ptr = (void*)(base + mOffsets[TYPE_TEXCOORD0]); -        glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD0], ptr); +        loc = TYPE_TEXCOORD3; +        ptr = (void*)(base + mOffsets[TYPE_TEXCOORD3]); +        glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TEXCOORD3], ptr); + +        LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_TEXCOORD3");      } +      if (data_mask & MAP_COLOR)      {          loc = TYPE_COLOR;          //bind emissive instead of color pointer if emissive is present          ptr = (data_mask & MAP_EMISSIVE) ? (void*)(base + mOffsets[TYPE_EMISSIVE]) : (void*)(base + mOffsets[TYPE_COLOR]);          glVertexAttribPointer(loc, 4, GL_UNSIGNED_BYTE, GL_TRUE, LLVertexBuffer::sTypeSize[TYPE_COLOR], ptr); + +        LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_COLOR");      } +      if (data_mask & MAP_EMISSIVE)      {          loc = TYPE_EMISSIVE;          ptr = (void*)(base + mOffsets[TYPE_EMISSIVE]);          glVertexAttribPointer(loc, 4, GL_UNSIGNED_BYTE, GL_TRUE, LLVertexBuffer::sTypeSize[TYPE_EMISSIVE], ptr); +        LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_EMISSIVE"); +          if (!(data_mask & MAP_COLOR))          { //map emissive to color channel when color is not also being bound to avoid unnecessary shader swaps              loc = TYPE_COLOR;              glVertexAttribPointer(loc, 4, GL_UNSIGNED_BYTE, GL_TRUE, LLVertexBuffer::sTypeSize[TYPE_EMISSIVE], ptr); + +            LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_COLOR");          }      } + +    if (data_mask & MAP_TANGENT) +    { +        loc = TYPE_TANGENT; +        ptr = (void*)(base + mOffsets[TYPE_TANGENT]); +        glVertexAttribPointer(loc, 4, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_TANGENT], ptr); + +        LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_TANGENT"); +    } +      if (data_mask & MAP_WEIGHT)      {          loc = TYPE_WEIGHT;          ptr = (void*)(base + mOffsets[TYPE_WEIGHT]);          glVertexAttribPointer(loc, 1, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT], ptr); + +        LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_WEIGHT");      } +      if (data_mask & MAP_WEIGHT4)      {          loc = TYPE_WEIGHT4;          ptr = (void*)(base + mOffsets[TYPE_WEIGHT4]);          glVertexAttribPointer(loc, 4, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT4], ptr); + +        LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_WEIGHT4");      } -    if (data_mask & MAP_JOINT) -    { -        loc = TYPE_JOINT; -        ptr = (void*)(base + mOffsets[TYPE_JOINT]); -        glVertexAttribIPointer(loc, 4, GL_UNSIGNED_SHORT, LLVertexBuffer::sTypeSize[TYPE_JOINT], ptr); -    } +      if (data_mask & MAP_CLOTHWEIGHT)      {          loc = TYPE_CLOTHWEIGHT;          ptr = (void*)(base + mOffsets[TYPE_CLOTHWEIGHT]);          glVertexAttribPointer(loc, 4, GL_FLOAT, GL_TRUE, LLVertexBuffer::sTypeSize[TYPE_CLOTHWEIGHT], ptr); + +        LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_CLOTHWEIGHT");      } + +    if (data_mask & MAP_JOINT) +    { +        loc = TYPE_JOINT; +        ptr = (void*)(base + mOffsets[TYPE_JOINT]); +        glVertexAttribIPointer(loc, 4, GL_UNSIGNED_SHORT, LLVertexBuffer::sTypeSize[TYPE_JOINT], ptr); + +        LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_JOINT"); +    } +      if (data_mask & MAP_TEXTURE_INDEX)      {          loc = TYPE_TEXTURE_INDEX;          ptr = (void*)(base + mOffsets[TYPE_VERTEX] + 12);          glVertexAttribIPointer(loc, 1, GL_UNSIGNED_INT, LLVertexBuffer::sTypeSize[TYPE_VERTEX], ptr); + +        LOG_GLERROR("LLVertexBuffer::setupVertexBuffer TYPE_TEXTURE_INDEX");      } -    if (data_mask & MAP_VERTEX) -    { -        loc = TYPE_VERTEX; -        ptr = (void*)(base + mOffsets[TYPE_VERTEX]); -        glVertexAttribPointer(loc, 3, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_VERTEX], ptr); -    } -    STOP_GLERROR;  }  void LLVertexBuffer::setPositionData(const LLVector4a* data) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 4a45456cfc..a614884cea 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -8558,7 +8558,7 @@      <key>Type</key>      <string>F32</string>      <key>Value</key> -    <real>1.4</real> +    <real>1.0</real>    </map>    <key>RenderShadowBlurSamples</key>    <map> @@ -9337,9 +9337,9 @@      <key>Persist</key>      <integer>1</integer>      <key>Type</key> -    <string>U32</string> +    <string>F32</string>      <key>Value</key> -    <integer>1</integer> +    <integer>1.0</integer>    </map>    <key>RenderShaderLightingMaxLevel</key>    <map> @@ -11565,17 +11565,6 @@        <key>Value</key>        <integer>75</integer>      </map> -    <key>SnapshotTimestamp</key> -    <map> -      <key>Comment</key> -      <string>Add timestamp to snapshot file names</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>1</integer> -    </map>      <key>AbuseReportScreenshotDelay</key>      <map>        <key>Comment</key> @@ -14363,7 +14352,77 @@      <!-- megapahit settings --> -    <key>MPVBufferOptiMode</key> +    <key>MPLowColorPrecision</key> +    <map> +      <key>Comment</key> +      <string>Enable / Disable lower precision buffers encoding</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map> +    <key>MPNoGLDebug</key> +    <map> +      <key>Comment</key> +      <string>Enable / Disable GL Debug</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map> +    <key>MPGamma</key> +    <map> +      <key>Comment</key> +      <string>Enable / Disable Gamma</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map> +    <key>MPTone</key> +    <map> +      <key>Comment</key> +      <string>Enable / Disable Tonemap</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map> +    <key>MPGlow</key> +    <map> +      <key>Comment</key> +      <string>Enable / Disable Glow</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map> +    <key>MPLuminanceMipmap</key> +    <map> +      <key>Comment</key> +      <string> +      Luminance Map Mipmaps: +      (set to 0 to fix post-processing slowdowns) +      0:no +      1:yes +      </string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>U32</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <map>        <key>Comment</key>        <string> @@ -14379,6 +14438,17 @@        <key>Value</key>        <integer>0</integer>      </map> +    <key>MPDumbCopy</key> +    <map> +      <key>Comment</key> +      <string>Add a useless copy in pipeline::renderFinalize()</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <real>0</real> +    </map>      <key>MPRenderShadowOpti</key>      <map>        <key>Comment</key> @@ -14386,10 +14456,131 @@        <key>Persist</key>        <integer>1</integer>        <key>Type</key> -      <string>S32</string> +      <string>U32</string>        <key>Value</key>        <integer>0</integer>      </map> +    <key>MPRenderShadowMaxDist</key> +    <map> +      <key>Comment</key> +      <string>Shadows Max Draw distance</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <integer>64</integer> +    </map> +    <key>MPRenderBloom</key> +    <map> +      <key>Comment</key> +      <string>Automatic bloom (n blur iterations, 0: Disable)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>U32</string> +      <key>Value</key> +      <integer>0</integer> +    </map> +    <key>MPBloomExtractBrightness</key> +    <map> +      <key>Comment</key> +      <string>Auto bloom: Min extracted brightness</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.20</real> +    </map> +    <key>MPBloomExtractMetal</key> +    <map> +      <key>Comment</key> +      <string>Auto bloom: Metal roughness limit filter</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.40</real> +    </map> +    <key>MPBloomExtractNonMetal</key> +    <map> +      <key>Comment</key> +      <string>Auto bloom: Non Metal roughness limit filter</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.0</real> +    </map> +    <key>MPBloomStrength</key> +    <map> +      <key>Comment</key> +      <string>Auto bloom Strength (0.1 to 1.5)</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map> +    <key>MPBloomBlurRadius</key> +    <map> +      <key>Comment</key> +      <string>Auto bloom: Radius</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.5</real> +    </map> +    <key>MPBloomBlurRadiusAdd</key> +    <map> +      <key>Comment</key> +      <string>Auto bloom: Radius add</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.9</real> +    </map> +    <key>MPRenderProbeUpdatePeriod</key> +    <map> +      <key>Comment</key> +      <string>Delay between probes updates</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>15.0</real> +    </map> +    <key>MPRenderProbeSlowDown</key> +    <map> +      <key>Comment</key> +      <string>Slow down probes updates</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>0.05</real> +    </map> +    <key>MPRenderProbeProgressive</key> +    <map> +      <key>Comment</key> +      <string>Calculate Radiance progressively</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <real>0</real> +    </map>      <key>MPVCameraCollapsed</key>      <map>        <key>Comment</key> diff --git a/indra/newview/app_settings/shaders/class1/deferred/SMAA.glsl b/indra/newview/app_settings/shaders/class1/deferred/SMAA.glsl index fdb77cce6e..60a8300352 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/SMAA.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/SMAA.glsl @@ -1351,6 +1351,10 @@ float4 SMAABlendingWeightCalculationPS(float2 texcoord,  //-----------------------------------------------------------------------------  // Neighborhood Blending Pixel Shader (Third Pass) +vec3 srgb_to_linear(vec3 cs); +vec4 srgb_to_linear4(vec4 cs); +vec3 linear_to_srgb(vec3 cl); +  float4 SMAANeighborhoodBlendingPS(float2 texcoord,                                    float4 offset,                                    SMAATexture2D(colorTex), @@ -1369,6 +1373,7 @@ float4 SMAANeighborhoodBlendingPS(float2 texcoord,      SMAA_BRANCH      if (dot(a, float4(1.0, 1.0, 1.0, 1.0)) < 1e-5) {          float4 color = SMAASampleLevelZero(colorTex, texcoord); +        color.rgb = srgb_to_linear(color.rgb);          #if SMAA_REPROJECTION          float2 velocity = SMAA_DECODE_VELOCITY(SMAASampleLevelZero(velocityTex, texcoord)); @@ -1377,6 +1382,8 @@ float4 SMAANeighborhoodBlendingPS(float2 texcoord,          color.a = sqrt(5.0 * length(velocity));          #endif +        color.rgb = linear_to_srgb(color.rgb); +          return color;      } else {          bool h = max(a.x, a.z) > max(a.y, a.w); // max(horizontal) > max(vertical) @@ -1393,8 +1400,15 @@ float4 SMAANeighborhoodBlendingPS(float2 texcoord,          // We exploit bilinear filtering to mix current pixel with the chosen          // neighbor: -        float4 color = blendingWeight.x * SMAASampleLevelZero(colorTex, blendingCoord.xy); -        color += blendingWeight.y * SMAASampleLevelZero(colorTex, blendingCoord.zw); +        //float4 color = blendingWeight.x * SMAASampleLevelZero(colorTex, blendingCoord.xy); +        //color += blendingWeight.y * SMAASampleLevelZero(colorTex, blendingCoord.zw); +        float4 color = SMAASampleLevelZero(colorTex, blendingCoord.xy); +        color.rgb = srgb_to_linear(color.rgb); +        color = blendingWeight.x * color; + +        float4 color2 = SMAASampleLevelZero(colorTex, blendingCoord.zw); +        color2.rgb = srgb_to_linear(color2.rgb); +        color += blendingWeight.y * color2;          #if SMAA_REPROJECTION          // Antialias velocity for proper reprojection in a later stage: @@ -1405,6 +1419,7 @@ float4 SMAANeighborhoodBlendingPS(float2 texcoord,          color.a = sqrt(5.0 * length(velocity));          #endif +        color.rgb = linear_to_srgb(color.rgb);          return color;      }  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaMaskShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaMaskShadowF.glsl index f1e0295859..084a334346 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaMaskShadowF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaMaskShadowF.glsl @@ -23,7 +23,7 @@   * $/LicenseInfo$   */ -out vec4 frag_color; +//out vec4 frag_color;  uniform float minimum_alpha;  uniform sampler2D diffuseMap; @@ -49,5 +49,5 @@ void main()        }      } -    frag_color = vec4(1,1,1,1); +    //frag_color = vec4(1,1,1,1);  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaShadowF.glsl index 18ce998cb6..5986e8e462 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaShadowF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaShadowF.glsl @@ -23,7 +23,7 @@   * $/LicenseInfo$   */ -out vec4 frag_color; +//out vec4 frag_color;  uniform float minimum_alpha; @@ -51,5 +51,5 @@ void main()        }      } -    frag_color = vec4(1,1,1,1); +    //frag_color = vec4(1,1,1,1);  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl index 37dcbbd328..4396ae89a4 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarShadowF.glsl @@ -25,10 +25,10 @@  /*[EXTRA_CODE_HERE]*/ -out vec4 frag_color; +//out vec4 frag_color;  void main()  { -    frag_color = vec4(1,1,1,1); +    //frag_color = vec4(1,1,1,1);  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaBlendF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaBlendF.glsl index dbaab9bbda..90d81ab6b2 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaBlendF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaBlendF.glsl @@ -23,7 +23,7 @@   * $/LicenseInfo$   */ -out vec4 frag_color; +//out vec4 frag_color;  uniform sampler2D diffuseMap; @@ -52,5 +52,5 @@ void main()          }      } -    frag_color = vec4(1,1,1,1); +    //frag_color = vec4(1,1,1,1);  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaMaskF.glsl index 07a2218db2..2b314db51a 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaMaskF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbrShadowAlphaMaskF.glsl @@ -23,7 +23,7 @@   * $/LicenseInfo$   */ -out vec4 frag_color; +//out vec4 frag_color;  uniform sampler2D diffuseMap; @@ -42,5 +42,5 @@ void main()          discard;      } -    frag_color = vec4(1,1,1,1); +    //frag_color = vec4(1,1,1,1);  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl index f208ac746b..a37e970feb 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/shadowAlphaMaskF.glsl @@ -25,7 +25,7 @@  /*[EXTRA_CODE_HERE]*/ -out vec4 frag_color; +//out vec4 frag_color;  in vec4 post_pos;  in float target_pos_x; @@ -59,5 +59,5 @@ void main()          }      } -    frag_color = vec4(1,1,1,1); +    //frag_color = vec4(1,1,1,1);  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl index b55d769fd6..c4e4c4d051 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/shadowF.glsl @@ -23,9 +23,9 @@   * $/LicenseInfo$   */ -out vec4 frag_color; +//out vec4 frag_color;  void main()  { -    frag_color = vec4(1,1,1,1); +    //frag_color = vec4(1,1,1,1);  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowUtil.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowUtil.glsl index 6f7bd2bf3c..033c2f924a 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/shadowUtil.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/shadowUtil.glsl @@ -113,8 +113,8 @@ float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen)      if (spos.z > -shadow_clip.w)      {          vec4 lpos; -        vec4 near_split = shadow_clip*-0.75; -        vec4 far_split = shadow_clip*-1.25; +        vec4 near_split = shadow_clip*-0.9; +        vec4 far_split = shadow_clip*-1.1;          vec4 transition_domain = near_split-far_split;          float weight = 0.0; @@ -131,7 +131,10 @@ float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen)                  shadow += contrib;                  weight += w;              } -            shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0); + +            //shadow += max( (pos.z+shadow_clip.z) / (shadow_clip.z-shadow_clip.w) * 2.0 - 1.0, 0.0); +            shadow += max( (pos.z+shadow_clip.z) / (shadow_clip.z-shadow_clip.w) * 1.0, 0.0); +            //shadow -= max(  (shadow_clip.z + pos.z) / (shadow_clip.z - shadow_clip.w) , 0.0);          }          if (spos.z < near_split.y && spos.z > far_split.z) diff --git a/indra/newview/app_settings/shaders/class1/deferred/treeShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/treeShadowF.glsl index 33a5efa45d..4579d4fbe0 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/treeShadowF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/treeShadowF.glsl @@ -26,7 +26,7 @@  /*[EXTRA_CODE_HERE]*/ -out vec4 frag_color; +//out vec4 frag_color;  uniform float minimum_alpha; @@ -43,5 +43,5 @@ void main()          discard;      } -    frag_color = vec4(1,1,1,1); +    //frag_color = vec4(1,1,1,1);  } diff --git a/indra/newview/app_settings/shaders/class1/effects/bloomBlurF.glsl b/indra/newview/app_settings/shaders/class1/effects/bloomBlurF.glsl new file mode 100644 index 0000000000..0efbbdce96 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/effects/bloomBlurF.glsl @@ -0,0 +1,37 @@ +out vec4 frag_color; + +in vec2 vary_texcoord0; + +uniform sampler2D bloomEMap; + +uniform bool bloomHorizontal; +uniform float bloomBlurRadius = 1.5; + +uniform float weight[5] = float[] (0.227027, 0.1945946, 0.1216216, 0.054054, 0.016216); + +void main() +{ +    vec2 size = vec2(bloomBlurRadius, bloomBlurRadius); + +    vec2 tex_offset = size / textureSize(bloomEMap, 0); // gets size of single texel +    vec3 result = texture(bloomEMap, vary_texcoord0).rgb * weight[0]; // current fragment's contribution + +    if(bloomHorizontal) +    { +        for(int i = 1; i < 5; i++) +        { +            result += texture(bloomEMap, vary_texcoord0 + vec2(tex_offset.x * i, 0.0)).rgb * weight[i]; +            result += texture(bloomEMap, vary_texcoord0 - vec2(tex_offset.x * i, 0.0)).rgb * weight[i]; +        } +    } +    else +    { +        for(int i = 1; i < 5; i++) +        { +            result += texture(bloomEMap, vary_texcoord0 + vec2(0.0, tex_offset.y * i)).rgb * weight[i]; +            result += texture(bloomEMap, vary_texcoord0 - vec2(0.0, tex_offset.y * i)).rgb * weight[i]; +        } +    } + +    frag_color = vec4(result, 1.0); +}
\ No newline at end of file diff --git a/indra/newview/app_settings/shaders/class1/effects/bloomBlurV.glsl b/indra/newview/app_settings/shaders/class1/effects/bloomBlurV.glsl new file mode 100644 index 0000000000..e40b60ed3c --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/effects/bloomBlurV.glsl @@ -0,0 +1,8 @@ +in vec3 position; +out vec2 vary_texcoord0; + +void main() +{ +	gl_Position = vec4(position, 1.0); +	vary_texcoord0.xy = position.xy * 0.5 + 0.5; +}
\ No newline at end of file diff --git a/indra/newview/app_settings/shaders/class1/effects/bloomCombineF.glsl b/indra/newview/app_settings/shaders/class1/effects/bloomCombineF.glsl new file mode 100644 index 0000000000..31a6e10fa4 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/effects/bloomCombineF.glsl @@ -0,0 +1,23 @@ +out vec4 frag_color; + +in vec2 vary_texcoord0; + +uniform sampler2D diffuseMap; +uniform sampler2D bloomBlurredMap; + +uniform float bloomStrength; + +void main() +{ +    vec4 hdrColor = texture(diffuseMap, vary_texcoord0); +    vec3 bloomColor = texture(bloomBlurredMap, vary_texcoord0).rgb; +    vec4 result = vec4(0.0); + +    result.r = min(hdrColor.r + bloomStrength * bloomColor.r, 1.0); +    result.g = min(hdrColor.g + bloomStrength * bloomColor.g, 1.0); +    result.b = min(hdrColor.b + bloomStrength * bloomColor.b, 1.0); +    result.a = hdrColor.a; + +    //bloomColor += hdrColor.rgb; +    frag_color = result; +}
\ No newline at end of file diff --git a/indra/newview/app_settings/shaders/class1/effects/bloomCombineV.glsl b/indra/newview/app_settings/shaders/class1/effects/bloomCombineV.glsl new file mode 100644 index 0000000000..e40b60ed3c --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/effects/bloomCombineV.glsl @@ -0,0 +1,8 @@ +in vec3 position; +out vec2 vary_texcoord0; + +void main() +{ +	gl_Position = vec4(position, 1.0); +	vary_texcoord0.xy = position.xy * 0.5 + 0.5; +}
\ No newline at end of file diff --git a/indra/newview/app_settings/shaders/class1/effects/bloomExtractF.glsl b/indra/newview/app_settings/shaders/class1/effects/bloomExtractF.glsl new file mode 100644 index 0000000000..8fb10d8698 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/effects/bloomExtractF.glsl @@ -0,0 +1,81 @@ +out vec4 frag_color; + +uniform sampler2D diffuseMap; +uniform sampler2D bloomExtractORM; // orm +uniform sampler2D bloomExtractEmissive; // emissive +uniform sampler2D bloomExtractEmissive2; // emissive 2 + +uniform float bloomExtractBrightness = 0.9; +uniform float bloomExtractMetal = 0.20; +uniform float bloomExtractNonMetal = 0.20; + +in vec2 vary_texcoord0; + +void main() +{ +    vec4 col = texture(diffuseMap, vary_texcoord0.xy); + +    //int valid = 0; +    //float brightness = dot(col.rgb, vec3(0.2126, 0.7152, 0.0722)); +    float brightness = dot(col.rgb, vec3(0.3, 0.5, 0.2)); + +    if(brightness < bloomExtractBrightness) +    { +        discard; +        return; +    } + +    vec3 emi = texture(bloomExtractEmissive, vary_texcoord0.xy).rgb; +    if(emi.r + emi.g + emi.b > 0.01) +    { +        discard; +        return; +    } + +    emi = texture(bloomExtractEmissive2, vary_texcoord0.xy).rgb; +    if(emi.r + emi.g + emi.b > 0.01) +    { +        discard; +        return; +    } + +    vec4 orm = texture(bloomExtractORM, vary_texcoord0.xy); + +    if(orm.r < 0.7) +    { +        discard; +        return; +    } + +    if(bloomExtractMetal == 1.0 && bloomExtractNonMetal == 1.0) +    { +        frag_color = vec4(col.rgb, 0.0); +        return; +    } + +    if(orm.b < 0.15) +    { +        // non metal +        if(orm.g > bloomExtractNonMetal) +        { +            discard; +            return; +        } +    } +    else if(orm.b > 0.8) +    { +        // metal +        if(orm.g > bloomExtractMetal) +        { +            discard; +            return; +        } +    } +    else +    { +        discard; +        return; +    } + +    frag_color = vec4(col.rgb, 0.0); +}
\ No newline at end of file diff --git a/indra/newview/app_settings/shaders/class1/effects/bloomExtractV.glsl b/indra/newview/app_settings/shaders/class1/effects/bloomExtractV.glsl new file mode 100644 index 0000000000..e40b60ed3c --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/effects/bloomExtractV.glsl @@ -0,0 +1,8 @@ +in vec3 position; +out vec2 vary_texcoord0; + +void main() +{ +	gl_Position = vec4(position, 1.0); +	vary_texcoord0.xy = position.xy * 0.5 + 0.5; +}
\ No newline at end of file diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index 3233afc28d..396ece9dc1 100644 --- a/indra/newview/featuretable_mac.txt +++ b/indra/newview/featuretable_mac.txt @@ -69,7 +69,7 @@ RenderMaxTextureIndex		1	16  RenderGLContextCoreProfile         1   1  RenderGLMultiThreadedTextures      1   1  RenderGLMultiThreadedMedia         1   1 -RenderAppleUseMultGL        1   1 +RenderAppleUseMultGL        1   0  RenderReflectionsEnabled    1   1  RenderReflectionProbeDetail	1	2  RenderScreenSpaceReflections 1  1 @@ -129,7 +129,8 @@ RenderTonemapType			1   1  RenderTonemapMix			1   0.7  RenderDisableVintageMode           1   0  RenderMaxTextureResolution         1   512 -RenderReflectionProbeCount  1   8 +RenderReflectionProbeCount  1   4 +RenderReflectionProbeDrawDistance  1   16.0  // @@ -152,7 +153,7 @@ RenderTerrainPBRDetail      1   -1  RenderTerrainPBRPlanarSampleCount 1   1  RenderTransparentWater		1	0  RenderTreeLODFactor			1	0.5 -RenderVolumeLODFactor		1	1.125 +RenderVolumeLODFactor		1	2.0  RenderDeferredSSAO			1	0  RenderShadowDetail			1	0  WLSkyDetail					1	96 @@ -173,7 +174,8 @@ RenderTonemapType			1   1  RenderTonemapMix			1   0.7  RenderDisableVintageMode           1   0  RenderMaxTextureResolution         1   1024 -RenderReflectionProbeCount  1   32 +RenderReflectionProbeCount  1   16 +RenderReflectionProbeDrawDistance  1   24.0  //  // Medium Graphics Settings (standard) @@ -195,7 +197,7 @@ RenderTerrainPBRDetail      1   0  RenderTerrainPBRPlanarSampleCount 1   1  RenderTransparentWater		1	0  RenderTreeLODFactor			1	0.5 -RenderVolumeLODFactor		1	1.25 +RenderVolumeLODFactor		1	2.5  RenderDeferredSSAO			1	0  RenderShadowDetail			1	0  WLSkyDetail					1	96 @@ -216,6 +218,7 @@ RenderTonemapType			1   1  RenderTonemapMix			1   0.7  RenderMaxTextureResolution  1   2048  RenderReflectionProbeCount  1   64 +RenderReflectionProbeDrawDistance  1   32.0  //  // Medium High Graphics Settings @@ -237,7 +240,7 @@ RenderTerrainPBRDetail      1   0  RenderTerrainPBRPlanarSampleCount 1   1  RenderTransparentWater		1	0  RenderTreeLODFactor			1	0.5 -RenderVolumeLODFactor		1	1.375 +RenderVolumeLODFactor		1	3.5  RenderDeferredSSAO			1	0  RenderShadowDetail			1	0  WLSkyDetail					1	96 @@ -279,7 +282,7 @@ RenderTerrainPBRDetail      1   0  RenderTerrainPBRPlanarSampleCount 1   3  RenderTransparentWater		1	1  RenderTreeLODFactor			1	0.5 -RenderVolumeLODFactor		1	1.5 +RenderVolumeLODFactor		1	3.8  RenderDeferredSSAO			1	1  RenderShadowDetail			1	1  WLSkyDetail					1	96 @@ -321,7 +324,7 @@ RenderTerrainPBRDetail      1   0  RenderTerrainPBRPlanarSampleCount 1   3  RenderTransparentWater		1	1  RenderTreeLODFactor			1	0.5 -RenderVolumeLODFactor		1	1.75 +RenderVolumeLODFactor		1	4.0  RenderDeferredSSAO			1	1  RenderShadowDetail			1	2  WLSkyDetail					1	96 @@ -362,7 +365,7 @@ RenderTerrainPBRDetail      1   0  RenderTerrainPBRPlanarSampleCount 1   3  RenderTransparentWater		1	1  RenderTreeLODFactor			1	1.0 -RenderVolumeLODFactor		1	2.0 +RenderVolumeLODFactor		1	4.0  WindLightUseAtmosShaders	1	1  WLSkyDetail					1	128  RenderDeferredSSAO			1	1 @@ -406,7 +409,7 @@ RenderCompressTextures		1	0  //  list safe  RenderAnisotropic			1	0 -RenderAvatarMaxNonImpostors 1	16 +RenderAvatarMaxNonImpostors 1	3  RenderAvatarMaxComplexity          1	80000  RenderLocalLightCount		1	0  RenderMaxPartCount			1	1024 diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 44276d8767..5d107e69db 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -592,6 +592,8 @@ static void settings_modify()      LLVOSurfacePatch::sLODFactor        = gSavedSettings.getF32("RenderTerrainLODFactor");      LLVOSurfacePatch::sLODFactor *= LLVOSurfacePatch::sLODFactor; //square lod factor to get exponential range of [1,4]      gDebugGL       = gDebugGLSession || gDebugSession; +    bool noGLDebug = gSavedSettings.getBOOL("MPNoGLDebug"); +    if(noGLDebug) gDebugGL = false;      gDebugPipeline = gSavedSettings.getBOOL("RenderDebugPipeline");  } @@ -1351,12 +1353,11 @@ bool LLAppViewer::frame()  bool LLAppViewer::doFrame()  {      U32 fpsLimitMaxFps = (U32)gSavedSettings.getU32("MaxFPS"); -    if(fpsLimitMaxFps>120) fpsLimitMaxFps=0; +    if(fpsLimitMaxFps > 120) fpsLimitMaxFps = 0;      using TimePoint = std::chrono::steady_clock::time_point; - -    U64 fpsLimitSleepFor = 0; -    TimePoint fpsLimitFrameStartTime = std::chrono::steady_clock::now(); +    U64 additionalSleepTime = 0; +    TimePoint frameStartTime = std::chrono::steady_clock::now();  #ifdef LL_DISCORD      { @@ -1535,18 +1536,6 @@ bool LLAppViewer::doFrame()              }          } -        if(fpsLimitMaxFps > 0) -        { -            auto elapsed = std::chrono::steady_clock::now() - fpsLimitFrameStartTime; - -            long long fpsLimitFrameTime = std::chrono::duration_cast<std::chrono::microseconds>(elapsed).count(); -            U64 desired_time_us = (U32)(1000000.f / fpsLimitMaxFps); -            if((fpsLimitFrameTime+1000) < desired_time_us) -            { -                fpsLimitSleepFor = (desired_time_us - fpsLimitFrameTime - 1000) * 1.0; -            } -        } -          {              LL_PROFILE_ZONE_NAMED_CATEGORY_APP("df pauseMainloopTimeout");              pingMainloopTimeout("Main:Sleep"); @@ -1559,13 +1548,25 @@ bool LLAppViewer::doFrame()              //LL_RECORD_BLOCK_TIME(SLEEP2);              LL_PROFILE_ZONE_WARN("Sleep2"); -            if(fpsLimitSleepFor) +            auto elapsed = std::chrono::steady_clock::now() - frameStartTime; +            long long frameTime = std::chrono::duration_cast<std::chrono::microseconds>(elapsed).count(); + +            if(fpsLimitMaxFps > 0)              { -#if LL_WINDOWS -                std::this_thread::sleep_for(std::chrono::microseconds(fpsLimitSleepFor)); -#else -                usleep(fpsLimitSleepFor); -#endif +                U64 desired_time_us = (U32)(1000000.f / fpsLimitMaxFps); +                if((frameTime+1000) < desired_time_us) +                { +                    additionalSleepTime = 0.92 * (F64)(desired_time_us - frameTime); +                    if(additionalSleepTime < 200) +                    { +                        additionalSleepTime = 0; +                    } +                } +            } + +            if(additionalSleepTime > 0) +            { +                std::this_thread::sleep_for(std::chrono::microseconds(additionalSleepTime));              }              // yield some time to the os based on command line option @@ -1661,6 +1662,9 @@ bool LLAppViewer::doFrame()                  LL_PROFILE_ZONE_NAMED_CATEGORY_APP("df resumeMainloopTimeout");                  resumeMainloopTimeout();              } + +            //swap(); +              pingMainloopTimeout("Main:End");          }      } diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index bf593bff07..c9470fe977 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -911,7 +911,8 @@ void LLBumpImageList::onSourceUpdated(LLViewerTexture* src, EBumpEffect bump_cod          // generate normal map in empty texture          { -            sRenderTarget.bindTarget(); +            sRenderTarget.bindTarget("", 1); +            //sRenderTarget.clear();              LLGLDepthTest depth(GL_FALSE);              LLGLDisable cull(GL_CULL_FACE); diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp index 7d58511d41..424bb02ae7 100644 --- a/indra/newview/lldrawpoolwater.cpp +++ b/indra/newview/lldrawpoolwater.cpp @@ -119,7 +119,8 @@ void LLDrawPoolWater::beginPostDeferredPass(S32 pass)          LLRenderTarget& depth_src = gPipeline.mRT->deferredScreen;          LLRenderTarget& dst = gPipeline.mWaterDis; -        dst.bindTarget(); +        dst.bindTarget("", 1); +        //dst.clear();          gCopyDepthProgram.bind();          S32 diff_map = gCopyDepthProgram.getTextureChannel(LLShaderMgr::DIFFUSE_MAP); diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index fb4db9a216..e4b81ba00a 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -648,7 +648,7 @@ void LLFace::renderOneWireframe(const LLColor4 &color, F32 fogCfx, bool wirefram          LLGLEnable offset(GL_POLYGON_OFFSET_LINE);  #endif          glPolygonOffset(3.f, 3.f); -        glLineWidth(5.f); +        //glLineWidth(5.f);  #if GL_VERSION_1_1          glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);  #endif diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp index aa2578fec6..1618d91b98 100644 --- a/indra/newview/llfasttimerview.cpp +++ b/indra/newview/llfasttimerview.cpp @@ -403,7 +403,7 @@ void LLFastTimerView::draw()      legend_panel->localRectToOtherView(legend_panel->getLocalRect(), &mLegendRect, this);      // Draw the window background -            gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); +    gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);      gl_rect_2d(getLocalRect(), LLColor4(0.f, 0.f, 0.f, 0.25f));      drawHelp(getRect().getHeight() - MARGIN); @@ -518,7 +518,8 @@ void LLFastTimerView::exportCharts(const std::string& base, const std::string& t      //render charts      gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -    buffer.bindTarget(); +    buffer.bindTarget("", 1); +    buffer.clear();      for (std::set<std::string>::iterator iter = chart_names.begin(); iter != chart_names.end(); ++iter)      { @@ -1057,8 +1058,7 @@ void LLFastTimerView::drawLineGraph()          //fatten highlighted timer          if (mHoverID == idp)          { -            gGL.flush(); -            glLineWidth(3); +            LLRender2D::setLineWidth(3.0);          }          llassert(idp->getIndex() < sTimerColors.size()); @@ -1118,8 +1118,7 @@ void LLFastTimerView::drawLineGraph()          if (mHoverID == idp)          { -            gGL.flush(); -            glLineWidth(1); +            LLRender2D::setLineWidth(1.f);          }          if (idp->getTreeNode().mCollapsed) diff --git a/indra/newview/llfloaterperformance.h b/indra/newview/llfloaterperformance.h index 6cca85a009..48e7f4913f 100644 --- a/indra/newview/llfloaterperformance.h +++ b/indra/newview/llfloaterperformance.h @@ -33,6 +33,7 @@ class LLCharacter;  class LLCheckBoxCtrl;  class LLNameListCtrl;  class LLTextBox; +class LLSliderCtrl;  class LLFloaterPerformance : public LLFloater  { diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 585032870e..334f9cb692 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -2359,6 +2359,7 @@ private:  };  static LLPanelInjector<LLPanelPreferenceGraphics> t_pref_graph("panel_preference_graphics"); +static LLPanelInjector<LLPanelPreferenceGraphics3> t_pref_graph3("panel_preference_graphics3");  static LLPanelInjector<LLPanelPreferencePrivacy> t_pref_privacy("panel_preference_privacy");  bool LLPanelPreferenceGraphics::postBuild() @@ -2528,6 +2529,165 @@ void LLPanelPreferenceGraphics::setHardwareDefaults()      resetDirtyChilds();  } +// LLPanelPreferenceGraphics3 (Visuals Effects) + +bool LLPanelPreferenceGraphics3::postBuild() +{ +    getChild<LLButton>("MPBalancedButton")->setCommitCallback(boost::bind(&LLPanelPreferenceGraphics3::onMPRecommanded, this)); +    return LLPanelPreference::postBuild(); +} + +void LLPanelPreferenceGraphics3::draw() +{ +    LLPanelPreference::draw(); +} + +bool LLPanelPreferenceGraphics3::hasDirtyChilds() +{ +    LLFloater* advanced = LLFloaterReg::findTypedInstance<LLFloater>("prefs_graphics_advanced"); +    std::list<LLView*> view_stack; +    view_stack.push_back(this); +    if (advanced) +    { +        view_stack.push_back(advanced); +    } +    while(!view_stack.empty()) +    { +        // Process view on top of the stack +        LLView* curview = view_stack.front(); +        view_stack.pop_front(); + +        LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(curview); +        if (ctrl) +        { +            if (ctrl->isDirty()) +            { +                LLControlVariable* control = ctrl->getControlVariable(); +                if (control) +                { +                    std::string control_name = control->getName(); +                    if (!control_name.empty()) +                    { +                        return true; +                    } +                } +            } +        } +        // Push children onto the end of the work stack +        for (child_list_t::const_iterator iter = curview->getChildList()->begin(); +             iter != curview->getChildList()->end(); ++iter) +        { +            view_stack.push_back(*iter); +        } +    } + +    return false; +} + +void LLPanelPreferenceGraphics3::resetDirtyChilds() +{ +    LLFloater* advanced = LLFloaterReg::findTypedInstance<LLFloater>("prefs_graphics_advanced"); +    std::list<LLView*> view_stack; +    view_stack.push_back(this); +    if (advanced) +    { +        view_stack.push_back(advanced); +    } +    while(!view_stack.empty()) +    { +        // Process view on top of the stack +        LLView* curview = view_stack.front(); +        view_stack.pop_front(); + +        LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(curview); +        if (ctrl) +        { +            ctrl->resetDirty(); +        } +        // Push children onto the end of the work stack +        for (child_list_t::const_iterator iter = curview->getChildList()->begin(); +             iter != curview->getChildList()->end(); ++iter) +        { +            view_stack.push_back(*iter); +        } +    } +} + +void LLPanelPreferenceGraphics3::cancel(const std::vector<std::string> settings_to_skip) +{ +    LLPanelPreference::cancel(settings_to_skip); +} +void LLPanelPreferenceGraphics3::saveSettings() +{ +    resetDirtyChilds(); +    std::string preset_graphic_active = gSavedSettings.getString("PresetGraphicActive"); +    if (preset_graphic_active.empty()) +    { +        LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences"); +        if (instance) +        { +            //don't restore previous preset after closing Preferences +            instance->saveGraphicsPreset(preset_graphic_active); +        } +    } +    LLPanelPreference::saveSettings(); +} + +void LLPanelPreferenceGraphics3::onMPRecommanded() +{ +    //LL_WARNS() << "onClickMPRecommanded()" << LL_ENDL; + +    // LOD + +    gSavedSettings.setF32("RenderVolumeLODFactor", 3.5); +    gSavedSettings.setF32("RenderAvatarPhysicsLODFactor", 1.0); + +    // AA + +    gSavedSettings.setU32("RenderFSAAType", 2); +    gSavedSettings.setU32("RenderFSAASamples", 2); + +    // Shadows + +    gSavedSettings.setS32("RenderShadowDetail", 0); +    gSavedSettings.setF32("MPRenderShadowMaxDist", 40.0); +    gSavedSettings.setF32("RenderShadowResolutionScale", 2.0); +    gSavedSettings.setF32("RenderShadowBlurSize", 0.2); +    gSavedSettings.setBOOL("RenderDeferredSSAO", 0); + +    // Bloom + +    gSavedSettings.setU32("MPRenderBloom", 0); +    gSavedSettings.setF32("MPBloomBlurRadius", 1.0); +    gSavedSettings.setF32("MPBloomBlurRadiusAdd", 0.6); +    gSavedSettings.setF32("MPBloomExtractBrightness", 0.1); +    gSavedSettings.setF32("MPBloomStrength", 1.0); + +    gSavedSettings.setF32("MPBloomExtractMetal", 0.4); +    gSavedSettings.setF32("MPBloomExtractNonMetal", 0.0); + +    // Probes + +    gSavedSettings.setS32("RenderReflectionProbeDetail", 0); +    gSavedSettings.setS32("RenderReflectionProbeLevel", 1); +    gSavedSettings.setU32("RenderReflectionProbeCount", 32); +    gSavedSettings.setU32("RenderReflectionProbeResolution", 128); +    gSavedSettings.setF32("RenderReflectionProbeDrawDistance", 24.0); +    gSavedSettings.setF32("RenderDefaultProbeUpdatePeriod", 20.0); +    gSavedSettings.setF32("MPRenderProbeUpdatePeriod", 30.0); +    gSavedSettings.setF32("MPRenderProbeSlowDown", 0.02); + +    // Misc + +    gSavedSettings.setBOOL("RenderDisableVintageMode", true); +    gSavedSettings.setBOOL("RenderTransparentWater", true); +    gSavedSettings.setBOOL("MPLowColorPrecision", true); + +    gSavedSettings.setBOOL("RenderGLMultiThreadedTextures", false); +    gSavedSettings.setBOOL("RenderAppleUseMultGL", false); +    gSavedSettings.setBOOL("MPNoGLDebug", true); +} +  //------------------------LLPanelPreferenceControls--------------------------------  static LLPanelInjector<LLPanelPreferenceControls> t_pref_contrls("panel_preference_controls"); diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index fa9c421a8f..2c357f0551 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -313,6 +313,26 @@ private:      LOG_CLASS(LLPanelPreferenceGraphics);  }; +class LLPanelPreferenceGraphics3 : public LLPanelPreference +{ +public: +    bool postBuild(); +    void draw(); +    void cancel(const std::vector<std::string> settings_to_skip = {}); +    void saveSettings(); +    void resetDirtyChilds(); +    void onMPRecommanded(); + +protected: +    bool hasDirtyChilds(); + + +private: + + +    LOG_CLASS(LLPanelPreferenceGraphics3); +}; +  class LLPanelPreferenceControls : public LLPanelPreference, public LLKeyBindResponderInterface  {      LOG_CLASS(LLPanelPreferenceControls); diff --git a/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp b/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp index 94b95b21c2..a8a1e507a8 100644 --- a/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp +++ b/indra/newview/llfloaterpreferencesgraphicsadvanced.cpp @@ -274,9 +274,7 @@ void LLFloaterPreferenceGraphicsAdvanced::setMaxNonImpostorsText(U32 value, LLTe  void LLFloaterPreferenceGraphicsAdvanced::disableUnavailableSettings()  {      LLComboBox* ctrl_shadows = getChild<LLComboBox>("ShadowDetail"); -    LLComboBox* ctrl_shadows_quality = getChild<LLComboBox>("MPShadowQuality");      LLTextBox* shadows_text = getChild<LLTextBox>("RenderShadowDetailText"); -    LLTextBox* shadows_quality_text = getChild<LLTextBox>("RenderShadowQualityText");      LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO");      LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF");      LLSliderCtrl* sky = getChild<LLSliderCtrl>("SkyMeshDetail"); @@ -292,9 +290,7 @@ void LLFloaterPreferenceGraphicsAdvanced::disableUnavailableSettings()          //deferred needs windlight, disable deferred          ctrl_shadows->setEnabled(false);          ctrl_shadows->setValue(0); -        ctrl_shadows_quality->setEnabled(false);          shadows_text->setEnabled(false); -        shadows_quality_text->setEnabled(false);          ctrl_ssao->setEnabled(false);          ctrl_ssao->setValue(false); @@ -308,9 +304,7 @@ void LLFloaterPreferenceGraphicsAdvanced::disableUnavailableSettings()      {          ctrl_shadows->setEnabled(false);          ctrl_shadows->setValue(0); -        ctrl_shadows_quality->setEnabled(false);          shadows_text->setEnabled(false); -        shadows_quality_text->setEnabled(false);          ctrl_ssao->setEnabled(false);          ctrl_ssao->setValue(false); @@ -331,9 +325,7 @@ void LLFloaterPreferenceGraphicsAdvanced::disableUnavailableSettings()      {          ctrl_shadows->setEnabled(false);          ctrl_shadows->setValue(0); -        ctrl_shadows_quality->setEnabled(false);          shadows_text->setEnabled(false); -        shadows_quality_text->setEnabled(false);      }      // Vintage mode @@ -363,9 +355,7 @@ void LLFloaterPreferenceGraphicsAdvanced::refreshEnabledState()      LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO");      LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF");      LLComboBox* ctrl_shadow = getChild<LLComboBox>("ShadowDetail"); -    LLComboBox* ctrl_shadow_quality = getChild<LLComboBox>("MPShadowQuality");      LLTextBox* shadow_text = getChild<LLTextBox>("RenderShadowDetailText"); -    LLTextBox* shadows_quality_text = getChild<LLTextBox>("RenderShadowQualityText");      // note, okay here to get from ctrl_deferred as it's twin, ctrl_deferred2 will alway match it      enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO");// && ctrl_deferred->get(); @@ -378,9 +368,7 @@ void LLFloaterPreferenceGraphicsAdvanced::refreshEnabledState()      enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderShadowDetail");      ctrl_shadow->setEnabled(enabled); -    ctrl_shadow_quality->setEnabled(enabled);      shadow_text->setEnabled(enabled); -    shadows_quality_text->setEnabled(enabled);      // Hardware settings diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index 112008172e..fffc520d9c 100644 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -728,8 +728,7 @@ void LLViewerObjectList::renderObjectBeacons()              S32 line_width = debug_beacon.mLineWidth;              if (line_width != last_line_width)              { -                gGL.flush(); -                glLineWidth( (F32)line_width ); +                LLRender2D::setLineWidth(line_width);                  last_line_width = line_width;              } @@ -758,8 +757,7 @@ void LLViewerObjectList::renderObjectBeacons()              S32 line_width = debug_beacon.mLineWidth;              if (line_width != last_line_width)              { -                gGL.flush(); -                glLineWidth( (F32)line_width ); +                LLRender2D::setLineWidth(line_width);                  last_line_width = line_width;              } @@ -772,8 +770,7 @@ void LLViewerObjectList::renderObjectBeacons()              gGL.end();          } -        gGL.flush(); -        glLineWidth(1.f); +        LLRender2D::setLineWidth(1.f);          for (std::vector<LLDebugBeacon>::iterator iter = mDebugBeacons.begin(); iter != mDebugBeacons.end(); ++iter)          { @@ -808,7 +805,9 @@ void LLSky::renderSunMoonBeacons(const LLVector3& pos_agent, const LLVector3& di      {          pos_end.mV[i] = pos_agent.mV[i] + (50 * direction.mV[i]);      } -    glLineWidth((GLfloat)LLPipeline::DebugBeaconLineWidth); + +    LLRender2D::setLineWidth((GLfloat)LLPipeline::DebugBeaconLineWidth); +      gGL.begin(LLRender::LINES);      color.mV[3] *= 0.5f;      gGL.color4fv(color.mV); @@ -818,9 +817,7 @@ void LLSky::renderSunMoonBeacons(const LLVector3& pos_agent, const LLVector3& di      gGL.vertex3fv(pos_end.mV);      gGL.end(); -    gGL.flush(); -    glLineWidth(1.f); - +    LLRender2D::setLineWidth(1.f);  }  //----------------------------------------------------------------------------- @@ -977,7 +974,7 @@ F32 gpu_benchmark()              delete[] pixels;              return -1.f;          } -        dest[i].bindTarget(); +        dest[i].bindTarget("", 1);          dest[i].clear();          dest[i].flush(); @@ -1039,7 +1036,7 @@ F32 gpu_benchmark()      // run GPU timer benchmark      {          ShaderProfileHelper initProfile; -        dest[0].bindTarget(); +        dest[0].bindTarget("benchmark", 1);          gBenchmarkProgram.bind();          for (S32 c = 0; c < samples; ++c)          { diff --git a/indra/newview/llgltfmaterialpreviewmgr.cpp b/indra/newview/llgltfmaterialpreviewmgr.cpp index da1f1a466f..daa3d62efe 100644 --- a/indra/newview/llgltfmaterialpreviewmgr.cpp +++ b/indra/newview/llgltfmaterialpreviewmgr.cpp @@ -425,6 +425,8 @@ bool LLGLTFPreviewTexture::render()      if (!mShouldRender) { return false; } +    LL_WARNS() << "LLGLTFPreviewTexture:render()" << LL_ENDL; +      glClearColor(0, 0, 0, 0);      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -520,19 +522,41 @@ bool LLGLTFPreviewTexture::render()      // *HACK: Hide mExposureMap from generateExposure      gPipeline.mExposureMap.swapFBORefs(gPipeline.mLastExposure); -    gPipeline.copyScreenSpaceReflections(&screen, &gPipeline.mSceneMap); -    gPipeline.generateLuminance(&screen, &gPipeline.mLuminanceMap); -    gPipeline.generateExposure(&gPipeline.mLuminanceMap, &gPipeline.mExposureMap, /*use_history = */ false); -    gPipeline.gammaCorrect(&screen, &gPipeline.mPostMap); +    //bool hdr = gPipeline.has_hdr(); +    bool hdr = true; + +    if (hdr) +    { +        gPipeline.copyScreenSpaceReflections(&screen, &gPipeline.mSceneMap); +        gPipeline.generateLuminance(&screen, &gPipeline.mLuminanceMap); +        gPipeline.generateExposure(&gPipeline.mLuminanceMap, &gPipeline.mExposureMap, /*use_history = */ false); +    } + +    U16 activeRT = 0; +    gPipeline.gammaCorrect(&screen, &gPipeline.mPostMaps[activeRT]); +      LLVertexBuffer::unbind(); -    gPipeline.generateGlow(&gPipeline.mPostMap); -    gPipeline.combineGlow(&gPipeline.mPostMap, &screen); -    gPipeline.renderDoF(&screen, &gPipeline.mPostMap); -    gPipeline.applyFXAA(&gPipeline.mPostMap, &screen); + +    gPipeline.generateGlow(&gPipeline.mPostMaps[activeRT]); +    gPipeline.combineGlow(&gPipeline.mPostMaps[activeRT], &gPipeline.mPostMaps[1-activeRT]); +    activeRT = 1-activeRT; + +    if(gPipeline.renderDoF(&gPipeline.mPostMaps[activeRT], &gPipeline.mPostMaps[1-activeRT])) +    { +        activeRT = 1-activeRT; +    } + +    if(gPipeline.applyFXAA(&gPipeline.mPostMaps[activeRT], &gPipeline.mPostMaps[1-activeRT])) +    { +        activeRT = 1-activeRT; +    }      // *HACK: Restore mExposureMap (it will be consumed by generateExposure next frame)      gPipeline.mExposureMap.swapFBORefs(gPipeline.mLastExposure); +    gPipeline.copyRenderTarget(&gPipeline.mPostMaps[activeRT], &screen); + +      // Final render      gDeferredPostNoDoFProgram.bind(); diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp index 044d08faf1..4d27e3d92e 100644 --- a/indra/newview/llmodelpreview.cpp +++ b/indra/newview/llmodelpreview.cpp @@ -3717,16 +3717,10 @@ bool LLModelPreview::render()                                      buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts() - 1, buffer->getNumIndices(), 0);                                      gGL.diffuseColor4fv(PREVIEW_PSYH_EDGE_COL.mV); -                                    glLineWidth(PREVIEW_PSYH_EDGE_WIDTH); -#if GL_VERSION_1_1                                      glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); -#endif                                      buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts() - 1, buffer->getNumIndices(), 0); -#if GL_VERSION_1_1                                      glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); -#endif -                                    glLineWidth(1.f);                                      buffer->unmapBuffer();                                  } @@ -3738,10 +3732,7 @@ bool LLModelPreview::render()                      // only do this if mDegenerate was set in the preceding mesh checks [Check this if the ordering ever breaks]                      if (mHasDegenerate)                      { -                        glLineWidth(PREVIEW_DEG_EDGE_WIDTH); -#if GL_VERSION_1_1                          glPointSize(PREVIEW_DEG_POINT_SIZE); -#endif                          gPipeline.enableLightsFullbright();                          //show degenerate triangles                          LLGLDepthTest depth(GL_TRUE, GL_TRUE, GL_ALWAYS); @@ -3810,10 +3801,8 @@ bool LLModelPreview::render()                              gGL.popMatrix();                          } -                        glLineWidth(1.f); -#if GL_VERSION_1_1 +                        //glLineWidth(1.f);                          glPointSize(1.f); -#endif                          gPipeline.enableLightsPreview();                          gGL.setSceneBlendType(LLRender::BT_ALPHA);                      } @@ -3934,15 +3923,10 @@ bool LLModelPreview::render()                              {                                  gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);                                  gGL.diffuseColor4fv(PREVIEW_EDGE_COL.mV); -                                glLineWidth(PREVIEW_EDGE_WIDTH); -#if GL_VERSION_1_1 +                                //glLineWidth(PREVIEW_EDGE_WIDTH);                                  glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); -#endif                                  buffer->draw(LLRender::TRIANGLES, buffer->getNumIndices(), 0); -#if GL_VERSION_1_1                                  glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); -#endif -                                glLineWidth(1.f);                              }                          }                      } diff --git a/indra/newview/llreflectionmap.h b/indra/newview/llreflectionmap.h index a818793550..9d960f5f9c 100644 --- a/indra/newview/llreflectionmap.h +++ b/indra/newview/llreflectionmap.h @@ -103,6 +103,9 @@ public:      // last time this probe was bound for rendering      F32 mLastBindTime = 0.f; +    // Next update time +    F32 mNextUpdateTime = 0.f; +      // cube map used to sample this environment map      LLPointer<LLCubeMapArray> mCubeArray;      S32 mCubeIndex = -1; // index into cube map array or -1 if not currently stored in cube map array @@ -110,6 +113,9 @@ public:      // probe has had at least one full update and is ready to render      bool mComplete = false; +    // number of tiees the probe has been completed +    U32 mCompletedCount = 0; +      // fade in parameter for this probe      F32 mFadeIn = 0.f; diff --git a/indra/newview/llreflectionmapmanager.cpp b/indra/newview/llreflectionmapmanager.cpp index c1815ad57e..9f8a21694f 100644 --- a/indra/newview/llreflectionmapmanager.cpp +++ b/indra/newview/llreflectionmapmanager.cpp @@ -54,6 +54,7 @@  #endif  LLPointer<LLImageGL> gEXRImage; +//LLTrace::BlockTimerStatHandle FTM_RENDER_RADIANCE("Render Radiance");  void load_exr(const std::string& filename)  { @@ -226,6 +227,25 @@ void LLReflectionMapManager::update()      static LLCachedControl<S32> sLevel(gSavedSettings, "RenderReflectionProbeLevel", 3);      static LLCachedControl<U32> sReflectionProbeCount(gSavedSettings, "RenderReflectionProbeCount", 256U);      static LLCachedControl<S32> sProbeDynamicAllocation(gSavedSettings, "RenderReflectionProbeDynamicAllocation", -1); + +    static LLCachedControl<F32> sProbeUpdateSlowDown(gSavedSettings, "MPRenderProbeSlowDown", 0.f); + +    bool realtime = sDetail >= (S32)LLReflectionMapManager::DetailLevel::REALTIME; + +    if(sProbeUpdateSlowDown > 0.0) +    { +        if ( mLastUpdate > 0.f ) +        { +            F32 elapsed = gFrameTimeSeconds - mLastUpdate; +            if (elapsed > 0.0 && elapsed < sProbeUpdateSlowDown) +            { +                return; +            } +        } +    } + +    mLastUpdate = gFrameTimeSeconds; +      mResetFade = llmin((F32)(mResetFade + gFrameIntervalSeconds * 2.f), 1.f);      { @@ -275,9 +295,16 @@ void LLReflectionMapManager::update()      static LLCachedControl<bool> render_hdr(gSavedSettings, "RenderHDREnabled", true); +    U32 color_fmt = render_hdr ? GL_R11F_G11F_B10F : GL_RGB8; + +    static LLCachedControl<bool> MPLowColorPrecision(gSavedSettings, "MPLowColorPrecision", 0); +    if(MPLowColorPrecision) +    { +        color_fmt = GL_RGB8; +    } +      if (!mRenderTarget.isComplete())      { -        U32 color_fmt = render_hdr ? GL_R11F_G11F_B10F : GL_RGB8;          U32 targetRes = mProbeResolution * 4; // super sample          mRenderTarget.allocate(targetRes, targetRes, color_fmt, true);      } @@ -290,7 +317,7 @@ void LLReflectionMapManager::update()          mMipChain.resize(count);          for (U32 i = 0; i < count; ++i)          { -            mMipChain[i].allocate(res, res, render_hdr ? GL_R11F_G11F_B10F : GL_RGB8); +            mMipChain[i].allocate(res, res, color_fmt);              res /= 2;          }      } @@ -328,8 +355,6 @@ void LLReflectionMapManager::update()      bool did_update = false; -    bool realtime = sDetail >= (S32)LLReflectionMapManager::DetailLevel::REALTIME; -      LLReflectionMap* closestDynamic = nullptr;      LLReflectionMap* oldestProbe = nullptr; @@ -362,6 +387,9 @@ void LLReflectionMapManager::update()              probe->mCubeArray = nullptr;              probe->mCubeIndex = -1;              probe->mComplete = false; +            probe->mCompletedCount = 0; +            probe->mLastUpdateTime = 0.0; +            probe->mNextUpdateTime = 0.0;              probe->mFadeIn = 0;          }      } @@ -385,6 +413,9 @@ void LLReflectionMapManager::update()      mResetFade = llmin((F32)(mResetFade + gFrameIntervalSeconds * 2.f), 1.f); +    static LLCachedControl<F32> sDefaultUpdatePeriod(gSavedSettings, "RenderDefaultProbeUpdatePeriod", 2.f); +    static LLCachedControl<F32> sMPUpdatePeriod(gSavedSettings, "MPRenderProbeUpdatePeriod", 2.f); +      for (unsigned int i = 0; i < mProbes.size(); ++i)      {          LLReflectionMap* probe = mProbes[i]; @@ -401,6 +432,8 @@ void LLReflectionMapManager::update()              continue;          } +        // Calculating distance +          LLVector4a d;          if (probe != mDefaultProbe) @@ -412,14 +445,18 @@ void LLReflectionMapManager::update()              d.setSub(camera_pos, probe->mOrigin);              probe->mDistance = d.getLength3().getF32() - probe->mRadius;          } -        else if (probe->mComplete) -        { -            // make default probe have a distance of 64m for the purposes of prioritization (if it's already been generated once) -            probe->mDistance = 64.f; -        }          else          { -            probe->mDistance = -4096.f; //boost priority of default probe when it's not complete +            if (mDefaultProbe->mComplete) +            { +                // make default probe have a distance of 64m for the purposes of prioritization (if it's already been generated once) +                probe->mDistance = 64.f; +            } +            else +            { +                probe->mNextUpdateTime = 0.f; +                probe->mDistance = -4096.f; //boost priority of default probe when it's not complete +            }          }          if (probe->mComplete) @@ -427,8 +464,13 @@ void LLReflectionMapManager::update()              probe->autoAdjustOrigin();              probe->mFadeIn = llmin((F32) (probe->mFadeIn + gFrameIntervalSeconds), 1.f);          } + +        // Guess oldest probe +          if (probe->mOccluded && probe->mComplete)          { +            // occluded probe +              if (oldestOccluded == nullptr)              {                  oldestOccluded = probe; @@ -445,7 +487,7 @@ void LLReflectionMapManager::update()                  (oldestProbe == nullptr ||                      check_priority(probe, oldestProbe)))              { -               oldestProbe = probe; +                oldestProbe = probe;              }          } @@ -465,6 +507,8 @@ void LLReflectionMapManager::update()          }      } +    // realtime +      if (realtime && closestDynamic != nullptr)      {          LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("rmmu - realtime"); @@ -480,23 +524,24 @@ void LLReflectionMapManager::update()          {              updateProbeFace(closestDynamic, i);          } +        if(mRealtimeRadiancePass) updateProbeRadiance(closestDynamic); +        else updateProbeIrradiance(closestDynamic);          mRealtimeRadiancePass = !mRealtimeRadiancePass;          // restore "isRadiancePass"          mRadiancePass = radiance_pass;      } -    static LLCachedControl<F32> sUpdatePeriod(gSavedSettings, "RenderDefaultProbeUpdatePeriod", 2.f); -    if ((gFrameTimeSeconds - mDefaultProbe->mLastUpdateTime) < sUpdatePeriod) +    if ((gFrameTimeSeconds - mDefaultProbe->mLastUpdateTime) < sDefaultUpdatePeriod)      { -        if (sLevel == 0) +        if (sLevel == 0 && mDefaultProbe->mComplete)          { // when probes are disabled don't update the default probe more often than the prescribed update period              oldestProbe = nullptr;          }      }      else if (sLevel > 0)      { // when probes are enabled don't update the default probe less often than the prescribed update period -      oldestProbe = mDefaultProbe; +        oldestProbe = mDefaultProbe;      }      // switch to updating the next oldest probe @@ -505,11 +550,33 @@ void LLReflectionMapManager::update()          LLReflectionMap* probe = oldestProbe;          llassert(probe->mCubeIndex != -1); -        probe->autoAdjustOrigin(); +        bool shouldUpdate = true; -        sUpdateCount++; -        mUpdatingProbe = probe; -        doProbeUpdate(); +        if( probe->mNextUpdateTime > 0.f && gFrameTimeSeconds < probe->mNextUpdateTime) +        { +            shouldUpdate = false; +        } + +        if(shouldUpdate) +        { +            probe->autoAdjustOrigin(); + +            sUpdateCount++; +            mUpdatingProbe = probe; + +            if(probe->mCompletedCount < 2) +            { +                LL_WARNS() << "we program a short delay for this probe" << LL_ENDL; +                probe->mNextUpdateTime = gFrameTimeSeconds + fmax( ((F32)sMPUpdatePeriod / 2.0), 0.25); +            } +            else +            { +                LL_WARNS() << "we program a long delay for this probe" << LL_ENDL; +                probe->mNextUpdateTime = gFrameTimeSeconds + fmax( (F32)sMPUpdatePeriod, 0.25); +            } + +            doProbeUpdate(); +        }      }      if (oldestOccluded) @@ -717,32 +784,63 @@ void LLReflectionMapManager::doProbeUpdate()      LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;      llassert(mUpdatingProbe != nullptr); -    updateProbeFace(mUpdatingProbe, mUpdatingFace); +    static LLCachedControl<bool> mp_progressive(gSavedSettings, "MPRenderProbeProgressive", false); + +    if(mUpdatingFace < 6) +    { +        updateProbeFace(mUpdatingProbe, mUpdatingFace, mp_progressive); +    } +    else if(mp_progressive) +    { +        if(isRadiancePass()) +        { +            //updateProbeRadiance(mUpdatingProbe); +        } +        else updateProbeIrradiance(mUpdatingProbe); +    } +    else +    { +        if(isRadiancePass()) +        { +            updateProbeRadiance(mUpdatingProbe); +        } +        else updateProbeIrradiance(mUpdatingProbe); +    }      bool debug_updates = gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PROBE_UPDATES) && mUpdatingProbe->mViewerObject; -    if (++mUpdatingFace == 6) +    if (mUpdatingFace == 6)      {          if (debug_updates)          {              mUpdatingProbe->mViewerObject->setDebugText(llformat("%.1f", (F32)gFrameTimeSeconds), LLColor4(1, 1, 1, 1));          } +          updateNeighbors(mUpdatingProbe); +          mUpdatingFace = 0; +          if (isRadiancePass())          {              mUpdatingProbe->mComplete = true; +            mUpdatingProbe->mCompletedCount++;              mUpdatingProbe = nullptr;              mRadiancePass = false; +            LL_WARNS() << "probe updated !" << LL_ENDL;          }          else          {              mRadiancePass = true;          }      } -    else if (debug_updates) +    else      { -        mUpdatingProbe->mViewerObject->setDebugText(llformat("%.1f", (F32)gFrameTimeSeconds), LLColor4(1, 1, 0, 1)); +        ++mUpdatingFace; + +        if (debug_updates) +        { +            mUpdatingProbe->mViewerObject->setDebugText(llformat("%.1f", (F32)gFrameTimeSeconds), LLColor4(1, 1, 0, 1)); +        }      }  } @@ -754,7 +852,7 @@ void LLReflectionMapManager::doProbeUpdate()  // The next six passes render the scene with both radiance and irradiance into the same scratch space cube map and generate a simple mip chain.  // At the end of these passes, a radiance map is generated for this probe and placed into the radiance cube map array at the index for this probe.  // In effect this simulates single-bounce lighting. -void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face) +void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face, bool progressive)  {      // hacky hot-swap of camera specific render targets      gPipeline.mRT = &gPipeline.mAuxillaryRT; @@ -795,12 +893,13 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)          sourceIdx += 1;      } -    gGL.setColorMask(true, true); +    gGL.setColorMask(true, false);      LLGLDepthTest depth(GL_FALSE, GL_FALSE);      LLGLDisable cull(GL_CULL_FACE);      LLGLDisable blend(GL_BLEND);      // downsample to placeholder map +      {          gGL.matrixMode(gGL.MM_MODELVIEW);          gGL.pushMatrix(); @@ -829,7 +928,8 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)              // horizontal              gGaussianProgram.uniform2f(direction, 1.f, 0.f);              gGL.getTexUnit(diffuseChannel)->bind(screen_rt); -            mRenderTarget.bindTarget(); +            mRenderTarget.bindTarget("", 1); +            mRenderTarget.clear(0);              gPipeline.mScreenTriangleVB->setBuffer();              gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);              mRenderTarget.flush(); @@ -837,22 +937,26 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)              // vertical              gGaussianProgram.uniform2f(direction, 0.f, 1.f);              gGL.getTexUnit(diffuseChannel)->bind(&mRenderTarget); -            screen_rt->bindTarget(); +            screen_rt->bindTarget("", 1); +            screen_rt->clear(0);              gPipeline.mScreenTriangleVB->setBuffer();              gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);              screen_rt->flush();          } -          S32 mips = (S32)(log2((F32)mProbeResolution) + 0.5f);          gReflectionMipProgram.bind(); +          S32 diffuseChannel = gReflectionMipProgram.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, LLTexUnit::TT_TEXTURE);          for (int i = 0; i < mMipChain.size(); ++i)          {              LL_PROFILE_GPU_ZONE("probe mip"); -            mMipChain[i].bindTarget(); + +            mMipChain[i].bindTarget("probe face ", 0); +            mMipChain[i].clear(0); +              if (i == 0)              {                  gGL.getTexUnit(diffuseChannel)->bind(screen_rt); @@ -862,7 +966,6 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)                  gGL.getTexUnit(diffuseChannel)->bind(&(mMipChain[i - 1]));              } -              gReflectionMipProgram.uniform1f(resScale, 1.f/(mProbeResolution*2));              gPipeline.mScreenTriangleVB->setBuffer(); @@ -897,116 +1000,297 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)          gReflectionMipProgram.unbind();      } -    if (face == 5) +    if(progressive)      { -        mMipChain[0].bindTarget(); -        static LLStaticHashedString sSourceIdx("sourceIdx"); +        if(isRadiancePass()) updateProbeRadianceOnFace(probe, face, sourceIdx); +    } -        if (isRadiancePass()) +   // if(isRadiancePass()) updateProbeRadianceOnFace(probe, face, sourceIdx); +    //else updateProbeIrradianceOnFace(probe, face, sourceIdx); +} + +// ===================== IRRADIANCE ================================ + +void LLReflectionMapManager::updateProbeIrradiance(LLReflectionMap* probe) +{ +    LL_PROFILE_GPU_ZONE("probe irradiance gen"); + +    static LLStaticHashedString sMipLevel("mipLevel"); +    static LLStaticHashedString sRoughness("roughness"); +    static LLStaticHashedString sWidth("u_width"); + +    S32 sourceIdx = mReflectionProbeCount; + +    if (probe != mUpdatingProbe) +    { // this is the "realtime" probe that's updating every frame, use the secondary scratch space channel +        sourceIdx += 1; +    } + +    gGL.setColorMask(true, false); +    LLGLDepthTest depth(GL_FALSE, GL_FALSE); +    LLGLDisable cull(GL_CULL_FACE); +    LLGLDisable blend(GL_BLEND); + +    static LLStaticHashedString sSourceIdx("sourceIdx"); + +    LL_WARNS() << "IRRADIANCE 1" << LL_ENDL; + +    mMipChain[0].bindTarget("irradiance", 0); +    mMipChain[0].clear(0); + +    gIrradianceGenProgram.bind(); + +    S32 channel = gIrradianceGenProgram.enableTexture(LLShaderMgr::REFLECTION_PROBES, LLTexUnit::TT_CUBE_MAP_ARRAY); +    mTexture->bind(channel); + +    gIrradianceGenProgram.uniform1i(sSourceIdx, sourceIdx); +    gIrradianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_MAX_LOD, mMaxProbeLOD); + +    mVertexBuffer->setBuffer(); + +    int start_mip = 0; +    // find the mip target to start with based on irradiance map resolution +    for (start_mip = 0; start_mip < mMipChain.size(); ++start_mip) +    { +        if (mMipChain[start_mip].getWidth() == LL_IRRADIANCE_MAP_RESOLUTION)          { -            //generate radiance map (even if this is not the irradiance map, we need the mip chain for the irradiance map) -            gRadianceGenProgram.bind(); -            mVertexBuffer->setBuffer(); +            break; +        } +    } -#if GL_VERSION_4_0 -            S32 channel = gRadianceGenProgram.enableTexture(LLShaderMgr::REFLECTION_PROBES, LLTexUnit::TT_CUBE_MAP_ARRAY); -            mTexture->bind(channel); -#endif -            gRadianceGenProgram.uniform1i(sSourceIdx, sourceIdx); -            gRadianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_MAX_LOD, mMaxProbeLOD); -            gRadianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_STRENGTH, 1.f); +    int i = start_mip; -            U32 res = mMipChain[0].getWidth(); +    //LL_PROFILE_GPU_ZONE("probe irradiance gen"); -            for (int i = 0; i < mMipChain.size(); ++i) -            { -                LL_PROFILE_GPU_ZONE("probe radiance gen"); -                static LLStaticHashedString sMipLevel("mipLevel"); -                static LLStaticHashedString sRoughness("roughness"); -                static LLStaticHashedString sWidth("u_width"); +    glViewport(0, 0, mMipChain[i].getWidth(), mMipChain[i].getHeight()); -                gRadianceGenProgram.uniform1f(sRoughness, (F32)i / (F32)(mMipChain.size() - 1)); -                gRadianceGenProgram.uniform1f(sMipLevel, (GLfloat)i); -                gRadianceGenProgram.uniform1i(sWidth, mProbeResolution); +    for (int cf = 0; cf < 6; ++cf) +    { +        LLCoordFrame frame; +        frame.lookAt(LLVector3(0, 0, 0), LLCubeMapArray::sClipToCubeLookVecs[cf], LLCubeMapArray::sClipToCubeUpVecs[cf]); -                for (int cf = 0; cf < 6; ++cf) -                { // for each cube face -                    LLCoordFrame frame; -                    frame.lookAt(LLVector3(0, 0, 0), LLCubeMapArray::sClipToCubeLookVecs[cf], LLCubeMapArray::sClipToCubeUpVecs[cf]); +        F32 mat[16]; +        frame.getOpenGLRotation(mat); +        gGL.loadMatrix(mat); -                    F32 mat[16]; -                    frame.getOpenGLRotation(mat); -                    gGL.loadMatrix(mat); +        mVertexBuffer->drawArrays(gGL.TRIANGLE_STRIP, 0, 4); -                    mVertexBuffer->drawArrays(gGL.TRIANGLE_STRIP, 0, 4); +        S32 res = mMipChain[i].getWidth(); -#if GL_VERSION_4_0 -                    glCopyTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, i, 0, 0, probe->mCubeIndex * 6 + cf, 0, 0, res, res); -#endif -                } +        mIrradianceMaps->bind(channel); +        glCopyTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, i - start_mip, 0, 0, probe->mCubeIndex * 6 + cf, 0, 0, res, res); +        mTexture->bind(channel); +        //mMipChain[0].clear(0); +    } -                if (i != mMipChain.size() - 1) -                { -                    res /= 2; -                    glViewport(0, 0, res, res); -                } -            } +    mMipChain[0].flush(); +    gIrradianceGenProgram.unbind(); +} + +// ==================== RADIANCE =========================== + +void LLReflectionMapManager::updateProbeRadiance(LLReflectionMap* probe) +{ +    LL_PROFILE_GPU_ZONE("probe radiance gen"); +    static LLStaticHashedString sMipLevel("mipLevel"); +    static LLStaticHashedString sRoughness("roughness"); +    static LLStaticHashedString sWidth("u_width"); + +    S32 sourceIdx = mReflectionProbeCount; + +    if (probe != mUpdatingProbe) +    { // this is the "realtime" probe that's updating every frame, use the secondary scratch space channel +        sourceIdx += 1; +    } + +    gGL.setColorMask(true, false); +    LLGLDepthTest depth(GL_FALSE, GL_FALSE); +    LLGLDisable cull(GL_CULL_FACE); +    LLGLDisable blend(GL_BLEND); + +    static LLStaticHashedString sSourceIdx("sourceIdx"); -            gRadianceGenProgram.unbind(); +    LL_WARNS() << "RADIANCE" << LL_ENDL; +    //LL_RECORD_BLOCK_TIME(FTM_RENDER_RADIANCE); + +    mMipChain[0].bindTarget("radiance", 0); +    mMipChain[0].clear(); + +    gRadianceGenProgram.bind(); +    mVertexBuffer->setBuffer(); + +    S32 channel = gRadianceGenProgram.enableTexture(LLShaderMgr::REFLECTION_PROBES, LLTexUnit::TT_CUBE_MAP_ARRAY); +    mTexture->bind(channel); + +    gRadianceGenProgram.uniform1i(sSourceIdx, sourceIdx); +    gRadianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_MAX_LOD, mMaxProbeLOD); +    gRadianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_STRENGTH, 1.f); +    gRadianceGenProgram.uniform1i(sWidth, mProbeResolution); + +    U32 res = mMipChain[0].getWidth(); + +    for (int i = 0; i < mMipChain.size(); ++i) +    { +        glViewport(0, 0, res, res); + + +        gRadianceGenProgram.uniform1f(sMipLevel, (GLfloat)i); +        gRadianceGenProgram.uniform1f(sRoughness, (F32)i / (F32)(mMipChain.size() - 1)); + +        for (int cf = 0; cf < 6; ++cf) +        { +            LLCoordFrame frame; +            frame.lookAt(LLVector3(0, 0, 0), LLCubeMapArray::sClipToCubeLookVecs[cf], LLCubeMapArray::sClipToCubeUpVecs[cf]); + +            F32 mat[16]; +            frame.getOpenGLRotation(mat); +            gGL.loadMatrix(mat); + +            mVertexBuffer->drawArrays(gGL.TRIANGLE_STRIP, 0, 4); + +            glCopyTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, i, 0, 0, probe->mCubeIndex * 6 + cf, 0, 0, res, res); +            LOG_GLERROR("glCopyTexSubImage3D");          } -        else + +        if (i != mMipChain.size() - 1)          { -            //generate irradiance map -            gIrradianceGenProgram.bind(); -#if GL_VERSION_4_0 -            S32 channel = gIrradianceGenProgram.enableTexture(LLShaderMgr::REFLECTION_PROBES, LLTexUnit::TT_CUBE_MAP_ARRAY); -            mTexture->bind(channel); -#endif +            res /= 2; +        } +    } -            gIrradianceGenProgram.uniform1i(sSourceIdx, sourceIdx); -            gIrradianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_MAX_LOD, mMaxProbeLOD); +    gRadianceGenProgram.unbind(); +    mMipChain[0].flush(); +    //mTexture->unbind(); +} -            mVertexBuffer->setBuffer(); -            int start_mip = 0; -            // find the mip target to start with based on irradiance map resolution -            for (start_mip = 0; start_mip < mMipChain.size(); ++start_mip) -            { -                if (mMipChain[start_mip].getWidth() == LL_IRRADIANCE_MAP_RESOLUTION) -                { -                    break; -                } -            } +// ================== PER FACE ======================= -            //for (int i = start_mip; i < mMipChain.size(); ++i) -            { -                int i = start_mip; -                LL_PROFILE_GPU_ZONE("probe irradiance gen"); -                glViewport(0, 0, mMipChain[i].getWidth(), mMipChain[i].getHeight()); -                for (int cf = 0; cf < 6; ++cf) -                { // for each cube face -                    LLCoordFrame frame; -                    frame.lookAt(LLVector3(0, 0, 0), LLCubeMapArray::sClipToCubeLookVecs[cf], LLCubeMapArray::sClipToCubeUpVecs[cf]); +void LLReflectionMapManager::updateProbeIrradianceOnFace(LLReflectionMap* probe, U32 face, S32 sourceIdx) +{ +    LL_PROFILE_GPU_ZONE("probe irradiance gen"); -                    F32 mat[16]; -                    frame.getOpenGLRotation(mat); -                    gGL.loadMatrix(mat); +    static LLStaticHashedString sMipLevel("mipLevel"); +    static LLStaticHashedString sRoughness("roughness"); +    static LLStaticHashedString sWidth("u_width"); -                    mVertexBuffer->drawArrays(gGL.TRIANGLE_STRIP, 0, 4); +    gGL.setColorMask(true, false); +    LLGLDepthTest depth(GL_FALSE, GL_FALSE); +    LLGLDisable cull(GL_CULL_FACE); +    LLGLDisable blend(GL_BLEND); -                    S32 res = mMipChain[i].getWidth(); -#if GL_VERSION_4_0 -                    mIrradianceMaps->bind(channel); -                    glCopyTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, i - start_mip, 0, 0, probe->mCubeIndex * 6 + cf, 0, 0, res, res); -                    mTexture->bind(channel); -#endif -                } -            } +    static LLStaticHashedString sSourceIdx("sourceIdx"); + +    //LL_WARNS() << "IRRADIANCE" << LL_ENDL; + +    mMipChain[0].bindTarget("irradiance", 0); +    //mMipChain[0].clear(); + +    gIrradianceGenProgram.bind(); + +    S32 channel = gIrradianceGenProgram.enableTexture(LLShaderMgr::REFLECTION_PROBES, LLTexUnit::TT_CUBE_MAP_ARRAY); +    mTexture->bind(channel); + +    gIrradianceGenProgram.uniform1i(sSourceIdx, sourceIdx); +    gIrradianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_MAX_LOD, mMaxProbeLOD); + +    mVertexBuffer->setBuffer(); + +    int start_mip = 0; +    // find the mip target to start with based on irradiance map resolution +    for (start_mip = 0; start_mip < mMipChain.size(); ++start_mip) +    { +        if (mMipChain[start_mip].getWidth() == LL_IRRADIANCE_MAP_RESOLUTION) +        { +            break;          } +    } + +    int i = start_mip; +    glViewport(0, 0, mMipChain[i].getWidth(), mMipChain[i].getHeight()); -        mMipChain[0].flush(); +    int cf = face; +    { +        LLCoordFrame frame; +        frame.lookAt(LLVector3(0, 0, 0), LLCubeMapArray::sClipToCubeLookVecs[cf], LLCubeMapArray::sClipToCubeUpVecs[cf]); + +        F32 mat[16]; +        frame.getOpenGLRotation(mat); +        gGL.loadMatrix(mat); -        gIrradianceGenProgram.unbind(); +        mVertexBuffer->drawArrays(gGL.TRIANGLE_STRIP, 0, 4); + +        S32 res = mMipChain[i].getWidth(); +        mIrradianceMaps->bind(channel); +        glCopyTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, i - start_mip, 0, 0, probe->mCubeIndex * 6 + cf, 0, 0, res, res);      } + +    mMipChain[0].flush(); +    gIrradianceGenProgram.unbind(); +    mTexture->unbind(); +} + +void LLReflectionMapManager::updateProbeRadianceOnFace(LLReflectionMap* probe, U32 face, S32 sourceIdx) +{ +    LL_PROFILE_GPU_ZONE("probe radiance gen"); +    static LLStaticHashedString sMipLevel("mipLevel"); +    static LLStaticHashedString sRoughness("roughness"); +    static LLStaticHashedString sWidth("u_width"); + +    gGL.setColorMask(true, false); +    LLGLDepthTest depth(GL_FALSE, GL_FALSE); +    LLGLDisable cull(GL_CULL_FACE); +    LLGLDisable blend(GL_BLEND); + +    static LLStaticHashedString sSourceIdx("sourceIdx"); + +    mMipChain[0].bindTarget("radiance", 0); +    mMipChain[0].clear(0); + +    gRadianceGenProgram.bind(); +    mVertexBuffer->setBuffer(); + +    S32 channel = gRadianceGenProgram.enableTexture(LLShaderMgr::REFLECTION_PROBES, LLTexUnit::TT_CUBE_MAP_ARRAY); +    mTexture->bind(channel); + +    gRadianceGenProgram.uniform1i(sSourceIdx, sourceIdx); +    gRadianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_MAX_LOD, mMaxProbeLOD); +    gRadianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_STRENGTH, 1.f); +    gRadianceGenProgram.uniform1i(sWidth, mProbeResolution); + +    U32 res = mMipChain[0].getWidth(); + +    for (int i = 0; i < mMipChain.size(); ++i) +    { +        glViewport(0, 0, res, res); + +        gRadianceGenProgram.uniform1f(sMipLevel, (GLfloat)i); +        gRadianceGenProgram.uniform1f(sRoughness, (F32)i / (F32)(mMipChain.size() - 1)); + +        int cf = face; +        { +            LLCoordFrame frame; +            frame.lookAt(LLVector3(0, 0, 0), LLCubeMapArray::sClipToCubeLookVecs[cf], LLCubeMapArray::sClipToCubeUpVecs[cf]); + +            F32 mat[16]; +            frame.getOpenGLRotation(mat); +            gGL.loadMatrix(mat); + +            mVertexBuffer->drawArrays(gGL.TRIANGLE_STRIP, 0, 4); + +            glCopyTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, i, 0, 0, probe->mCubeIndex * 6 + cf, 0, 0, res, res); +            LOG_GLERROR("glCopyTexSubImage3D"); +            //mMipChain[0].clear(0); +        } + +        if (i != mMipChain.size() - 1) +        { +            res /= 2; +        } +    } + +    gRadianceGenProgram.unbind(); +    mMipChain[0].flush(); +    mTexture->unbind();  }  void LLReflectionMapManager::reset() @@ -1109,6 +1393,7 @@ void LLReflectionMapManager::updateUniforms()      LLSettingsSky::ptr_t psky = environment.getCurrentSky();      static LLCachedControl<bool> should_auto_adjust(gSavedSettings, "RenderSkyAutoAdjustLegacy", false); +      F32 minimum_ambiance = psky->getReflectionProbeAmbiance(should_auto_adjust);      bool is_ambiance_pass = gCubeSnapshot && !isRadiancePass(); @@ -1426,8 +1711,13 @@ void LLReflectionMapManager::initReflectionMaps()  {      static LLCachedControl<U32> ref_probe_res(gSavedSettings, "RenderReflectionProbeResolution", 128U);      U32 probe_resolution = nhpo2(llclamp(ref_probe_res(), (U32)64, (U32)512)); -    if (mTexture.isNull() || mReflectionProbeCount != mDynamicProbeCount || mProbeResolution != probe_resolution || mReset) + +    bool shouldInit = mTexture.isNull() || mReflectionProbeCount != mDynamicProbeCount || mProbeResolution != probe_resolution || mReset; + +    if (shouldInit)      { +        //LL_WARNS() << "====== initReflectionMaps() =======" << LL_ENDL; +          if(mProbeResolution != probe_resolution)          {              mRenderTarget.release(); @@ -1444,6 +1734,8 @@ void LLReflectionMapManager::initReflectionMaps()              mTexture->getWidth() != mProbeResolution ||              mReflectionProbeCount + 2 != mTexture->getCount())          { +            static LLCachedControl<bool> render_hdr(gSavedSettings, "RenderHDREnabled", true); +              if (mTexture)              {                  mTexture = new LLCubeMapArray(*mTexture, mProbeResolution, mReflectionProbeCount + 2); @@ -1453,13 +1745,9 @@ void LLReflectionMapManager::initReflectionMaps()              else              {                  mTexture = new LLCubeMapArray(); - -                static LLCachedControl<bool> render_hdr(gSavedSettings, "RenderHDREnabled", true); -                  // store mReflectionProbeCount+2 cube maps, final two cube maps are used for render target and radiance map generation                  // source)                  mTexture->allocate(mProbeResolution, 3, mReflectionProbeCount + 2, true, render_hdr); -                  mIrradianceMaps = new LLCubeMapArray();                  mIrradianceMaps->allocate(LL_IRRADIANCE_MAP_RESOLUTION, 3, mReflectionProbeCount, false, render_hdr);              } @@ -1477,7 +1765,9 @@ void LLReflectionMapManager::initReflectionMaps()          for (auto& probe : mProbes)          {              probe->mLastUpdateTime = 0.f; +            probe->mNextUpdateTime = 0.f;              probe->mComplete = false; +            probe->mCompletedCount = 0;              probe->mProbeIndex = -1;              probe->mCubeArray = nullptr;              probe->mCubeIndex = -1; @@ -1503,8 +1793,13 @@ void LLReflectionMapManager::initReflectionMaps()          mDefaultProbe->mRadius = 4096.f;          mDefaultProbe->mProbeIndex = 0;          mDefaultProbe->mComplete = default_complete; +        mDefaultProbe->mCompletedCount = 0; +        mDefaultProbe->mLastUpdateTime = 0.f; +        mDefaultProbe->mNextUpdateTime = 0.f;          touch_default_probe(mDefaultProbe); + +        LL_WARNS() << "====== END initReflectionMaps() =======" << LL_ENDL;      }      if (mVertexBuffer.isNull()) diff --git a/indra/newview/llreflectionmapmanager.h b/indra/newview/llreflectionmapmanager.h index 0719c28134..b874bb1c17 100644 --- a/indra/newview/llreflectionmapmanager.h +++ b/indra/newview/llreflectionmapmanager.h @@ -210,7 +210,14 @@ private:      void doProbeUpdate();      // update the specified face of the specified probe -    void updateProbeFace(LLReflectionMap* probe, U32 face); +    void updateProbeFace(LLReflectionMap* probe, U32 face, bool progressive = false); + +    void updateProbeIrradiance(LLReflectionMap* probe); +    void updateProbeRadiance(LLReflectionMap* probe); + +    void updateProbeIrradianceOnFace(LLReflectionMap* probe, U32 face, S32 sourceIdx); +    void updateProbeRadianceOnFace(LLReflectionMap* probe, U32 face, S32 sourceIdx); +      // list of active reflection maps      std::vector<LLPointer<LLReflectionMap> > mProbes; @@ -267,6 +274,8 @@ private:      bool mPaused = false;      F32 mResumeTime = 0.f; +    F32 mLastUpdate = 0.f; +      ReflectionProbeData mProbeData;  }; diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 8286054787..183a9a9924 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -6531,10 +6531,8 @@ void LLSelectMgr::renderSilhouettes(bool for_hud)          gGL.popMatrix();          gGL.popMatrix(); -        glLineWidth(1.f); -#if GL_VERSION_1_1 +        //glLineWidth(1.f);          glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); -#endif          if (shader)          { diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp index 68b4ab381a..445132632b 100644 --- a/indra/newview/llsnapshotlivepreview.cpp +++ b/indra/newview/llsnapshotlivepreview.cpp @@ -238,11 +238,11 @@ void LLSnapshotLivePreview::drawPreviewRect(S32 offset_x, S32 offset_y, LLColor4  {      F32 line_width ;      glGetFloatv(GL_LINE_WIDTH, &line_width) ; -    glLineWidth(2.0f * line_width) ; +    //glLineWidth(2.0f * line_width) ;      LLColor4 color(0.0f, 0.0f, 0.0f, 1.0f) ;      gl_rect_2d( mPreviewRect.mLeft + offset_x, mPreviewRect.mTop + offset_y,          mPreviewRect.mRight + offset_x, mPreviewRect.mBottom + offset_y, color, false ) ; -    glLineWidth(line_width) ; +    //glLineWidth(line_width) ;      //draw four alpha rectangles to cover areas outside of the snapshot image      if(!mKeepAspectRatio) diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index a90ff73578..a147cb4657 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -1661,12 +1661,12 @@ void renderOctree(LLSpatialGroup* group)              gGL.diffuseColor4f(1,0,0,group->mBuilt);              gGL.flush(); -            glLineWidth(5.f); +            //glLineWidth(5.f);              const LLVector4a* bounds = group->getObjectBounds();              drawBoxOutline(bounds[0], bounds[1]); -            gGL.flush(); -            glLineWidth(1.f); +            //gGL.flush(); +            //glLineWidth(1.f);              gGL.flush();              const LLVOAvatar* lastAvatar = nullptr; @@ -1978,12 +1978,11 @@ void renderBoundingBox(LLDrawable* drawable, bool set_color = true)      if (vobj && vobj->onActiveList())      {          gGL.flush(); -        glLineWidth(llmax(4.f*sinf(gFrameTimeSeconds*2.f)+1.f, 1.f)); -        //glLineWidth(4.f*(sinf(gFrameTimeSeconds*2.f)*0.25f+0.75f)); -        stop_glerror(); +        //glLineWidth(llmax(4.f*sinf(gFrameTimeSeconds*2.f)+1.f, 1.f)); +         stop_glerror();          drawBoxOutline(pos,size);          gGL.flush(); -        glLineWidth(1.f); +        //glLineWidth(1.f);      }      else      { @@ -2897,7 +2896,7 @@ public:              if (i == 1)              {                  gGL.flush(); -                glLineWidth(3.f); +                //glLineWidth(3.f);              }              gGL.begin(LLRender::TRIANGLES); @@ -2916,7 +2915,7 @@ public:              if (i == 1)              {                  gGL.flush(); -                glLineWidth(1.f); +                //glLineWidth(1.f);              }          }      } diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index bda75c16e7..7d397cddcc 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -307,9 +307,21 @@ void LLStatusBar::refresh()          mFpsUpdateTimer->reset();          S32 fps = (S32) llround(LLTrace::get_frame_recording().getPeriodMedianPerSec(LLStatViewer::FPS, 50)); +        if(fps < 1) fps = 1; + +        S32 minFps = (S32) llround(LLTrace::get_frame_recording().getPeriodMinPerSec(LLStatViewer::FPS, 50)); +        S32 maxFps = (S32) llround(LLTrace::get_frame_recording().getPeriodMaxPerSec(LLStatViewer::FPS, 50)); + +        F32 fpsQuality = (F32)minFps / (F32)fps; +          std::string fpsStr = std::to_string(fps); -        //mTextFps->setText(fpsStr); +          mTextFps->setLabel(fpsStr); + +        if(fpsQuality < 0.5) mTextFps->setColor(LLColor4(0.6,0.0,0.0)); +        else if(fpsQuality < 0.7) mTextFps->setColor(LLColor4(0.7,0.5,0.0)); +        else if(fpsQuality < 0.9) mTextFps->setColor(LLColor4(0.5,0.7,0.0)); +        else mTextFps->setColor(LLColor4(0.0, 0.7, 0.15));      }      // update clock every 10 seconds diff --git a/indra/newview/llterrainpaintmap.cpp b/indra/newview/llterrainpaintmap.cpp index c7a82013e4..8cb926a110 100644 --- a/indra/newview/llterrainpaintmap.cpp +++ b/indra/newview/llterrainpaintmap.cpp @@ -86,9 +86,10 @@ bool LLTerrainPaintMap::bakeHeightNoiseIntoPBRPaintMapRGB(const LLViewerRegion&          return false;      }      gGL.getTexUnit(0)->disable(); -    stop_glerror(); -    scratch_target.bindTarget(); +    LOG_GLERROR(""); + +    scratch_target.bindTarget("", 1);      glClearColor(0, 0, 0, 0);      scratch_target.clear(); @@ -276,7 +277,7 @@ bool LLTerrainPaintMap::bakeHeightNoiseIntoPBRPaintMapRGB(const LLViewerRegion&          LL_WARNS() << "Failed to copy framebuffer to paintmap" << LL_ENDL;      }      glGenerateMipmap(GL_TEXTURE_2D); -    stop_glerror(); +    LOG_GLERROR("LLTerrainPainMap::bakeHeightNoiseIntoPBRPaintMapRGB() - glGenerateMipmap");      scratch_target.flush(); diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 6e790e4fca..fb060307cd 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -709,6 +709,8 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)      if (!gDisconnected && !LLApp::isExiting())      { +        // =========== MIRRORS ============= +          // Render mirrors and associated hero probes before we render the rest of the scene.          // This ensures the scene state in the hero probes are exactly the same as the rest of the scene before we render it.          if (gPipeline.RenderMirrors && !gSnapshot) @@ -734,12 +736,14 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)          display_update_camera();          stop_glerror(); +        // =========== ENV: SKY, WATER  =============          {              LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("Env Update");              // update all the sky/atmospheric/water settings              LLEnvironment::instance().update(LLViewerCamera::getInstance());          } +        // =========== EFFECTS (?)  =============          // *TODO: merge these two methods          {              LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("HUD Update"); @@ -748,6 +752,7 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)              stop_glerror();          } +        // =========== GEOMETRY  =============          {              LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("Update Geom");              const F32 max_geom_update_time = 0.005f*10.f*gFrameIntervalSeconds.value(); // 50 ms/second update time @@ -778,6 +783,8 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)          LLGLState::checkStates(); +        // =========== OCCLUSION  ============= +          static LLCullResult result;          LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;          LLPipeline::sUnderWaterRender = LLViewerCamera::getInstance()->cameraUnderWater(); @@ -803,12 +810,18 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)              if (!for_snapshot)              { -                if (gFrameCount > 1 && !for_snapshot) -                { //for some reason, ATI 4800 series will error out if you -                  //try to generate a shadow before the first frame is through + +                // =========== SHADOWS  ============= + +                S32 RenderShadowDetail = gSavedSettings.getS32("RenderShadowDetail"); + +                if(RenderShadowDetail > 0 && gFrameCount > 1) +                {                      gPipeline.generateSunShadow(*LLViewerCamera::getInstance());                  } +                // =========== IMPOSTORS  ============= +                  LLVertexBuffer::unbind();                  LLGLState::checkStates(); @@ -832,6 +845,9 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)              glClear(GL_DEPTH_BUFFER_BIT);          } + +        // =========== IMAGES  ============= +          //////////////////////////////////////          //          // Update images, using the image stats generated during object update/culling @@ -870,6 +886,9 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)          LLGLState::checkStates(); + +        // =========== SORTING OBJECTS  ============= +          ///////////////////////////////////          //          // StateSort @@ -903,6 +922,9 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)          LLPipeline::sUseOcclusion = occlusion; + +        // =========== SKY  ============= +          {              LLAppViewer::instance()->pingMainloopTimeout("Display:Sky");              LL_PROFILE_ZONE_NAMED_CATEGORY_ENVIRONMENT("update sky"); //LL_RECORD_BLOCK_TIME(FTM_UPDATE_SKY); @@ -954,6 +976,9 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)          //  gGL.popMatrix();          //} + +        // =========== DEFERRED  ============= +          LLPipeline::sUnderWaterRender = LLViewerCamera::getInstance()->cameraUnderWater();          LLGLState::checkStates(); @@ -962,7 +987,7 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)          gGL.setColorMask(true, true); -        gPipeline.mRT->deferredScreen.bindTarget(); +        gPipeline.mRT->deferredScreen.bindTarget("", 1);          if (gUseWireframe)          {              constexpr F32 g = 0.5f; @@ -974,6 +999,9 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)          }          gPipeline.mRT->deferredScreen.clear(); + +        // =========== RENDER GEOMETRY  ============= +          gGL.setColorMask(true, false);          LLAppViewer::instance()->pingMainloopTimeout("Display:RenderGeom"); @@ -984,7 +1012,11 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)              LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("display - 5")              LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD; + +            // =========== RENDER DEPTH PREPASS  (UNUSED) ============= +              static LLCachedControl<bool> render_depth_pre_pass(gSavedSettings, "RenderDepthPrePass", false); +              if (render_depth_pre_pass)              {                  gGL.setColorMask(false, false); @@ -1010,6 +1042,8 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)              gPipeline.renderGeomDeferred(*LLViewerCamera::getInstance(), true);          } +        // =========== UNBIND TEXTURES ============= +          {              LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("Texture Unbind");              for (S32 i = 0; i < gGLManager.mNumTextureImageUnits; i++) @@ -1022,11 +1056,15 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)              }          } +        // =========== FLUSH ============= +          LLAppViewer::instance()->pingMainloopTimeout("Display:RenderFlush");          LLRenderTarget &rt = (gPipeline.sRenderDeferred ? gPipeline.mRT->deferredScreen : gPipeline.mRT->screen);          rt.flush(); +        // =========== RENDER DEFERRED ============= +          if (LLPipeline::sRenderDeferred)          {              gPipeline.renderDeferredLighting(); @@ -1039,10 +1077,16 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)              LLSceneMonitor::getInstance()->capture();          } + + +        // =========== RENDER UI ============= +          LLAppViewer::instance()->pingMainloopTimeout("Display:RenderUI");          if (!for_snapshot)          { +            gGL.flush();              render_ui(); +            gGL.flush();              swap();          } @@ -1053,8 +1097,6 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)      LLAppViewer::instance()->pingMainloopTimeout("Display:FrameStats"); -    stop_glerror(); -      display_stats();      LLAppViewer::instance()->pingMainloopTimeout("Display:Done"); @@ -1203,8 +1245,8 @@ void display_cube_face()      gGL.setColorMask(true, true); -    glClearColor(0.f, 0.f, 0.f, 0.f); -    gPipeline.generateSunShadow(*LLViewerCamera::getInstance()); +    glClearColor(0, 0, 0, 0); +    //gPipeline.generateSunShadow(*LLViewerCamera::getInstance());      glClear(GL_DEPTH_BUFFER_BIT); // | GL_STENCIL_BUFFER_BIT); @@ -1232,7 +1274,7 @@ void display_cube_face()      gGL.setColorMask(true, true); -    gPipeline.mRT->deferredScreen.bindTarget(); +    gPipeline.mRT->deferredScreen.bindTarget("", 1);      if (gUseWireframe)      {          glClearColor(0.5f, 0.5f, 0.5f, 1.f); @@ -1497,6 +1539,7 @@ void render_ui(F32 zoom_factor, int subfield)          LL_PROFILE_ZONE_NAMED_CATEGORY_UI("HUD");          render_hud_elements();          LLGLState::checkStates(); +          render_hud_attachments();          LLGLState::checkStates(); @@ -1669,7 +1712,7 @@ void render_ui_3d()          LLHUDObject::renderAllForTimer();      } -    stop_glerror(); +    LOG_GLERROR("render_ui_3d()");  }  void render_ui_2d() @@ -1719,7 +1762,7 @@ void render_ui_2d()          gl_rect_2d(-half_width, half_height, half_width, -half_height, false);          gGL.popMatrix();          gUIProgram.unbind(); -        stop_glerror(); +        LOG_GLERROR("");      } @@ -1730,7 +1773,7 @@ void render_ui_2d()              LLView::sIsRectDirty = false;              LLRect t_rect; -            gPipeline.mUIScreen.bindTarget(); +            gPipeline.mUIScreen.bindTarget("", 1);              gGL.setColorMask(true, true);              {                  constexpr S32 pad = 8; @@ -1788,6 +1831,8 @@ void render_ui_2d()      // reset current origin for font rendering, in case of tiling render      LLFontGL::sCurOrigin.set(0, 0); + +    LOG_GLERROR("render_ui_2d()");  }  void render_disconnected_background() diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp index e36ad0e722..0bb03cdd60 100755 --- a/indra/newview/llviewerparceloverlay.cpp +++ b/indra/newview/llviewerparceloverlay.cpp @@ -809,7 +809,7 @@ void LLViewerParcelOverlay::renderPropertyLinesOnMinimap(F32 scale_pixels_per_me      const S32 GRIDS_PER_EDGE   = mParcelGridsPerEdge;      gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -    glLineWidth(1.0f); +    //glLineWidth(1.0f);      gGL.color4fv(parcel_outline_color);      for (S32 i = 0; i <= GRIDS_PER_EDGE; i++)      { diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 7ef13c3a35..4d62adf3e2 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -137,6 +137,10 @@ LLGLSLShader            gGlowProgram;  LLGLSLShader            gGlowExtractProgram;  LLGLSLShader            gPostScreenSpaceReflectionProgram; +LLGLSLShader            gBloomExtractProgram; +LLGLSLShader            gBloomBlurProgram; +LLGLSLShader            gBloomCombineProgram; +  // Deferred rendering shaders  LLGLSLShader            gDeferredImpostorProgram;  LLGLSLShader            gDeferredDiffuseProgram; @@ -802,7 +806,7 @@ std::string LLViewerShaderMgr::loadBasicShaders()      if (shadow_detail >= 1)      { -        attribs["SUN_SHADOW"] = "1"; +    attribs["SUN_SHADOW"] = "1";          if (shadow_detail >= 2)          { @@ -902,8 +906,9 @@ bool LLViewerShaderMgr::loadShadersWater()      bool success = true;      bool terrainWaterSuccess = true; +    S32 shadow_detail = gSavedSettings.getS32("RenderShadowDetail");      bool use_sun_shadow = mShaderLevel[SHADER_DEFERRED] > 1 && -        gSavedSettings.getS32("RenderShadowDetail") > 0; +        shadow_detail > 0;      if (mShaderLevel[SHADER_WATER] == 0)      { @@ -1003,6 +1008,52 @@ bool LLViewerShaderMgr::loadShadersEffects()      if (success)      { +        gBloomExtractProgram.mName = "Bloom Extract Shader"; +        gBloomExtractProgram.mShaderFiles.clear(); +        gBloomExtractProgram.mShaderFiles.push_back(make_pair("effects/bloomExtractV.glsl", GL_VERTEX_SHADER)); +        gBloomExtractProgram.mShaderFiles.push_back(make_pair("effects/bloomExtractF.glsl", GL_FRAGMENT_SHADER)); +        gBloomExtractProgram.mShaderLevel = mShaderLevel[SHADER_EFFECT]; + +        success = gBloomExtractProgram.createShader(); +        if (!success) +        { +            LL_WARNS() << "gBloomExtractProgram creation ERROR" << LL_ENDL; +            //LLPipeline::sRenderGlow = false; +        } +    } + +    if (success) +    { +        gBloomBlurProgram.mName = "Bloom Blur Shader"; +        gBloomBlurProgram.mShaderFiles.clear(); +        gBloomBlurProgram.mShaderFiles.push_back(make_pair("effects/bloomBlurV.glsl", GL_VERTEX_SHADER)); +        gBloomBlurProgram.mShaderFiles.push_back(make_pair("effects/bloomBlurF.glsl", GL_FRAGMENT_SHADER)); +        gBloomBlurProgram.mShaderLevel = mShaderLevel[SHADER_EFFECT]; + +        success = gBloomBlurProgram.createShader(); +        if(!success) +        { +            LL_WARNS() << "gBloomBlurProgram creation ERROR" << LL_ENDL; +        } +    } + +    if (success) +    { +        gBloomCombineProgram.mName = "Bloom Combine Shader"; +        gBloomCombineProgram.mShaderFiles.clear(); +        gBloomCombineProgram.mShaderFiles.push_back(make_pair("effects/bloomCombineV.glsl", GL_VERTEX_SHADER)); +        gBloomCombineProgram.mShaderFiles.push_back(make_pair("effects/bloomCombineF.glsl", GL_FRAGMENT_SHADER)); +        gBloomCombineProgram.mShaderLevel = mShaderLevel[SHADER_EFFECT]; + +        success = gBloomCombineProgram.createShader(); +        if(!success) +        { +            LL_WARNS() << "gBloomCombineProgram creation ERROR" << LL_ENDL; +        } +    } + +    if (success) +    {          gGlowProgram.mName = "Glow Shader (Post)";          gGlowProgram.mShaderFiles.clear();          gGlowProgram.mShaderFiles.push_back(make_pair("effects/glowV.glsl", GL_VERTEX_SHADER)); @@ -2482,9 +2533,9 @@ bool LLViewerShaderMgr::loadShadersDeferred()      if (success && gGLManager.mGLVersion > 3.9f)      {          std::vector<std::pair<std::string, std::string>> quality_levels = { {"12", "Low"}, -                                                                             {"23", "Medium"}, -                                                                             {"28", "High"}, -                                                                             {"39", "Ultra"} }; +                                                                            {"23", "Medium"}, +                                                                            {"28", "High"}, +                                                                            {"39", "Ultra"} };          int i = 0;          bool failed = false;          for (const auto& quality_pair : quality_levels) @@ -2535,9 +2586,9 @@ bool LLViewerShaderMgr::loadShadersDeferred()      if (gGLManager.mGLVersion > 3.15f && success)      {          std::vector<std::pair<std::string, std::string>> quality_levels = { {"SMAA_PRESET_LOW", "Low"}, -                                                                             {"SMAA_PRESET_MEDIUM", "Medium"}, -                                                                             {"SMAA_PRESET_HIGH", "High"}, -                                                                          {"SMAA_PRESET_ULTRA", "Ultra"} }; +                                                                            {"SMAA_PRESET_MEDIUM", "Medium"}, +                                                                            {"SMAA_PRESET_HIGH", "High"}, +                                                                        {"SMAA_PRESET_ULTRA", "Ultra"} };          int i = 0;          bool failed = false;          for (const auto& smaa_pair : quality_levels) diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index 7ad2da9464..89c4bb5605 100644 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -24,301 +24,306 @@   * $/LicenseInfo$   */ -#ifndef LL_VIEWER_SHADER_MGR_H -#define LL_VIEWER_SHADER_MGR_H - -#include "llshadermgr.h" -#include "llmaterial.h" - -#define LL_DEFERRED_MULTI_LIGHT_COUNT 16 - -class LLViewerShaderMgr: public LLShaderMgr -{ -public: -    static bool sInitialized; -    static bool sSkipReload; - -    LLViewerShaderMgr(); -    /* virtual */ ~LLViewerShaderMgr(); - -    // Add shaders to mShaderList for later uniform propagation -    // Will assert on redundant shader entries in debug builds -    void finalizeShaderList(); - -    // singleton pattern implementation -    static LLViewerShaderMgr * instance(); -    static void releaseInstance(); - -    void initAttribsAndUniforms(void); -    void setShaders(); -    void unloadShaders(); -    S32  getShaderLevel(S32 type); - -    // loadBasicShaders in case of a failure returns -    // name of a file error happened at, otherwise -    // returns an empty string -    std::string loadBasicShaders(); -    bool loadShadersEffects(); -    bool loadShadersDeferred(); -    bool loadShadersObject(); -    bool loadShadersAvatar(); -    bool loadShadersWater(); -    bool loadShadersInterface(); - -    std::vector<S32> mShaderLevel; -    S32 mMaxAvatarShaderLevel; - -    enum EShaderClass -    { -        SHADER_LIGHTING, -        SHADER_OBJECT, -        SHADER_AVATAR, -        SHADER_ENVIRONMENT, -        SHADER_INTERFACE, -        SHADER_EFFECT, -        SHADER_WINDLIGHT, -        SHADER_WATER, -        SHADER_DEFERRED, -        SHADER_COUNT -    }; - -    // simple model of forward iterator -    // http://www.sgi.com/tech/stl/ForwardIterator.html -    class shader_iter -    { -    private: -        friend bool operator == (shader_iter const & a, shader_iter const & b); -        friend bool operator != (shader_iter const & a, shader_iter const & b); - -        typedef std::vector<LLGLSLShader *>::const_iterator base_iter_t; -    public: -        shader_iter() -        { -        } - -        shader_iter(base_iter_t iter) : mIter(iter) -        { -        } - -        LLGLSLShader & operator * () const -        { -            return **mIter; -        } - -        LLGLSLShader * operator -> () const -        { -            return *mIter; -        } - -        shader_iter & operator++ () -        { -            ++mIter; -            return *this; -        } - -        shader_iter operator++ (int) -        { -            return mIter++; -        } - -    private: -        base_iter_t mIter; -    }; - -    shader_iter beginShaders() const; -    shader_iter endShaders() const; - -    /* virtual */ std::string getShaderDirPrefix(void); - -    /* virtual */ void updateShaderUniforms(LLGLSLShader * shader); - -private: -    // the list of shaders we need to propagate parameters to. -    std::vector<LLGLSLShader *> mShaderList; - -}; //LLViewerShaderMgr - -inline bool operator == (LLViewerShaderMgr::shader_iter const & a, LLViewerShaderMgr::shader_iter const & b) -{ -    return a.mIter == b.mIter; -} - -inline bool operator != (LLViewerShaderMgr::shader_iter const & a, LLViewerShaderMgr::shader_iter const & b) -{ -    return a.mIter != b.mIter; -} - -extern LLVector4            gShinyOrigin; - -//utility shaders -extern LLGLSLShader         gOcclusionProgram; -extern LLGLSLShader         gOcclusionCubeProgram; -extern LLGLSLShader         gGlowCombineProgram; -extern LLGLSLShader         gReflectionMipProgram; -extern LLGLSLShader         gGaussianProgram; -extern LLGLSLShader         gRadianceGenProgram; -extern LLGLSLShader         gHeroRadianceGenProgram; -extern LLGLSLShader         gIrradianceGenProgram; -extern LLGLSLShader         gGlowCombineFXAAProgram; -extern LLGLSLShader         gDebugProgram; -enum NormalDebugShaderVariant : S32 -{ -    NORMAL_DEBUG_SHADER_DEFAULT, -    NORMAL_DEBUG_SHADER_WITH_TANGENTS, -    NORMAL_DEBUG_SHADER_COUNT -}; -extern LLGLSLShader         gNormalDebugProgram[NORMAL_DEBUG_SHADER_COUNT]; -extern LLGLSLShader         gSkinnedNormalDebugProgram[NORMAL_DEBUG_SHADER_COUNT]; -extern LLGLSLShader         gClipProgram; -extern LLGLSLShader         gBenchmarkProgram; -extern LLGLSLShader         gReflectionProbeDisplayProgram; -extern LLGLSLShader         gCopyProgram; -extern LLGLSLShader         gCopyDepthProgram; -extern LLGLSLShader         gPBRTerrainBakeProgram; -extern LLGLSLShader         gDrawColorProgram; - -//output tex0[tc0] - tex1[tc1] -extern LLGLSLShader         gTwoTextureCompareProgram; -//discard some fragments based on user-set color tolerance -extern LLGLSLShader         gOneTextureFilterProgram; - - -//object shaders -extern LLGLSLShader     gObjectPreviewProgram; -extern LLGLSLShader        gPhysicsPreviewProgram; -extern LLGLSLShader     gObjectBumpProgram; -extern LLGLSLShader        gSkinnedObjectBumpProgram; -extern LLGLSLShader     gObjectAlphaMaskNoColorProgram; - -//environment shaders -extern LLGLSLShader         gWaterProgram; -extern LLGLSLShader         gUnderWaterProgram; -extern LLGLSLShader         gGlowProgram; -extern LLGLSLShader         gGlowExtractProgram; - -//interface shaders -extern LLGLSLShader         gHighlightProgram; -extern LLGLSLShader         gHighlightNormalProgram; -extern LLGLSLShader         gHighlightSpecularProgram; - -extern LLGLSLShader         gDeferredHighlightProgram; - -extern LLGLSLShader         gPathfindingProgram; -extern LLGLSLShader         gPathfindingNoNormalsProgram; - -// avatar shader handles -extern LLGLSLShader         gAvatarProgram; -extern LLGLSLShader         gAvatarEyeballProgram; -extern LLGLSLShader         gImpostorProgram; - -// Post Process Shaders -extern LLGLSLShader         gPostScreenSpaceReflectionProgram; - -// Deferred rendering shaders -extern LLGLSLShader         gDeferredImpostorProgram; -extern LLGLSLShader         gDeferredDiffuseProgram; -extern LLGLSLShader         gDeferredDiffuseAlphaMaskProgram; -extern LLGLSLShader         gDeferredNonIndexedDiffuseAlphaMaskProgram; -extern LLGLSLShader         gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram; -extern LLGLSLShader         gDeferredNonIndexedDiffuseProgram; -extern LLGLSLShader         gDeferredBumpProgram; -extern LLGLSLShader         gDeferredTerrainProgram; -extern LLGLSLShader         gDeferredTreeProgram; -extern LLGLSLShader         gDeferredTreeShadowProgram; -extern LLGLSLShader         gDeferredLightProgram; -extern LLGLSLShader         gDeferredMultiLightProgram[LL_DEFERRED_MULTI_LIGHT_COUNT]; -extern LLGLSLShader         gDeferredSpotLightProgram; -extern LLGLSLShader         gDeferredMultiSpotLightProgram; -extern LLGLSLShader         gDeferredSunProgram; -extern LLGLSLShader         gDeferredSunProbeProgram; -extern LLGLSLShader         gHazeProgram; -extern LLGLSLShader         gHazeWaterProgram; -extern LLGLSLShader         gDeferredBlurLightProgram; -extern LLGLSLShader         gDeferredAvatarProgram; -extern LLGLSLShader         gDeferredSoftenProgram; -extern LLGLSLShader         gDeferredShadowProgram; -extern LLGLSLShader         gDeferredShadowCubeProgram; -extern LLGLSLShader         gDeferredShadowAlphaMaskProgram; -extern LLGLSLShader         gDeferredShadowGLTFAlphaMaskProgram; -extern LLGLSLShader         gDeferredShadowGLTFAlphaBlendProgram; -extern LLGLSLShader         gDeferredShadowFullbrightAlphaMaskProgram; -extern LLGLSLShader         gDeferredPostProgram; -extern LLGLSLShader         gDeferredCoFProgram; -extern LLGLSLShader         gDeferredDoFCombineProgram; -extern LLGLSLShader         gFXAAProgram[4]; -extern LLGLSLShader         gSMAAEdgeDetectProgram[4]; -extern LLGLSLShader         gSMAABlendWeightsProgram[4]; -extern LLGLSLShader         gSMAANeighborhoodBlendProgram[4]; -extern LLGLSLShader         gCASProgram; -extern LLGLSLShader         gDeferredPostNoDoFProgram; -extern LLGLSLShader         gDeferredPostNoDoFNoiseProgram; -extern LLGLSLShader         gDeferredPostGammaCorrectProgram; -extern LLGLSLShader         gLegacyPostGammaCorrectProgram; -extern LLGLSLShader         gDeferredPostTonemapProgram; -extern LLGLSLShader         gNoPostTonemapProgram; -extern LLGLSLShader         gExposureProgram; -extern LLGLSLShader         gExposureProgramNoFade; -extern LLGLSLShader         gLuminanceProgram; -extern LLGLSLShader         gDeferredAvatarShadowProgram; -extern LLGLSLShader         gDeferredAvatarAlphaShadowProgram; -extern LLGLSLShader         gDeferredAvatarAlphaMaskShadowProgram; -extern LLGLSLShader         gDeferredAlphaProgram; -extern LLGLSLShader         gHUDAlphaProgram; -extern LLGLSLShader         gDeferredAlphaImpostorProgram; -extern LLGLSLShader         gDeferredFullbrightProgram; -extern LLGLSLShader         gHUDFullbrightProgram; -extern LLGLSLShader         gDeferredFullbrightAlphaMaskProgram; -extern LLGLSLShader         gHUDFullbrightAlphaMaskProgram; -extern LLGLSLShader         gDeferredFullbrightAlphaMaskAlphaProgram; -extern LLGLSLShader         gHUDFullbrightAlphaMaskAlphaProgram; -extern LLGLSLShader         gDeferredEmissiveProgram; -extern LLGLSLShader         gDeferredAvatarEyesProgram; -extern LLGLSLShader         gDeferredAvatarAlphaProgram; -extern LLGLSLShader         gEnvironmentMapProgram; -extern LLGLSLShader         gDeferredWLSkyProgram; -extern LLGLSLShader         gDeferredWLCloudProgram; -extern LLGLSLShader         gDeferredWLSunProgram; -extern LLGLSLShader         gDeferredWLMoonProgram; -extern LLGLSLShader         gDeferredStarProgram; -extern LLGLSLShader         gDeferredFullbrightShinyProgram; -extern LLGLSLShader         gHUDFullbrightShinyProgram; -extern LLGLSLShader         gNormalMapGenProgram; -extern LLGLSLShader         gDeferredGenBrdfLutProgram; -extern LLGLSLShader         gDeferredBufferVisualProgram; - -// Deferred materials shaders -extern LLGLSLShader         gDeferredMaterialProgram[LLMaterial::SHADER_COUNT*2]; - -extern LLGLSLShader         gHUDPBROpaqueProgram; -extern LLGLSLShader         gPBRGlowProgram; -extern LLGLSLShader         gDeferredPBROpaqueProgram; -extern LLGLSLShader         gDeferredPBRAlphaProgram; -extern LLGLSLShader         gHUDPBRAlphaProgram; - -// GLTF shaders -extern LLGLSLShader         gGLTFPBRMetallicRoughnessProgram; - -// Encodes detail level for dropping textures, in accordance with the GLTF spec where possible -// 0 is highest detail, -1 drops emissive, etc -// Dropping metallic roughness is off-spec - Reserve for potato machines as needed -// https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#additional-textures -enum TerrainPBRDetail : S32 -{ -    TERRAIN_PBR_DETAIL_MAX                = 0, -    TERRAIN_PBR_DETAIL_EMISSIVE           = 0, -    TERRAIN_PBR_DETAIL_OCCLUSION          = -1, -    TERRAIN_PBR_DETAIL_NORMAL             = -2, -    TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS = -3, -    TERRAIN_PBR_DETAIL_BASE_COLOR         = -4, -    TERRAIN_PBR_DETAIL_MIN                = -4, -}; -enum TerrainPaintType : U32 -{ -    // Use LLVLComposition::mDatap (heightmap) generated by generateHeights, plus noise from TERRAIN_ALPHARAMP -    TERRAIN_PAINT_TYPE_HEIGHTMAP_WITH_NOISE = 0, -    // Use paint map if PBR terrain, otherwise fall back to TERRAIN_PAINT_TYPE_HEIGHTMAP_WITH_NOISE -    TERRAIN_PAINT_TYPE_PBR_PAINTMAP         = 1, -    TERRAIN_PAINT_TYPE_COUNT                = 2, -}; -extern LLGLSLShader         gDeferredPBRTerrainProgram[TERRAIN_PAINT_TYPE_COUNT]; -#endif + #ifndef LL_VIEWER_SHADER_MGR_H + #define LL_VIEWER_SHADER_MGR_H + + #include "llshadermgr.h" + #include "llmaterial.h" + + #define LL_DEFERRED_MULTI_LIGHT_COUNT 16 + + class LLViewerShaderMgr: public LLShaderMgr + { + public: +     static bool sInitialized; +     static bool sSkipReload; + +     LLViewerShaderMgr(); +     /* virtual */ ~LLViewerShaderMgr(); + +     // Add shaders to mShaderList for later uniform propagation +     // Will assert on redundant shader entries in debug builds +     void finalizeShaderList(); + +     // singleton pattern implementation +     static LLViewerShaderMgr * instance(); +     static void releaseInstance(); + +     void initAttribsAndUniforms(void); +     void setShaders(); +     void unloadShaders(); +     S32  getShaderLevel(S32 type); + +     // loadBasicShaders in case of a failure returns +     // name of a file error happened at, otherwise +     // returns an empty string +     std::string loadBasicShaders(); +     bool loadShadersEffects(); +     bool loadShadersDeferred(); +     bool loadShadersObject(); +     bool loadShadersAvatar(); +     bool loadShadersWater(); +     bool loadShadersInterface(); + +     std::vector<S32> mShaderLevel; +     S32 mMaxAvatarShaderLevel; + +     enum EShaderClass +     { +         SHADER_LIGHTING, +         SHADER_OBJECT, +         SHADER_AVATAR, +         SHADER_ENVIRONMENT, +         SHADER_INTERFACE, +         SHADER_EFFECT, +         SHADER_WINDLIGHT, +         SHADER_WATER, +         SHADER_DEFERRED, +         SHADER_COUNT +     }; + +     // simple model of forward iterator +     // http://www.sgi.com/tech/stl/ForwardIterator.html +     class shader_iter +     { +     private: +         friend bool operator == (shader_iter const & a, shader_iter const & b); +         friend bool operator != (shader_iter const & a, shader_iter const & b); + +         typedef std::vector<LLGLSLShader *>::const_iterator base_iter_t; +     public: +         shader_iter() +         { +         } + +         shader_iter(base_iter_t iter) : mIter(iter) +         { +         } + +         LLGLSLShader & operator * () const +         { +             return **mIter; +         } + +         LLGLSLShader * operator -> () const +         { +             return *mIter; +         } + +         shader_iter & operator++ () +         { +             ++mIter; +             return *this; +         } + +         shader_iter operator++ (int) +         { +             return mIter++; +         } + +     private: +         base_iter_t mIter; +     }; + +     shader_iter beginShaders() const; +     shader_iter endShaders() const; + +     /* virtual */ std::string getShaderDirPrefix(void); + +     /* virtual */ void updateShaderUniforms(LLGLSLShader * shader); + + private: +     // the list of shaders we need to propagate parameters to. +     std::vector<LLGLSLShader *> mShaderList; + + }; //LLViewerShaderMgr + + inline bool operator == (LLViewerShaderMgr::shader_iter const & a, LLViewerShaderMgr::shader_iter const & b) + { +     return a.mIter == b.mIter; + } + + inline bool operator != (LLViewerShaderMgr::shader_iter const & a, LLViewerShaderMgr::shader_iter const & b) + { +     return a.mIter != b.mIter; + } + + extern LLVector4            gShinyOrigin; + + //utility shaders + extern LLGLSLShader         gOcclusionProgram; + extern LLGLSLShader         gOcclusionCubeProgram; + extern LLGLSLShader         gGlowCombineProgram; + extern LLGLSLShader         gReflectionMipProgram; + extern LLGLSLShader         gGaussianProgram; + extern LLGLSLShader         gRadianceGenProgram; + extern LLGLSLShader         gHeroRadianceGenProgram; + extern LLGLSLShader         gIrradianceGenProgram; + extern LLGLSLShader         gGlowCombineFXAAProgram; + extern LLGLSLShader         gDebugProgram; + enum NormalDebugShaderVariant : S32 + { +     NORMAL_DEBUG_SHADER_DEFAULT, +     NORMAL_DEBUG_SHADER_WITH_TANGENTS, +     NORMAL_DEBUG_SHADER_COUNT + }; + extern LLGLSLShader         gNormalDebugProgram[NORMAL_DEBUG_SHADER_COUNT]; + extern LLGLSLShader         gSkinnedNormalDebugProgram[NORMAL_DEBUG_SHADER_COUNT]; + extern LLGLSLShader         gClipProgram; + extern LLGLSLShader         gBenchmarkProgram; + extern LLGLSLShader         gReflectionProbeDisplayProgram; + extern LLGLSLShader         gCopyProgram; + extern LLGLSLShader         gCopyDepthProgram; + extern LLGLSLShader         gPBRTerrainBakeProgram; + extern LLGLSLShader         gDrawColorProgram; + + //output tex0[tc0] - tex1[tc1] + extern LLGLSLShader         gTwoTextureCompareProgram; + //discard some fragments based on user-set color tolerance + extern LLGLSLShader         gOneTextureFilterProgram; + + + //object shaders + extern LLGLSLShader     gObjectPreviewProgram; + extern LLGLSLShader        gPhysicsPreviewProgram; + extern LLGLSLShader     gObjectBumpProgram; + extern LLGLSLShader        gSkinnedObjectBumpProgram; + extern LLGLSLShader     gObjectAlphaMaskNoColorProgram; + + //environment shaders + extern LLGLSLShader         gWaterProgram; + extern LLGLSLShader         gUnderWaterProgram; + extern LLGLSLShader         gGlowProgram; + extern LLGLSLShader         gGlowExtractProgram; + + //interface shaders + extern LLGLSLShader         gHighlightProgram; + extern LLGLSLShader         gHighlightNormalProgram; + extern LLGLSLShader         gHighlightSpecularProgram; + + extern LLGLSLShader         gDeferredHighlightProgram; + + extern LLGLSLShader         gPathfindingProgram; + extern LLGLSLShader         gPathfindingNoNormalsProgram; + + // avatar shader handles + extern LLGLSLShader         gAvatarProgram; + extern LLGLSLShader         gAvatarEyeballProgram; + extern LLGLSLShader         gImpostorProgram; + + // Post Process Shaders + extern LLGLSLShader         gPostScreenSpaceReflectionProgram; + + // Deferred rendering shaders + extern LLGLSLShader         gDeferredImpostorProgram; + extern LLGLSLShader         gDeferredDiffuseProgram; + extern LLGLSLShader         gDeferredDiffuseAlphaMaskProgram; + extern LLGLSLShader         gDeferredNonIndexedDiffuseAlphaMaskProgram; + extern LLGLSLShader         gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram; + extern LLGLSLShader         gDeferredNonIndexedDiffuseProgram; + extern LLGLSLShader         gDeferredBumpProgram; + extern LLGLSLShader         gDeferredTerrainProgram; + extern LLGLSLShader         gDeferredTreeProgram; + extern LLGLSLShader         gDeferredTreeShadowProgram; + extern LLGLSLShader         gDeferredLightProgram; + extern LLGLSLShader         gDeferredMultiLightProgram[LL_DEFERRED_MULTI_LIGHT_COUNT]; + extern LLGLSLShader         gDeferredSpotLightProgram; + extern LLGLSLShader         gDeferredMultiSpotLightProgram; + extern LLGLSLShader         gDeferredSunProgram; + extern LLGLSLShader         gDeferredSunProbeProgram; + extern LLGLSLShader         gHazeProgram; + extern LLGLSLShader         gHazeWaterProgram; + extern LLGLSLShader         gDeferredBlurLightProgram; + extern LLGLSLShader         gDeferredAvatarProgram; + extern LLGLSLShader         gDeferredSoftenProgram; + extern LLGLSLShader         gDeferredShadowProgram; + extern LLGLSLShader         gDeferredShadowCubeProgram; + extern LLGLSLShader         gDeferredShadowAlphaMaskProgram; + extern LLGLSLShader         gDeferredShadowGLTFAlphaMaskProgram; + extern LLGLSLShader         gDeferredShadowGLTFAlphaBlendProgram; + extern LLGLSLShader         gDeferredShadowFullbrightAlphaMaskProgram; + extern LLGLSLShader         gDeferredPostProgram; + extern LLGLSLShader         gDeferredCoFProgram; + extern LLGLSLShader         gDeferredDoFCombineProgram; + extern LLGLSLShader         gFXAAProgram[4]; + extern LLGLSLShader         gSMAAEdgeDetectProgram[4]; + extern LLGLSLShader         gSMAABlendWeightsProgram[4]; + extern LLGLSLShader         gSMAANeighborhoodBlendProgram[4]; + extern LLGLSLShader         gCASProgram; + extern LLGLSLShader         gDeferredPostNoDoFProgram; + extern LLGLSLShader         gDeferredPostNoDoFNoiseProgram; + extern LLGLSLShader         gDeferredPostGammaCorrectProgram; + extern LLGLSLShader         gLegacyPostGammaCorrectProgram; + extern LLGLSLShader         gDeferredPostTonemapProgram; + extern LLGLSLShader         gNoPostTonemapProgram; + extern LLGLSLShader         gExposureProgram; + extern LLGLSLShader         gExposureProgramNoFade; + extern LLGLSLShader         gLuminanceProgram; + extern LLGLSLShader         gDeferredAvatarShadowProgram; + extern LLGLSLShader         gDeferredAvatarAlphaShadowProgram; + extern LLGLSLShader         gDeferredAvatarAlphaMaskShadowProgram; + extern LLGLSLShader         gDeferredAlphaProgram; + extern LLGLSLShader         gHUDAlphaProgram; + extern LLGLSLShader         gDeferredAlphaImpostorProgram; + extern LLGLSLShader         gDeferredFullbrightProgram; + extern LLGLSLShader         gHUDFullbrightProgram; + extern LLGLSLShader         gDeferredFullbrightAlphaMaskProgram; + extern LLGLSLShader         gHUDFullbrightAlphaMaskProgram; + extern LLGLSLShader         gDeferredFullbrightAlphaMaskAlphaProgram; + extern LLGLSLShader         gHUDFullbrightAlphaMaskAlphaProgram; + extern LLGLSLShader         gDeferredEmissiveProgram; + extern LLGLSLShader         gDeferredAvatarEyesProgram; + extern LLGLSLShader         gDeferredAvatarAlphaProgram; + extern LLGLSLShader         gEnvironmentMapProgram; + extern LLGLSLShader         gDeferredWLSkyProgram; + extern LLGLSLShader         gDeferredWLCloudProgram; + extern LLGLSLShader         gDeferredWLSunProgram; + extern LLGLSLShader         gDeferredWLMoonProgram; + extern LLGLSLShader         gDeferredStarProgram; + extern LLGLSLShader         gDeferredFullbrightShinyProgram; + extern LLGLSLShader         gHUDFullbrightShinyProgram; + extern LLGLSLShader         gNormalMapGenProgram; + extern LLGLSLShader         gDeferredGenBrdfLutProgram; + extern LLGLSLShader         gDeferredBufferVisualProgram; + + // Deferred materials shaders + extern LLGLSLShader         gDeferredMaterialProgram[LLMaterial::SHADER_COUNT*2]; + + extern LLGLSLShader         gHUDPBROpaqueProgram; + extern LLGLSLShader         gPBRGlowProgram; + extern LLGLSLShader         gDeferredPBROpaqueProgram; + extern LLGLSLShader         gDeferredPBRAlphaProgram; + extern LLGLSLShader         gHUDPBRAlphaProgram; + + // GLTF shaders + extern LLGLSLShader         gGLTFPBRMetallicRoughnessProgram; + + extern LLGLSLShader         gBloomExtractProgram; + extern LLGLSLShader         gBloomBlurProgram; + extern LLGLSLShader         gBloomCombineProgram; + + + // Encodes detail level for dropping textures, in accordance with the GLTF spec where possible + // 0 is highest detail, -1 drops emissive, etc + // Dropping metallic roughness is off-spec - Reserve for potato machines as needed + // https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#additional-textures + enum TerrainPBRDetail : S32 + { +     TERRAIN_PBR_DETAIL_MAX                = 0, +     TERRAIN_PBR_DETAIL_EMISSIVE           = 0, +     TERRAIN_PBR_DETAIL_OCCLUSION          = -1, +     TERRAIN_PBR_DETAIL_NORMAL             = -2, +     TERRAIN_PBR_DETAIL_METALLIC_ROUGHNESS = -3, +     TERRAIN_PBR_DETAIL_BASE_COLOR         = -4, +     TERRAIN_PBR_DETAIL_MIN                = -4, + }; + enum TerrainPaintType : U32 + { +     // Use LLVLComposition::mDatap (heightmap) generated by generateHeights, plus noise from TERRAIN_ALPHARAMP +     TERRAIN_PAINT_TYPE_HEIGHTMAP_WITH_NOISE = 0, +     // Use paint map if PBR terrain, otherwise fall back to TERRAIN_PAINT_TYPE_HEIGHTMAP_WITH_NOISE +     TERRAIN_PAINT_TYPE_PBR_PAINTMAP         = 1, +     TERRAIN_PAINT_TYPE_COUNT                = 2, + }; + extern LLGLSLShader         gDeferredPBRTerrainProgram[TERRAIN_PAINT_TYPE_COUNT]; + #endif diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 7e14c621ad..5bbcd8f09f 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -1146,6 +1146,8 @@ F32 LLViewerTextureList::updateImagesCreateTextures(F32 max_time)          // just in case we downres textures, bind downresmap and copy program          gPipeline.mDownResMap.bindTarget(); +        //gPipeline.mDownResMap.clear(); +          gCopyProgram.bind();          gPipeline.mScreenTriangleVB->setBuffer(); @@ -1155,7 +1157,7 @@ F32 LLViewerTextureList::updateImagesCreateTextures(F32 max_time)          // do at least 5 and make sure we don't get too far behind even if it violates          // the time limit.  If we don't downscale quickly the viewer will hit swap and may          // freeze. -        S32 min_count = (S32)mCreateTextureList.size() / 20 + 5; +        S32 min_count = (S32)mCreateTextureList.size() / 20 + 3;          create_timer.reset();          while (!mDownScaleQueue.empty()) diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index d3af22a9d9..9e52ed9a12 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -4829,21 +4829,13 @@ void LLViewerWindow::saveImageLocal(LLImageFormatted *image, const snapshot_save      auto err = 0;      auto extension("." + image->getExtension());      auto now = LLDate::now(); -    static LLCachedControl<bool> snapshot_timestamp(gSavedSettings, "SnapshotTimestamp", true) ;      do      {          filepath = sSnapshotDir;          filepath += gDirUtilp->getDirDelimiter();          filepath += sSnapshotBaseName; -        if (snapshot_timestamp) -        {          filepath += now.toLocalDateString("_%Y-%m-%d_%H%M%S");          filepath += llformat("%.2d", i); -        } -	else if (is_snapshot_name_loc_set) -        { -            filepath += llformat("_%.3d", i); -        }          filepath += extension;          llstat stat_info; @@ -5045,7 +5037,7 @@ bool LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei                      mWorldViewRectRaw.set(0, image_height, image_width, 0);                      LLViewerCamera::getInstance()->setViewHeightInPixels( mWorldViewRectRaw.getHeight() );                      LLViewerCamera::getInstance()->setAspect( getWorldViewAspectRatio() ); -                    scratch_space.bindTarget(); +                    scratch_space.bindTarget("", 0);                  }                  else                  { @@ -5312,7 +5304,7 @@ bool LLViewerWindow::simpleSnapshot(LLImageRaw* raw, S32 image_width, S32 image_          {              mWorldViewRectRaw.set(0, image_height, image_width, 0); -            scratch_space.bindTarget(); +            scratch_space.bindTarget("", 0);          }          else          { diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index c6f8160c0d..10b5b7514c 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -5463,7 +5463,7 @@ U32 LLVOAvatar::renderImpostor(LLColor4U color, S32 diffuse_channel)          gGL.begin(LLRender::LINES);          gGL.color4f(1.f,1.f,1.f,1.f);          F32 thickness = llmax(F32(5.0f-5.0f*(gFrameTimeSeconds-mLastImpostorUpdateFrameTime)),1.0f); -        glLineWidth(thickness); +        //glLineWidth(thickness);          gGL.vertex3fv((pos+left-up).mV);          gGL.vertex3fv((pos-left-up).mV);          gGL.vertex3fv((pos-left-up).mV); diff --git a/indra/newview/mpfloatertuning.cpp b/indra/newview/mpfloatertuning.cpp index 1a3e4cf718..23f8c21e70 100644 --- a/indra/newview/mpfloatertuning.cpp +++ b/indra/newview/mpfloatertuning.cpp @@ -39,47 +39,37 @@ MPFloaterTuning::MPFloaterTuning(const LLSD& key) : LLFloater(key)  {  } -void MPFloaterTuning::syncFromPreferenceSetting(void *user_data) -{ -    MPFloaterTuning *self = static_cast<MPFloaterTuning*>(user_data); +bool MPFloaterTuning::postBuild() +{      U32 fps = gSavedSettings.getU32("MaxFPS");      if(fps==0) fps=132; -    LLSliderCtrl* fpsSliderCtrl = self->getChild<LLSliderCtrl>("fpsSlider"); -    fpsSliderCtrl->setValue(fps,FALSE); +    mFpsSlider = getChild<LLSliderCtrl>("fpsSliderCtrl"); +    mFpsSlider->setCommitCallback(boost::bind(&MPFloaterTuning::onFpsSliderChanged, this)); -    LLTextBox* fpsText = self->getChild<LLTextBox>("fpsText"); -    if(fps>120) fpsText->setValue("no limit"); -    else fpsText->setValue(std::to_string(fps)+" fps"); -} - -bool MPFloaterTuning::postBuild() -{ -    LLSliderCtrl* fpsSliderCtrl = getChild<LLSliderCtrl>("fpsSlider"); -    fpsSliderCtrl->setMinValue(12); -    fpsSliderCtrl->setMaxValue(132); -    fpsSliderCtrl->setSliderMouseUpCallback(boost::bind(&MPFloaterTuning::onFinalCommit,this)); +    mFpsSlider->setValue(fps, false); -    LLTextBox* fpsText = getChild<LLTextBox>("fpsText"); -    fpsText->setValue(""); +    mFpsTextBox = getChild<LLTextBox>("fpsTextCtrl"); +    mFpsTextBox->setValue(""); -    syncFromPreferenceSetting(this); +    if(fps>120) mFpsTextBox->setValue("no limit"); +    else if(fps==0) mFpsTextBox->setValue("no limit"); +    else mFpsTextBox->setValue(std::to_string(fps)+" fps"); -    return TRUE; +    return true;  }  // Do send-to-the-server work when slider drag completes, or new  // value entered as text. -void MPFloaterTuning::onFinalCommit() +void MPFloaterTuning::onFpsSliderChanged()  { -    LLSliderCtrl* fpsSliderCtrl = getChild<LLSliderCtrl>("fpsSlider"); -    U32 fps = (U32)fpsSliderCtrl->getValueF32(); +    U32 fps = (U32)mFpsSlider->getValueF32();      gSavedSettings.setU32("MaxFPS",fps); -    LLTextBox* fpsText = getChild<LLTextBox>("fpsText"); -    if(fps>120) fpsText->setValue("no limit"); -    else fpsText->setValue(std::to_string(fps)+" fps"); +    if(fps>120) mFpsTextBox->setValue("no limit"); +    else if(fps==0) mFpsTextBox->setValue("no limit"); +    else mFpsTextBox->setValue(std::to_string(fps)+" fps");  }  void MPFloaterTuning::onClose(bool app_quitting) diff --git a/indra/newview/mpfloatertuning.h b/indra/newview/mpfloatertuning.h index 9e9c7f174f..bebdaa9952 100644 --- a/indra/newview/mpfloatertuning.h +++ b/indra/newview/mpfloatertuning.h @@ -29,20 +29,28 @@  #include "llfloater.h" +class LLSliderCtrl; +class LLTextBox; +  class MPFloaterTuning: public LLFloater  { -public: +    public: +      MPFloaterTuning(const LLSD& key);      bool postBuild();      void onFinalCommit(); -    static void syncFromPreferenceSetting(void *user_data); - -    //void updateEditEnabled();      /*virtual*/ void onClose(bool app_quitting); + +    private: + +    LLSliderCtrl* mFpsSlider = nullptr; +    LLTextBox* mFpsTextBox = nullptr; + +    void onFpsSliderChanged();  };  #endif diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 6b3a5b1892..924efde89b 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -1,28 +1,28 @@  /** - * @file pipeline.cpp - * @brief Rendering pipeline. - * - * $LicenseInfo:firstyear=2005&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ +* @file pipeline.cpp +* @brief Rendering pipeline. +* +* $LicenseInfo:firstyear=2005&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2010, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA +* $/LicenseInfo$ +*/  #include "llviewerprecompiledheaders.h" @@ -141,7 +141,7 @@ bool LLPipeline::WindLightUseAtmosShaders;  bool LLPipeline::RenderDeferred;  F32 LLPipeline::RenderDeferredSunWash;  U32 LLPipeline::RenderFSAAType; -U32 LLPipeline::RenderResolutionDivisor; +F32 LLPipeline::RenderResolutionDivisor;  bool LLPipeline::RenderUIBuffer;  S32 LLPipeline::RenderShadowDetail;  S32 LLPipeline::MPRenderShadowOpti; @@ -229,6 +229,9 @@ const F32 ALPHA_BLEND_CUTOFF = 0.598f;  const F32 DEFERRED_LIGHT_FALLOFF = 0.5f;  const U32 DEFERRED_VB_MASK = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_TEXCOORD1; +const U32 SHADOWS_RESX = 1024; +const U32 SHADOWS_RESY = 768; +  extern S32 gBoxFrame;  extern bool gDisplaySwapBuffers;  extern bool gDebugGL; @@ -268,6 +271,7 @@ LLTrace::BlockTimerStatHandle FTM_STATESORT("Sort Draw State");  LLTrace::BlockTimerStatHandle FTM_PIPELINE("Pipeline");  LLTrace::BlockTimerStatHandle FTM_CLIENT_COPY("Client Copy");  LLTrace::BlockTimerStatHandle FTM_RENDER_DEFERRED("Deferred Shading"); +LLTrace::BlockTimerStatHandle FTM_RENDER_SHADOWS("Shadows");  LLTrace::BlockTimerStatHandle FTM_RENDER_UI_HUD("HUD");  LLTrace::BlockTimerStatHandle FTM_RENDER_UI_3D("3D"); @@ -346,18 +350,20 @@ void validate_framebuffer_object();  // target -- RenderTarget to add attachments to  bool addDeferredAttachments(LLRenderTarget& target, bool for_impostor = false)  { -    U32 orm = GL_RGBA; +    U32 orm = GL_RGBA8;      U32 norm = GL_RGBA16F;      U32 emissive = GL_RGB16F; +    static LLCachedControl<bool> MPLowColorPrecision(gSavedSettings, "MPLowColorPrecision", 0); +      static LLCachedControl<bool> has_emissive(gSavedSettings, "RenderEnableEmissiveBuffer", false);      static LLCachedControl<bool> has_hdr(gSavedSettings, "RenderHDREnabled", true);      bool hdr = has_hdr() && gGLManager.mGLVersion > 4.05f; -    if (!hdr) +    if (!hdr || MPLowColorPrecision)      {          norm = GL_RGB10_A2; -        emissive = GL_RGB; +        emissive = GL_RGB8;      }      bool valid = true; @@ -429,7 +435,7 @@ void LLPipeline::init()      mInitialized = true; -    stop_glerror(); +    LOG_GLERROR("LLPipeline::init()");      //create render pass pools      getPool(LLDrawPool::POOL_WATEREXCLUSION); @@ -701,7 +707,8 @@ void LLPipeline::cleanup()  void LLPipeline::destroyGL()  { -    stop_glerror(); +    LOG_GLERROR("LLPipeline::destroyGL()"); +      unloadShaders();      mHighlightFaces.clear(); @@ -730,9 +737,9 @@ void LLPipeline::resizeShadowTexture()  {      releaseSunShadowTargets();      releaseSpotShadowTargets(); -    GLuint resX = gViewerWindow->getWorldViewWidthRaw(); -    GLuint resY = gViewerWindow->getWorldViewHeightRaw(); -    allocateShadowBuffer(resX, resY); +    //GLuint resX = gViewerWindow->getWorldViewWidthRaw(); +    //GLuint resY = gViewerWindow->getWorldViewHeightRaw(); +    allocateShadowBuffer(SHADOWS_RESX, SHADOWS_RESY);      gResizeShadowTexture = false;  } @@ -762,6 +769,12 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)      return ret == FBO_SUCCESS_FULLRES;  } +void LLPipeline::renderTriangle() +{ +    gPipeline.mScreenTriangleVB->setBuffer(); +    gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); +} +  LLPipeline::eFBOStatus LLPipeline::doAllocateScreenBuffer(U32 resX, U32 resY)  { @@ -843,28 +856,31 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY)      mRT->width = resX;      mRT->height = resY; -    U32 res_mod = RenderResolutionDivisor; +    F32 res_mod = fmin(RenderResolutionDivisor, 4.0); -    if (res_mod > 1 && res_mod < resX && res_mod < resY) +    LL_WARNS() << "res_mod=" << res_mod << " resX=" << resX << " resY=" << resY << LL_ENDL; + +    if (res_mod >= 0.5 && res_mod <= 4.0)      { -        resX /= res_mod; -        resY /= res_mod; +        resX = (U32)(floor((F32)resX / res_mod)); +        resY = (U32)(floor((F32)resY / res_mod)); +        LL_WARNS() << "res_mod=" << res_mod << " resX=" << resX << " resY=" << resY << LL_ENDL;      }      S32 shadow_detail = RenderShadowDetail;      bool ssao = RenderDeferredSSAO;      //allocate deferred rendering color buffers -    if (!mRT->deferredScreen.allocate(resX, resY, GL_RGBA, true)) return false; +    if (!mRT->deferredScreen.allocate(resX, resY, GL_RGBA8, true)) return false;      if (!addDeferredAttachments(mRT->deferredScreen)) return false; -    GLuint screenFormat = hdr ? GL_RGBA16F : GL_RGBA; +    GLuint screenFormat = hdr ? GL_RGBA16F : GL_RGBA8; -    if (!mRT->screen.allocate(resX, resY, GL_RGBA16F)) return false; +    if (!mRT->screen.allocate(resX, resY, screenFormat)) return false;      mRT->deferredScreen.shareDepthBuffer(mRT->screen); -    if (shadow_detail > 0 || ssao || RenderDepthOfField) +    if (hdr || shadow_detail > 0 || ssao || RenderDepthOfField)      { //only need mRT->deferredLight for shadows OR ssao OR dof          if (!mRT->deferredLight.allocate(resX, resY, screenFormat)) return false;      } @@ -873,13 +889,14 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY)          mRT->deferredLight.release();      } -    allocateShadowBuffer(resX, resY); +    //allocateShadowBuffer(resX, resY); +    allocateShadowBuffer(SHADOWS_RESX, SHADOWS_RESY);      if (!gCubeSnapshot) // hack to not re-allocate various targets for cube snapshots      {          if (RenderUIBuffer)          { -            if (!mUIScreen.allocate(resX, resY, GL_RGBA)) +            if (!mUIScreen.allocate(resX, resY, GL_RGBA8))              {                  return false;              } @@ -887,10 +904,10 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY)          if (RenderFSAAType > 0)          { -            if (!mFXAAMap.allocate(resX, resY, GL_RGBA)) return false; +            if (!mFXAAMap.allocate(resX, resY, GL_RGBA8)) return false;              if (RenderFSAAType == 2)              { -                if (!mSMAABlendBuffer.allocate(resX, resY, GL_RGBA, false)) return false; +                if (!mSMAABlendBuffer.allocate(resX, resY, GL_RGBA8, false)) return false;              }          }          else @@ -911,7 +928,10 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY)              mSceneMap.release();          } -        mPostMap.allocate(resX, resY, screenFormat); +        //mPostMaps[0].allocate(resX, resY, screenFormat); +        //mPostMaps[1].allocate(resX, resY, screenFormat); +        mPostMaps[0].allocate(resX, resY, GL_RGBA); +        mPostMaps[1].allocate(resX, resY, GL_RGBA);          // The water exclusion mask needs its own depth buffer so we can take care of the problem of multiple water planes.          // Should we ever make water not just a plane, it also aids with that as well as the water planes will be rendered into the mask. @@ -924,9 +944,9 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY)          // used to scale down textures          // See LLViwerTextureList::updateImagesCreateTextures and LLImageGL::scaleDown -        mDownResMap.allocate(1024, 1024, GL_RGBA); +        mDownResMap.allocate(1024, 1024, GL_RGBA8); -        mBakeMap.allocate(LLAvatarAppearanceDefines::SCRATCH_TEX_WIDTH, LLAvatarAppearanceDefines::SCRATCH_TEX_HEIGHT, GL_RGBA); +        mBakeMap.allocate(LLAvatarAppearanceDefines::SCRATCH_TEX_WIDTH, LLAvatarAppearanceDefines::SCRATCH_TEX_HEIGHT, GL_RGBA8);      }      //HACK make screenbuffer allocations start failing after 30 seconds      if (gSavedSettings.getBOOL("SimulateFBOFailure")) @@ -936,7 +956,7 @@ bool LLPipeline::allocateScreenBufferInternal(U32 resX, U32 resY)      gGL.getTexUnit(0)->disable(); -    stop_glerror(); +    LOG_GLERROR("LLPipeline::allocateScreenBufferInternal end");      return true;  } @@ -950,15 +970,18 @@ bool LLPipeline::allocateShadowBuffer(U32 resX, U32 resY)      S32 shadow_detail = RenderShadowDetail;      F32 scale = gCubeSnapshot ? 1.0f : llmax(0.5f, RenderShadowResolutionScale); // Don't scale probe shadow maps -    U32 sun_shadow_map_width = BlurHappySize(resX, scale); -    U32 sun_shadow_map_height = BlurHappySize(resY, scale); +    //U32 sun_shadow_map_width = BlurHappySize(resX, scale); +    //U32 sun_shadow_map_height = BlurHappySize(resY, scale); +    U32 sun_shadow_map_width = resX * scale; +    U32 sun_shadow_map_height = resY * scale;      if (shadow_detail > 0)      { //allocate 4 sun shadow maps          for (U32 i = 0; i < 4; i++)          { -            if (!mRT->shadow[i].allocate(sun_shadow_map_width, sun_shadow_map_height, 0, true)) +            if (!mRT->shadow[i].allocate(sun_shadow_map_width, sun_shadow_map_height, 0, true, LLTexUnit::TT_TEXTURE, LLTexUnit::TMG_NONE))              { +                LL_WARNS() << "failed allocating shadow buffer " << i << " w:" << sun_shadow_map_width << " h:" << sun_shadow_map_height << LL_ENDL;                  return false;              }          } @@ -1058,10 +1081,9 @@ void LLPipeline::refreshCachedSettings()      RenderDeferred = true; // DEPRECATED -- gSavedSettings.getBOOL("RenderDeferred");      RenderDeferredSunWash = gSavedSettings.getF32("RenderDeferredSunWash");      RenderFSAAType = gSavedSettings.getU32("RenderFSAAType"); -    RenderResolutionDivisor = gSavedSettings.getU32("RenderResolutionDivisor"); +    RenderResolutionDivisor = gSavedSettings.getF32("RenderResolutionDivisor");      RenderUIBuffer = gSavedSettings.getBOOL("RenderUIBuffer");      RenderShadowDetail = gSavedSettings.getS32("RenderShadowDetail"); -    MPRenderShadowOpti = gSavedSettings.getS32("MPRenderShadowOpti");      RenderShadowSplits = gSavedSettings.getS32("RenderShadowSplits");      RenderDeferredSSAO = gSavedSettings.getBOOL("RenderDeferredSSAO");      RenderShadowResolutionScale = gSavedSettings.getF32("RenderShadowResolutionScale"); @@ -1152,6 +1174,13 @@ void LLPipeline::releaseGLBuffers()  {      assertInitialized(); +    mBloomMap.release(); + +    for (U32 i = 0; i < 2; i++) +    { +        mBloomBlur[i].release(); +    } +      if (mNoiseMap)      {          LLImageGL::deleteTextures(1, &mNoiseMap); @@ -1184,7 +1213,8 @@ void LLPipeline::releaseGLBuffers()      mWaterExclusionMask.release(); -    mPostMap.release(); +    mPostMaps[0].release(); +    mPostMaps[1].release();      mFXAAMap.release(); @@ -1272,23 +1302,28 @@ void LLPipeline::releaseSpotShadowTargets()  void LLPipeline::createGLBuffers()  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE; -    stop_glerror(); +    LOG_GLERROR("LLPipeline::createGLBuffers()");      assertInitialized(); -    stop_glerror(); -      GLuint resX = gViewerWindow->getWorldViewWidthRaw();      GLuint resY = gViewerWindow->getWorldViewHeightRaw();      // allocate screen space glow buffers      const U32 glow_res = llmax(1, llmin(512, 1 << gSavedSettings.getS32("RenderGlowResolutionPow")));      const bool glow_hdr = gSavedSettings.getBOOL("RenderGlowHDR"); -    const U32 glow_color_fmt = glow_hdr ? GL_RGBA16F : GL_RGBA; +    const U32 glow_color_fmt = glow_hdr ? GL_RGBA16F : GL_RGBA8;      for (U32 i = 0; i < 3; i++)      {          mGlow[i].allocate(512, glow_res, glow_color_fmt);      } +    mBloomMap.allocate(resX/2.0, resY/2.0, glow_color_fmt); + +    for (U32 i = 0; i < 2; i++) +    { +        mBloomBlur[i].allocate(resX/2.0, resY/2.0, glow_color_fmt); +    } +      allocateScreenBuffer(resX, resY);      // Do not zero out mRT dimensions here. allocateScreenBuffer() above      // already sets the correct dimensions. Zeroing them caused resizeShadowTexture() @@ -1397,7 +1432,7 @@ void LLPipeline::createGLBuffers()              gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mSMAASampleMap);              LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_RGB, raw_image->getWidth(),                  raw_image->getHeight(), format, GL_UNSIGNED_BYTE, raw_image->getData(), false); -            stop_glerror(); +            LOG_GLERROR("LLPipeline::createGLBuffers after setManualImage");              gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);              gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);          } @@ -1457,11 +1492,7 @@ void LLPipeline::createLUTBuffers()          }          U32 pix_format = GL_R16F; -#if 0 && LL_DARWIN -        // Need to work around limited precision with 10.6.8 and older drivers -        // -        pix_format = GL_R32F; -#endif +          LLImageGL::generateTextures(1, &mLightFunc);          gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mLightFunc);          LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, pix_format, lightResX, lightResY, GL_RED, GL_FLOAT, ls, false); @@ -1474,7 +1505,7 @@ void LLPipeline::createLUTBuffers()      }      mPbrBrdfLut.allocate(512, 512, GL_RG16F); -    mPbrBrdfLut.bindTarget(); +    mPbrBrdfLut.bindTarget("mPbrBrdfLut", 1);      if (gDeferredGenBrdfLutProgram.isComplete())      { @@ -1498,13 +1529,13 @@ void LLPipeline::createLUTBuffers()      mPbrBrdfLut.flush();      mExposureMap.allocate(1, 1, GL_R16F); -    mExposureMap.bindTarget(); +    mExposureMap.bindTarget("mExposureMap", 1);      glClearColor(1, 1, 1, 0);      mExposureMap.clear();      glClearColor(0, 0, 0, 0);      mExposureMap.flush(); -    mLuminanceMap.allocate(256, 256, GL_R16F, false, LLTexUnit::TT_TEXTURE); +    mLuminanceMap.allocate(256, 256, GL_R16F, false, LLTexUnit::TT_TEXTURE, LLTexUnit::TMG_AUTO);      mLastExposure.allocate(1, 1, GL_R16F);  } @@ -1526,7 +1557,7 @@ void LLPipeline::restoreGL()              if (part)              {                  part->restoreGL(); -        } +            }          }      }  } @@ -2062,7 +2093,7 @@ void LLPipeline::updateMovedList(LLDrawable::drawable_vector_t& moved_list)  {      LL_PROFILE_ZONE_SCOPED;      for (LLDrawable::drawable_vector_t::iterator iter = moved_list.begin(); -         iter != moved_list.end(); ) +        iter != moved_list.end(); )      {          LLDrawable::drawable_vector_t::iterator curiter = iter++;          LLDrawable *drawablep = *curiter; @@ -2529,7 +2560,7 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result)          gSky.mVOSkyp->mDrawable->setVisible(camera);          sCull->pushDrawable(gSky.mVOSkyp->mDrawable);          gSky.updateCull(); -        stop_glerror(); +        LOG_GLERROR("LLPipeline::updateCull sky");      }      if (hasRenderType(LLPipeline::RENDER_TYPE_WL_SKY) && @@ -2539,6 +2570,7 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result)      {          gSky.mVOWLSkyp->mDrawable->setVisible(camera);          sCull->pushDrawable(gSky.mVOWLSkyp->mDrawable); +        LOG_GLERROR("LLPipeline::updateCull pushDrawable");      }  } @@ -2691,6 +2723,8 @@ void LLPipeline::doOcclusion(LLCamera& camera)          gGL.setColorMask(true, true);      } + +    LOG_GLERROR("LLPipeline::doOcclusion()");  }  bool LLPipeline::updateDrawableGeom(LLDrawable* drawablep) @@ -2725,7 +2759,7 @@ void LLPipeline::clearRebuildGroups()      mGroupQ1Locked = true;      // Iterate through all drawables on the priority build queue,      for (LLSpatialGroup::sg_vector_t::iterator iter = mGroupQ1.begin(); -         iter != mGroupQ1.end(); ++iter) +        iter != mGroupQ1.end(); ++iter)      {          LLSpatialGroup* group = *iter; @@ -2753,7 +2787,7 @@ void LLPipeline::clearRebuildDrawables()  {      // Clear all drawables on the priority build queue,      for (LLDrawable::drawable_list_t::iterator iter = mBuildQ1.begin(); -         iter != mBuildQ1.end(); ++iter) +        iter != mBuildQ1.end(); ++iter)      {          LLDrawable* drawablep = *iter;          if (drawablep && !drawablep->isDead()) @@ -2765,7 +2799,7 @@ void LLPipeline::clearRebuildDrawables()      //clear all moving bridges      for (LLDrawable::drawable_vector_t::iterator iter = mMovedBridge.begin(); -         iter != mMovedBridge.end(); ++iter) +        iter != mMovedBridge.end(); ++iter)      {          LLDrawable *drawablep = *iter;          drawablep->clearState(LLDrawable::EARLY_MOVE | LLDrawable::MOVE_UNDAMPED | LLDrawable::ON_MOVE_LIST | LLDrawable::ANIMATED_CHILD); @@ -2774,7 +2808,7 @@ void LLPipeline::clearRebuildDrawables()      //clear all moving drawables      for (LLDrawable::drawable_vector_t::iterator iter = mMovedList.begin(); -         iter != mMovedList.end(); ++iter) +        iter != mMovedList.end(); ++iter)      {          LLDrawable *drawablep = *iter;          drawablep->clearState(LLDrawable::EARLY_MOVE | LLDrawable::MOVE_UNDAMPED | LLDrawable::ON_MOVE_LIST | LLDrawable::ANIMATED_CHILD); @@ -2803,7 +2837,7 @@ void LLPipeline::rebuildPriorityGroups()      mGroupQ1Locked = true;      // Iterate through all drawables on the priority build queue,      for (LLSpatialGroup::sg_vector_t::iterator iter = mGroupQ1.begin(); -         iter != mGroupQ1.end(); ++iter) +        iter != mGroupQ1.end(); ++iter)      {          LLSpatialGroup* group = *iter;          group->rebuildGeom(); @@ -2835,7 +2869,7 @@ void LLPipeline::updateGeom(F32 max_dtime)      // Iterate through all drawables on the priority build queue,      for (LLDrawable::drawable_list_t::iterator iter = mBuildQ1.begin(); -         iter != mBuildQ1.end();) +        iter != mBuildQ1.end();)      {          LLDrawable::drawable_list_t::iterator curiter = iter++;          LLDrawable* drawablep = *curiter; @@ -2860,6 +2894,7 @@ void LLPipeline::updateGeom(F32 max_dtime)      }      updateMovedList(mMovedBridge); +    LOG_GLERROR("LLPipeline::updateGeom()");  }  void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera) @@ -2884,8 +2919,8 @@ void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera)                          LLVOAvatar* av = vobj->asAvatar();                          if (av &&                              ((!sImpostorRender && av->isImpostor()) //ignore impostor flag during impostor pass -                             || av->isInMuteList() -                             || (LLVOAvatar::AOA_JELLYDOLL == av->getOverallAppearance() && !av->needsImpostorUpdate()) )) +                            || av->isInMuteList() +                            || (LLVOAvatar::AOA_JELLYDOLL == av->getOverallAppearance() && !av->needsImpostorUpdate()) ))                          {                              return;                          } @@ -3102,13 +3137,13 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)      LL_PROFILE_GPU_ZONE("stateSort");      if (hasAnyRenderType(LLPipeline::RENDER_TYPE_AVATAR, -                      LLPipeline::RENDER_TYPE_CONTROL_AV, -                      LLPipeline::RENDER_TYPE_TERRAIN, -                      LLPipeline::RENDER_TYPE_TREE, -                      LLPipeline::RENDER_TYPE_SKY, -                      LLPipeline::RENDER_TYPE_VOIDWATER, -                      LLPipeline::RENDER_TYPE_WATER, -                      LLPipeline::END_RENDER_TYPES)) +                    LLPipeline::RENDER_TYPE_CONTROL_AV, +                    LLPipeline::RENDER_TYPE_TERRAIN, +                    LLPipeline::RENDER_TYPE_TREE, +                    LLPipeline::RENDER_TYPE_SKY, +                    LLPipeline::RENDER_TYPE_VOIDWATER, +                    LLPipeline::RENDER_TYPE_WATER, +                    LLPipeline::END_RENDER_TYPES))      {          //clear faces from face pools          gPipeline.resetDrawOrders(); @@ -3206,7 +3241,7 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)      {          LL_PROFILE_ZONE_NAMED_CATEGORY_DRAWABLE("stateSort"); // LL_RECORD_BLOCK_TIME(FTM_STATESORT_DRAWABLE);          for (LLCullResult::drawable_iterator iter = sCull->beginVisibleList(); -             iter != sCull->endVisibleList(); ++iter) +            iter != sCull->endVisibleList(); ++iter)          {              LLDrawable *drawablep = *iter;              if (!drawablep->isDead()) @@ -3341,8 +3376,8 @@ void LLPipeline::stateSort(LLDrawable* drawablep, LLCamera& camera)  void forAllDrawables(LLCullResult::sg_iterator begin, -                     LLCullResult::sg_iterator end, -                     void (*func)(LLDrawable*)) +                    LLCullResult::sg_iterator end, +                    void (*func)(LLDrawable*))  {      for (LLCullResult::sg_iterator i = begin; i != end; ++i)      { @@ -3405,7 +3440,7 @@ void renderScriptedTouchBeacons(LLDrawable *drawablep)          if (gPipeline.sRenderBeacons)          {              gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(1.f, 0.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), -                                       LLPipeline::DebugBeaconLineWidth); +                                    LLPipeline::DebugBeaconLineWidth);          }          if (gPipeline.sRenderHighlight) @@ -3435,7 +3470,7 @@ void renderPhysicalBeacons(LLDrawable *drawablep)          if (gPipeline.sRenderBeacons)          {              gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(0.f, 1.f, 0.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), -                                       LLPipeline::DebugBeaconLineWidth); +                                    LLPipeline::DebugBeaconLineWidth);          }          if (gPipeline.sRenderHighlight) @@ -3476,7 +3511,7 @@ void renderMOAPBeacons(LLDrawable *drawablep)          if (gPipeline.sRenderBeacons)          {              gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", LLColor4(1.f, 1.f, 1.f, 0.5f), LLColor4(1.f, 1.f, 1.f, 0.5f), -                                       LLPipeline::DebugBeaconLineWidth); +                                    LLPipeline::DebugBeaconLineWidth);          }          if (gPipeline.sRenderHighlight) @@ -3505,7 +3540,7 @@ void renderParticleBeacons(LLDrawable *drawablep)          {              LLColor4 light_blue(0.5f, 0.5f, 1.f, 0.5f);              gObjectList.addDebugBeacon(vobj->getPositionAgent(), "", light_blue, LLColor4(1.f, 1.f, 1.f, 0.5f), -                                       LLPipeline::DebugBeaconLineWidth); +                                    LLPipeline::DebugBeaconLineWidth);          }          if (gPipeline.sRenderHighlight) @@ -3590,7 +3625,7 @@ void LLPipeline::postSort(LLCamera &camera)          if ((sUseOcclusion && group->isOcclusionState(LLSpatialGroup::OCCLUDED)) ||              (RenderAutoHideSurfaceAreaLimit > 0.f && -             group->mSurfaceArea > RenderAutoHideSurfaceAreaLimit * llmax(group->mObjectBoxSize, 10.f))) +            group->mSurfaceArea > RenderAutoHideSurfaceAreaLimit * llmax(group->mObjectBoxSize, 10.f)))          {              continue;          } @@ -3858,6 +3893,8 @@ void render_hud_elements()      }      gUIProgram.unbind(); + +    LOG_GLERROR("LLPipeline::render_hud_elements()");  }  static inline void bindHighlightProgram(LLGLSLShader& program) @@ -3962,6 +3999,8 @@ void LLPipeline::renderHighlights()              unbindHighlightProgram(gHighlightSpecularProgram);          }      } + +    LOG_GLERROR("LLPipeline::renderHighlights()");  }  //debug use @@ -3971,6 +4010,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera, bool do_occlusion)  {      LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderGeomDeferred");      LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL; //LL_RECORD_BLOCK_TIME(FTM_RENDER_GEOMETRY); +    LL_RECORD_BLOCK_TIME(FTM_RENDER_GEOMETRY);      LL_PROFILE_GPU_ZONE("renderGeomDeferred");      llassert(!sRenderingHUDs); @@ -3999,6 +4039,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera, bool do_occlusion)      bool occlude = LLPipeline::sUseOcclusion > 1 && do_occlusion && !LLGLSLShader::sProfileEnabled;      setupHWLights(); +    LOG_GLERROR("LLPipeline::renderGeomDeferred() setupHWLights");      {          LL_PROFILE_ZONE_NAMED_CATEGORY_DRAWPOOL("deferred pools"); @@ -4087,7 +4128,7 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera, bool do_occlusion)                  }              }              iter1 = iter2; -            stop_glerror(); +            LOG_GLERROR("");          }          gGLLastMatrix = NULL; @@ -4110,6 +4151,7 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;      LL_PROFILE_GPU_ZONE("renderGeomPostDeferred"); +    LL_RECORD_BLOCK_TIME(FTM_RENDER_DEFERRED);      if (gUseWireframe)      { @@ -4226,7 +4268,7 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)              }          }          iter1 = iter2; -        stop_glerror(); +        LOG_GLERROR("after pools");      }      gGLLastMatrix = NULL; @@ -4246,6 +4288,8 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)      {          glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);      } + +    LOG_GLERROR("LLPipeline::renderGeomPostDeferred()");  }  void LLPipeline::renderGeomShadow(LLCamera& camera) @@ -4305,11 +4349,12 @@ void LLPipeline::renderGeomShadow(LLCamera& camera)              }          }          iter1 = iter2; -        stop_glerror(); +        LOG_GLERROR("");      }      gGLLastMatrix = NULL;      gGL.loadMatrix(gGLModelView); +    LOG_GLERROR("LLPipeline::renderGeomShadow()");  } @@ -4340,7 +4385,7 @@ void LLPipeline::renderPhysicsDisplay()      LLGLEnable(GL_POLYGON_OFFSET_LINE);      glPolygonOffset(3.f, 3.f); -    glLineWidth(3.f); +    //glLineWidth(3.f);      LLGLEnable blend(GL_BLEND);      gGL.setSceneBlendType(LLRender::BT_ALPHA); @@ -4382,7 +4427,7 @@ void LLPipeline::renderPhysicsDisplay()              glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);          }      } -    glLineWidth(1.f); +    //glLineWidth(1.f);      gDebugProgram.unbind();  } @@ -4467,7 +4512,7 @@ void LLPipeline::renderDebug()                      if ( pathfindingConsole->isRenderNavMesh() )                      {                          gGL.flush(); -                        glLineWidth(2.0f); +                        //glLineWidth(2.0f);                          LLGLEnable cull(GL_CULL_FACE);                          LLGLDisable blend(GL_BLEND); @@ -4491,7 +4536,7 @@ void LLPipeline::renderDebug()                          gGL.flush();                          glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); -                        glLineWidth(1.0f); +                        //glLineWidth(1.0f);                          gGL.flush();                      }                      //User designated path @@ -4607,11 +4652,11 @@ void LLPipeline::renderDebug()                                      gPathfindingProgram.uniform1f(sTint, 1.f);                                      gPathfindingProgram.uniform1f(sAlphaScale, 1.f); -                                    glLineWidth(gSavedSettings.getF32("PathfindingLineWidth")); +                                    //glLineWidth(gSavedSettings.getF32("PathfindingLineWidth"));                                      LLGLDisable blendOut(GL_BLEND);                                      llPathingLibInstance->renderNavMeshShapesVBO( render_order[i] );                                      gGL.flush(); -                                    glLineWidth(1.f); +                                    //glLineWidth(1.f);                                  }                                  glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); @@ -4634,7 +4679,7 @@ void LLPipeline::renderDebug()                          LLGLEnable blend(GL_BLEND);                          LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_GREATER);                          gGL.flush(); -                        glLineWidth(2.0f); +                        //glLineWidth(2.0f);                          LLGLEnable cull(GL_CULL_FACE);                          gPathfindingProgram.uniform1f(sTint, gSavedSettings.getF32("PathfindingXRayTint")); @@ -4661,7 +4706,7 @@ void LLPipeline::renderDebug()                          gPathfindingProgram.bind();                          gGL.flush(); -                        glLineWidth(1.0f); +                        //glLineWidth(1.0f);                      }                      glPolygonOffset(0.f, 0.f); @@ -4798,12 +4843,11 @@ void LLPipeline::renderDebug()          LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("probe debug display");          bindDeferredShader(gReflectionProbeDisplayProgram, NULL); -        mScreenTriangleVB->setBuffer();          LLGLEnable blend(GL_BLEND);          LLGLDepthTest depth(GL_FALSE); -        mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); +        renderTriangle();          unbindDeferredShader(gReflectionProbeDisplayProgram);      } @@ -5564,8 +5608,8 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)              LLDrawable* drawable = light->drawable;              const LLViewerObject *vobj = light->drawable->getVObj();              if(vobj && vobj->getAvatar() -               && (vobj->getAvatar()->isTooComplex() || vobj->getAvatar()->isInMuteList() || vobj->getAvatar()->isTooSlow()) -               ) +            && (vobj->getAvatar()->isTooComplex() || vobj->getAvatar()->isInMuteList() || vobj->getAvatar()->isTooSlow()) +            )              {                  drawable->clearState(LLDrawable::NEARBY_LIGHT);                  continue; @@ -5626,7 +5670,7 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)          // FIND NEW LIGHTS THAT ARE IN RANGE          light_set_t new_nearby_lights;          for (LLDrawable::ordered_drawable_set_t::iterator iter = mLights.begin(); -             iter != mLights.end(); ++iter) +            iter != mLights.end(); ++iter)          {              LLDrawable* drawable = *iter;              LLVOVolume* light = drawable->getVOVolume(); @@ -5664,7 +5708,7 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)          // INSERT ANY NEW LIGHTS          for (light_set_t::iterator iter = new_nearby_lights.begin(); -             iter != new_nearby_lights.end(); iter++) +            iter != new_nearby_lights.end(); iter++)          {              const Light* light = &(*iter);              if (LLPipeline::sRenderDeferred || mNearbyLights.size() < (U32)MAX_LOCAL_LIGHTS) @@ -5706,7 +5750,7 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)          //mark nearby lights not-removable.          for (light_set_t::iterator iter = mNearbyLights.begin(); -             iter != mNearbyLights.end(); iter++) +            iter != mNearbyLights.end(); iter++)          {              const Light* light = &(*iter);              ((LLViewerOctreeEntryData*) light->drawable)->setVisible(); @@ -5810,7 +5854,7 @@ void LLPipeline::setupHWLights()      if (local_light_count >= 1)      {          for (light_set_t::iterator iter = mNearbyLights.begin(); -             iter != mNearbyLights.end(); ++iter) +            iter != mNearbyLights.end(); ++iter)          {              LLDrawable* drawable = iter->drawable;              LLVOVolume* light = drawable->getVOVolume(); @@ -6654,7 +6698,7 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector4a& start,                          !drawable->getVObj()->isAttachment() ||                          delta.getLength3().getF32() > ATTACHMENT_OVERRIDE_DIST)                      { //avatar overrides if previously hit drawable is not an attachment or -                      //attachment is far enough away from detected intersection +                    //attachment is far enough away from detected intersection                          drawable = hit;                          local_end = position;                      } @@ -6724,12 +6768,12 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector4a& start,  }  LLViewerObject* LLPipeline::lineSegmentIntersectInHUD(const LLVector4a& start, const LLVector4a& end, -                                                      bool pick_transparent, -                                                      S32* face_hit, -                                                      LLVector4a* intersection,         // return the intersection point -                                                      LLVector2* tex_coord,            // return the texture coordinates of the intersection point -                                                      LLVector4a* normal,               // return the surface normal at the intersection point -                                                      LLVector4a* tangent               // return the surface tangent at the intersection point +                                                    bool pick_transparent, +                                                    S32* face_hit, +                                                    LLVector4a* intersection,         // return the intersection point +                                                    LLVector2* tex_coord,            // return the texture coordinates of the intersection point +                                                    LLVector4a* normal,               // return the surface normal at the intersection point +                                                    LLVector4a* tangent               // return the surface tangent at the intersection point      )  {      LLDrawable* drawable = NULL; @@ -6792,6 +6836,8 @@ void LLPipeline::resetVertexBuffers(LLDrawable* drawable)              facep->clearVertexBuffer();          }      } + +    LOG_GLERROR("LLPipeline::resetVertexBuffers()");  }  void LLPipeline::renderObjects(U32 type, bool texture, bool batch_texture, bool rigged) @@ -6811,6 +6857,7 @@ void LLPipeline::renderObjects(U32 type, bool texture, bool batch_texture, bool      gGL.loadMatrix(gGLModelView);      gGLLastMatrix = NULL; +    LOG_GLERROR("LLPipeline::renderObjects()");  }  void LLPipeline::renderGLTFObjects(U32 type, bool texture, bool rigged) @@ -6839,6 +6886,7 @@ void LLPipeline::renderGLTFObjects(U32 type, bool texture, bool rigged)      {          LL::GLTFSceneManager::instance().render(true, true);      } +    LOG_GLERROR("LLPipeline::renderGLTFObjects()");  }  // Currently only used for shadows -Cosmic,2023-04-19 @@ -6919,6 +6967,7 @@ void LLPipeline::renderAlphaObjects(bool rigged)      gGL.loadMatrix(gGLModelView);      gGLLastMatrix = NULL; +    LOG_GLERROR("LLPipeline::renderAlphaObjects()");  }  // Currently only used for shadows -Cosmic,2023-04-19 @@ -6937,6 +6986,7 @@ void LLPipeline::renderMaskedObjects(U32 type, bool texture, bool batch_texture,      }      gGL.loadMatrix(gGLModelView);      gGLLastMatrix = NULL; +    LOG_GLERROR("LLPipeline::renderMaskedObjects()");  }  // Currently only used for shadows -Cosmic,2023-04-19 @@ -6955,6 +7005,7 @@ void LLPipeline::renderFullbrightMaskedObjects(U32 type, bool texture, bool batc      }      gGL.loadMatrix(gGLModelView);      gGLLastMatrix = NULL; +    LOG_GLERROR("LLPipeline::renderFullbrightMaskedObjects()");  }  void apply_cube_face_rotation(U32 face) @@ -7017,11 +7068,12 @@ void LLPipeline::bindScreenToTexture()  } -static LLTrace::BlockTimerStatHandle FTM_RENDER_BLOOM("Bloom"); +static LLTrace::BlockTimerStatHandle FTM_RENDER_BLOOM("Post processing");  void LLPipeline::visualizeBuffers(LLRenderTarget* src, LLRenderTarget* dst, U32 bufferIndex)  { -    dst->bindTarget(); +    dst->bindTarget("visualizeBuffers", 1); +    dst->clear();      gDeferredBufferVisualProgram.bind();      gDeferredBufferVisualProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_BILINEAR, bufferIndex); @@ -7031,8 +7083,7 @@ void LLPipeline::visualizeBuffers(LLRenderTarget* src, LLRenderTarget* dst, U32      else          gDeferredBufferVisualProgram.uniform1f(mipLevel, 8); -    mScreenTriangleVB->setBuffer(); -    mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); +    renderTriangle();      gDeferredBufferVisualProgram.unbind();      dst->flush();  } @@ -7043,7 +7094,8 @@ void LLPipeline::generateLuminance(LLRenderTarget* src, LLRenderTarget* dst)      {          LL_PROFILE_GPU_ZONE("luminance sample"); -        dst->bindTarget(); +        dst->bindTarget("generateLuminance", 0); +        dst->clear();          LLGLDepthTest depth(GL_FALSE, GL_FALSE); @@ -7074,14 +7126,15 @@ void LLPipeline::generateLuminance(LLRenderTarget* src, LLRenderTarget* dst)          static LLStaticHashedString diffuse_luminance_scale_s("diffuse_luminance_scale");          gLuminanceProgram.uniform1f(diffuse_luminance_scale_s, diffuse_luminance_scale); -        mScreenTriangleVB->setBuffer(); -        mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); +        renderTriangle();          dst->flush();          // note -- unbind AFTER the glGenerateMipMap so time in generatemipmap can be profiled under "Luminance"          // also note -- keep an eye on the performance of glGenerateMipmap, might need to replace it with a mip generation shader          gLuminanceProgram.unbind();      } + +    LOG_GLERROR("LLPipeline::generateLuminance()");  }  void LLPipeline::generateExposure(LLRenderTarget* src, LLRenderTarget* dst, bool use_history) { @@ -7092,17 +7145,15 @@ void LLPipeline::generateExposure(LLRenderTarget* src, LLRenderTarget* dst, bool          if (use_history)          {              // copy last frame's exposure into mLastExposure -            mLastExposure.bindTarget(); +            mLastExposure.bindTarget("mLastExposure", 1);              gCopyProgram.bind();              gGL.getTexUnit(0)->bind(dst); - -            mScreenTriangleVB->setBuffer(); -            mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); - +            renderTriangle();              mLastExposure.flush();          } -        dst->bindTarget(); +        dst->bindTarget("generateExposure", 1); +        //dst->clear();          LLGLDepthTest depth(GL_FALSE, GL_FALSE); @@ -7185,23 +7236,24 @@ void LLPipeline::generateExposure(LLRenderTarget* src, LLRenderTarget* dst, bool          shader->uniform4f(dynamic_exposure_params, dynamic_exposure_coefficient, exp_min, exp_max, dynamic_exposure_speed_error);          shader->uniform4f(dynamic_exposure_params2, sky->getHDROffset(should_auto_adjust()), exp_min, exp_max, dynamic_exposure_speed_target); -        mScreenTriangleVB->setBuffer(); -        mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); +        renderTriangle();          if (use_history)          { -            gGL.getTexUnit(channel)->unbind(mLastExposure.getUsage()); +            //gGL.getTexUnit(channel)->unbind(mLastExposure.getUsage());          }          shader->unbind();          dst->flush();      } + +    LOG_GLERROR("LLPipeline::generateExposure()");  }  extern LLPointer<LLImageGL> gEXRImage;  void LLPipeline::tonemap(LLRenderTarget* src, LLRenderTarget* dst)  { -    dst->bindTarget(); +    dst->bindTarget("tonemap", 1);      // gamma correct lighting      {          LL_PROFILE_GPU_ZONE("tonemap"); @@ -7221,7 +7273,7 @@ void LLPipeline::tonemap(LLRenderTarget* src, LLRenderTarget* dst)          shader.bind(); -        S32 channel = 0; +        //S32 channel = 0;          shader.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT); @@ -7243,18 +7295,19 @@ void LLPipeline::tonemap(LLRenderTarget* src, LLRenderTarget* dst)          shader.uniform1i(tonemap_type, tonemap_type_setting);          shader.uniform1f(tonemap_mix, psky->getTonemapMix(should_auto_adjust())); -        mScreenTriangleVB->setBuffer(); -        mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); +        renderTriangle(); -        gGL.getTexUnit(channel)->unbind(src->getUsage()); +        //gGL.getTexUnit(channel)->unbind(src->getUsage());          shader.unbind();      }      dst->flush(); +    LOG_GLERROR("LLPipeline::tonemap()");  }  void LLPipeline::gammaCorrect(LLRenderTarget* src, LLRenderTarget* dst)  { -    dst->bindTarget(); +    dst->bindTarget("gammaCorrect", 1); +    dst->clear();      // gamma correct lighting      {          LL_PROFILE_GPU_ZONE("gamma correct"); @@ -7272,12 +7325,12 @@ void LLPipeline::gammaCorrect(LLRenderTarget* src, LLRenderTarget* dst)          shader.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT);          shader.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)src->getWidth(), (GLfloat)src->getHeight()); -        mScreenTriangleVB->setBuffer(); -        mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); +        renderTriangle();          shader.unbind();      }      dst->flush(); +    LOG_GLERROR("LLPipeline::gammaCorrect()");  }  void LLPipeline::copyScreenSpaceReflections(LLRenderTarget* src, LLRenderTarget* dst) @@ -7290,7 +7343,7 @@ void LLPipeline::copyScreenSpaceReflections(LLRenderTarget* src, LLRenderTarget*          LLRenderTarget& depth_src = mRT->deferredScreen; -        dst->bindTarget(); +        dst->bindTarget("copyScreenSpaceReflections", 1);          dst->clear();          gCopyDepthProgram.bind(); @@ -7300,11 +7353,11 @@ void LLPipeline::copyScreenSpaceReflections(LLRenderTarget* src, LLRenderTarget*          gGL.getTexUnit(diff_map)->bind(src);          gGL.getTexUnit(depth_map)->bind(&depth_src, true); -        mScreenTriangleVB->setBuffer(); -        mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); +        renderTriangle();          dst->flush();      } +    LOG_GLERROR("LLPipeline::copyScreenSpaceReflection()");  }  void LLPipeline::generateGlow(LLRenderTarget* src) @@ -7312,7 +7365,9 @@ void LLPipeline::generateGlow(LLRenderTarget* src)      if (sRenderGlow)      {          LL_PROFILE_GPU_ZONE("glow"); -        mGlow[2].bindTarget(); +        LL_RECORD_BLOCK_TIME(FTM_RENDER_GLOW); + +        mGlow[2].bindTarget("mGlow[2]", 1);          mGlow[2].clear();          gGlowExtractProgram.bind(); @@ -7338,8 +7393,8 @@ void LLPipeline::generateGlow(LLRenderTarget* src)                  gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);              }              gGlowExtractProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, -                                          (GLfloat)mGlow[2].getWidth(), -                                          (GLfloat)mGlow[2].getHeight()); +                                        (GLfloat)mGlow[2].getWidth(), +                                        (GLfloat)mGlow[2].getHeight());          }          { @@ -7352,8 +7407,8 @@ void LLPipeline::generateGlow(LLRenderTarget* src)              gGL.color4f(1, 1, 1, 1);              gPipeline.enableLightsFullbright(); -            mScreenTriangleVB->setBuffer(); -            mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); +            renderTriangle(); +            gGlowExtractProgram.unbindTexture(LLShaderMgr::GLOW_NOISE_MAP);              mGlow[2].flush();          } @@ -7379,7 +7434,7 @@ void LLPipeline::generateGlow(LLRenderTarget* src)          for (S32 i = 0; i < kernel; i++)          { -            mGlow[i % 2].bindTarget(); +            mGlow[i % 2].bindTarget("mGlow[i % 2]", 1);              mGlow[i % 2].clear();              if (i == 0) @@ -7400,8 +7455,7 @@ void LLPipeline::generateGlow(LLRenderTarget* src)                  gGlowProgram.uniform2f(LLShaderMgr::GLOW_DELTA, 0, delta);              } -            mScreenTriangleVB->setBuffer(); -            mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); +            renderTriangle();              mGlow[i % 2].flush();          } @@ -7411,25 +7465,26 @@ void LLPipeline::generateGlow(LLRenderTarget* src)      }      else // !sRenderGlow, skip the glow ping-pong and just clear the result target      { -        mGlow[1].bindTarget(); +        mGlow[1].bindTarget("mGlow[1]", 1);          mGlow[1].clear();          mGlow[1].flush();      } +    LOG_GLERROR("LLPipeline::generateGlow()");  } -void LLPipeline::applyCAS(LLRenderTarget* src, LLRenderTarget* dst) +bool LLPipeline::applyCAS(LLRenderTarget* src, LLRenderTarget* dst)  {      static LLCachedControl<F32> cas_sharpness(gSavedSettings, "RenderCASSharpness", 0.4f);      if (cas_sharpness == 0.0f || !gCASProgram.isComplete())      { -        gPipeline.copyRenderTarget(src, dst); -        return; +        return false;      }      LLGLSLShader* sharpen_shader = &gCASProgram;      // Bind setup: -    dst->bindTarget(); +    dst->bindTarget("applyCAS", 1); +    dst->clear();      sharpen_shader->bind(); @@ -7451,100 +7506,105 @@ void LLPipeline::applyCAS(LLRenderTarget* src, LLRenderTarget* dst)          sharpen_shader->uniform2f(out_screen_res, (AF1)dst->getWidth(), (AF1)dst->getHeight());      } -    sharpen_shader->bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT); - -    // Draw -    gPipeline.mScreenTriangleVB->setBuffer(); -    gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); - +    S32 channel = sharpen_shader->bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT); +    renderTriangle(); +    sharpen_shader->unbindTexture(channel);      sharpen_shader->unbind();      dst->flush(); + +    return true;  } -void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst) +bool LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst)  { -    { -        llassert(!gCubeSnapshot); -        bool multisample = RenderFSAAType == 1 && gFXAAProgram[0].isComplete() && mFXAAMap.isComplete(); +    llassert(!gCubeSnapshot); +    bool multisample = RenderFSAAType == 1 && gFXAAProgram[0].isComplete() && mFXAAMap.isComplete(); -        // Present everything. -        if (multisample) -        { -            LL_PROFILE_GPU_ZONE("aa"); -            S32 width = dst->getWidth(); -            S32 height = dst->getHeight(); +    if(!multisample) return false; -            // bake out texture2D with RGBL for FXAA shader -            mFXAAMap.bindTarget(); -            mFXAAMap.clear(GL_COLOR_BUFFER_BIT); +    LL_PROFILE_GPU_ZONE("aa"); +    S32 width = dst->getWidth(); +    S32 height = dst->getHeight(); -            LLGLSLShader* shader = &gGlowCombineFXAAProgram; -            shader->bind(); +    //LL_WARNS() << "dst width=" << width << LL_ENDL; -            S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage()); -            if (channel > -1) -            { -                src->bindTexture(0, channel, LLTexUnit::TFO_BILINEAR); -            } +    // bake out texture2D with RGBL for FXAA shader +    mFXAAMap.bindTarget("applyFXAA", 1); +    mFXAAMap.clear(GL_COLOR_BUFFER_BIT); -            { -                LLGLDepthTest depth_test(GL_TRUE, GL_TRUE, GL_ALWAYS); -                mScreenTriangleVB->setBuffer(); -                mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); -            } +    LLGLSLShader* shader = &gGlowCombineFXAAProgram; +    shader->bind(); -            shader->disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage()); -            shader->unbind(); +    S32 channel = shader->enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage()); +    if (channel > -1) +    { +        src->bindTexture(0, channel, LLTexUnit::TFO_BILINEAR); +    } -            mFXAAMap.flush(); +    { +        LLGLDepthTest depth_test(GL_TRUE, GL_TRUE, GL_ALWAYS); +        renderTriangle(); +    } -            dst->bindTarget(); +    shader->disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, src->getUsage()); +    shader->unbind(); -            static LLCachedControl<U32> aa_quality(gSavedSettings, "RenderFSAASamples", 0U); -            U32 fsaa_quality = std::clamp(aa_quality(), 0U, 3U); +    mFXAAMap.flush(); -            shader = &gFXAAProgram[fsaa_quality]; -            shader->bind(); +    dst->bindTarget("applyFXAA", 1); +    dst->clear(); -            channel = shader->enableTexture(LLShaderMgr::DIFFUSE_MAP, mFXAAMap.getUsage()); -            if (channel > -1) -            { -                mFXAAMap.bindTexture(0, channel, LLTexUnit::TFO_BILINEAR); -            } +    static LLCachedControl<U32> aa_quality(gSavedSettings, "RenderFSAASamples", 0U); +    U32 fsaa_quality = std::clamp(aa_quality(), 0U, 3U); -            gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft; -            gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom; -            gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth(); -            gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight(); +    shader = &gFXAAProgram[fsaa_quality]; +    shader->bind(); -            glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]); +    channel = shader->enableTexture(LLShaderMgr::DIFFUSE_MAP, mFXAAMap.getUsage()); +    if (channel > -1) +    { +        mFXAAMap.bindTexture(0, channel, LLTexUnit::TFO_BILINEAR); +    } -            F32 scale_x = (F32)width / mFXAAMap.getWidth(); -            F32 scale_y = (F32)height / mFXAAMap.getHeight(); -            shader->uniform2f(LLShaderMgr::FXAA_TC_SCALE, scale_x, scale_y); -            shader->uniform2f(LLShaderMgr::FXAA_RCP_SCREEN_RES, 1.f / width * scale_x, 1.f / height * scale_y); -            shader->uniform4f(LLShaderMgr::FXAA_RCP_FRAME_OPT, -0.5f / width * scale_x, -0.5f / height * scale_y, -                0.5f / width * scale_x, 0.5f / height * scale_y); -            shader->uniform4f(LLShaderMgr::FXAA_RCP_FRAME_OPT2, -2.f / width * scale_x, -2.f / height * scale_y, -                2.f / width * scale_x, 2.f / height * scale_y); +    /* +    gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft; +    gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom; +    gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth(); +    gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight(); -            { -                LLGLDepthTest depth_test(GL_TRUE, GL_TRUE, GL_ALWAYS); -                S32 depth_channel = shader->getTextureChannel(LLShaderMgr::DEFERRED_DEPTH); -                gGL.getTexUnit(depth_channel)->bind(&mRT->deferredScreen, true); +    glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]); +*/ -                mScreenTriangleVB->setBuffer(); -                mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); -            } +    F32 scale_x = (F32)width / mFXAAMap.getWidth(); +    F32 scale_y = (F32)height / mFXAAMap.getHeight(); -            shader->unbind(); -            dst->flush(); -        } -        else { -            copyRenderTarget(src, dst); -        } +    //LL_WARNS() << "vp width=" << gGLViewport[2] << " scale=" << scale_x << LL_ENDL; + +    shader->uniform2f(LLShaderMgr::FXAA_TC_SCALE, scale_x, scale_y); +    shader->uniform2f(LLShaderMgr::FXAA_RCP_SCREEN_RES, 1.f / width * scale_x, 1.f / height * scale_y); +    shader->uniform4f(LLShaderMgr::FXAA_RCP_FRAME_OPT, -0.5f / width * scale_x, -0.5f / height * scale_y, +        0.5f / width * scale_x, 0.5f / height * scale_y); +    shader->uniform4f(LLShaderMgr::FXAA_RCP_FRAME_OPT2, -2.f / width * scale_x, -2.f / height * scale_y, +        2.f / width * scale_x, 2.f / height * scale_y); + +    { +        LLGLDepthTest depth_test(GL_TRUE, GL_TRUE, GL_ALWAYS); +        S32 depth_channel = shader->getTextureChannel(LLShaderMgr::DEFERRED_DEPTH); +        gGL.getTexUnit(depth_channel)->bind(&mRT->deferredScreen, true); + +        renderTriangle(); +    } + +    if (channel > -1) +    { +        shader->unbindTexture(channel);      } + +    shader->unbind(); +    dst->flush(); + +    return true;  }  void LLPipeline::generateSMAABuffers(LLRenderTarget* src) @@ -7576,7 +7636,7 @@ void LLPipeline::generateSMAABuffers(LLRenderTarget* src)              LLRenderTarget& dest = mFXAAMap;              LLGLSLShader& edge_shader = gSMAAEdgeDetectProgram[fsaa_quality]; -            dest.bindTarget(); +            dest.bindTarget("generateSMAABuffers", 1);              dest.clear(GL_COLOR_BUFFER_BIT);              edge_shader.bind(); @@ -7587,14 +7647,17 @@ void LLPipeline::generateSMAABuffers(LLRenderTarget* src)              {                  if (!use_sample)                  { -                    src->bindTexture(0, channel, LLTexUnit::TFO_POINT); -                    gGL.getTexUnit(channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); +                    //src->bindTexture(0, channel, LLTexUnit::TFO_POINT); +                    //gGL.getTexUnit(channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); +                    src->bindTexture(0, channel, LLTexUnit::TFO_BILINEAR);                  }                  else                  {                      gGL.getTexUnit(channel)->bindManual(LLTexUnit::TT_TEXTURE, mSMAASampleMap); -                    gGL.getTexUnit(channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); +                    //gGL.getTexUnit(channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); +                    gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);                  } +                gGL.getTexUnit(channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);              }              //if (use_stencil) @@ -7603,13 +7666,13 @@ void LLPipeline::generateSMAABuffers(LLRenderTarget* src)              //    glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);              //    glStencilMask(0xFF);              //} -            mScreenTriangleVB->setBuffer(); -            mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + +            renderTriangle();              edge_shader.unbind();              dest.flush(); -            gGL.getTexUnit(channel)->unbindFast(LLTexUnit::TT_TEXTURE); +            //gGL.getTexUnit(channel)->unbindFast(LLTexUnit::TT_TEXTURE);          }          { @@ -7619,7 +7682,7 @@ void LLPipeline::generateSMAABuffers(LLRenderTarget* src)              LLRenderTarget& dest = mSMAABlendBuffer;              LLGLSLShader& blend_weights_shader = gSMAABlendWeightsProgram[fsaa_quality]; -            dest.bindTarget(); +            dest.bindTarget("mSMAABlendBuffer", 1);              dest.clear(GL_COLOR_BUFFER_BIT);              blend_weights_shader.bind(); @@ -7651,22 +7714,25 @@ void LLPipeline::generateSMAABuffers(LLRenderTarget* src)              //    glStencilFunc(GL_EQUAL, 1, 0xFF);              //    glStencilMask(0x00);              //} -            mScreenTriangleVB->setBuffer(); -            mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); + +            renderTriangle();              //if (use_stencil)              //{              //    glStencilFunc(GL_ALWAYS, 0, 0xFF);              //} +              blend_weights_shader.unbind();              dest.flush(); +              gGL.getTexUnit(edge_tex_channel)->unbindFast(LLTexUnit::TT_TEXTURE);              gGL.getTexUnit(area_tex_channel)->unbindFast(LLTexUnit::TT_TEXTURE);              gGL.getTexUnit(search_tex_channel)->unbindFast(LLTexUnit::TT_TEXTURE);          }      } +    LOG_GLERROR("LLPipeline::generateSMAABuffers()");  } -void LLPipeline::applySMAA(LLRenderTarget* src, LLRenderTarget* dst) +bool LLPipeline::applySMAA(LLRenderTarget* src, LLRenderTarget* dst)  {      llassert(!gCubeSnapshot); @@ -7677,79 +7743,75 @@ void LLPipeline::applySMAA(LLRenderTarget* src, LLRenderTarget* dst)          multisample = gSMAAEdgeDetectProgram[0].isComplete() && mFXAAMap.isComplete() && mSMAABlendBuffer.isComplete();      } -    // Present everything. -    if (multisample) -    { -        LL_PROFILE_GPU_ZONE("aa"); -        static LLCachedControl<U32> aa_quality(gSavedSettings, "RenderFSAASamples", 0U); -        U32 fsaa_quality = std::clamp(aa_quality(), 0U, 3U); +    if(!multisample) return false; -        S32 width = src->getWidth(); -        S32 height = src->getHeight(); +    LL_PROFILE_GPU_ZONE("aa"); -        float rt_metrics[] = { 1.f / width, 1.f / height, (float)width, (float)height }; +    generateSMAABuffers(src); -        LLGLDepthTest    depth(GL_FALSE, GL_FALSE); -        static LLCachedControl<bool> use_sample(gSavedSettings, "RenderSMAAUseSample", false); -        //static LLCachedControl<bool> use_stencil(gSavedSettings, "RenderSMAAUseStencil", true); +    static LLCachedControl<U32> aa_quality(gSavedSettings, "RenderFSAASamples", 0U); +    U32 fsaa_quality = std::clamp(aa_quality(), 0U, 3U); -        { -            //LLGLDisable stencil(GL_STENCIL_TEST); +    S32 width = src->getWidth(); +    S32 height = src->getHeight(); -            // Bind setup: -            LLRenderTarget* bound_target = dst; -            LLGLSLShader& blend_shader = gSMAANeighborhoodBlendProgram[fsaa_quality]; +    float rt_metrics[] = { 1.f / width, 1.f / height, (float)width, (float)height }; -            bound_target->bindTarget(); -            bound_target->clear(GL_COLOR_BUFFER_BIT); +    LLGLDepthTest    depth(GL_FALSE, GL_FALSE); -            blend_shader.bind(); -            blend_shader.uniform4fv(sSmaaRTMetrics, 1, rt_metrics); +    static LLCachedControl<bool> use_sample(gSavedSettings, "RenderSMAAUseSample", false); +    //static LLCachedControl<bool> use_stencil(gSavedSettings, "RenderSMAAUseStencil", true); -            S32 diffuse_channel = blend_shader.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE); -            if(diffuse_channel > -1) -            { -                src->bindTexture(0, diffuse_channel, LLTexUnit::TFO_BILINEAR); -                gGL.getTexUnit(diffuse_channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); -            } +    { +        //LLGLDisable stencil(GL_STENCIL_TEST); -            S32 blend_channel = blend_shader.enableTexture(LLShaderMgr::SMAA_BLEND_TEX); -            if (blend_channel > -1) -            { -                mSMAABlendBuffer.bindTexture(0, blend_channel, LLTexUnit::TFO_BILINEAR); -            } +        // Bind setup: +        LLRenderTarget* bound_target = dst; +        LLGLSLShader& blend_shader = gSMAANeighborhoodBlendProgram[fsaa_quality]; + +        bound_target->bindTarget("applySMAA", 1); +        bound_target->clear(GL_COLOR_BUFFER_BIT); -            mScreenTriangleVB->setBuffer(); -            mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); +        blend_shader.bind(); +        blend_shader.uniform4fv(sSmaaRTMetrics, 1, rt_metrics); -            bound_target->flush(); -            blend_shader.unbind(); -            gGL.getTexUnit(diffuse_channel)->unbindFast(LLTexUnit::TT_TEXTURE); -            gGL.getTexUnit(blend_channel)->unbindFast(LLTexUnit::TT_TEXTURE); +        S32 diffuse_channel = blend_shader.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE); +        if(diffuse_channel > -1) +        { +            src->bindTexture(0, diffuse_channel, LLTexUnit::TFO_BILINEAR); +            gGL.getTexUnit(diffuse_channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);          } + +        S32 blend_channel = blend_shader.enableTexture(LLShaderMgr::SMAA_BLEND_TEX); +        if (blend_channel > -1) +        { +            mSMAABlendBuffer.bindTexture(0, blend_channel, LLTexUnit::TFO_BILINEAR); +        } + +        renderTriangle(); + +        bound_target->flush(); +        blend_shader.unbind(); +        gGL.getTexUnit(diffuse_channel)->unbindFast(LLTexUnit::TT_TEXTURE); +        gGL.getTexUnit(blend_channel)->unbindFast(LLTexUnit::TT_TEXTURE);      } -    else -    { -        copyRenderTarget(src, dst); -    } + +    LOG_GLERROR("LLPipeline::applySMAA()"); +    return true;  }  void LLPipeline::copyRenderTarget(LLRenderTarget* src, LLRenderTarget* dst)  { -      LL_PROFILE_GPU_ZONE("copyRenderTarget"); -    dst->bindTarget(); - +    dst->bindTarget("copyRenderTarget", 1); +    dst->clear(GL_COLOR_BUFFER_BIT);      gDeferredPostNoDoFProgram.bind();      gDeferredPostNoDoFProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src); -    gDeferredPostNoDoFProgram.bindTexture(LLShaderMgr::DEFERRED_DEPTH, &mRT->deferredScreen, true); +    //gDeferredPostNoDoFProgram.bindTexture(LLShaderMgr::DEFERRED_DEPTH, &mRT->deferredScreen, true); -    { -        mScreenTriangleVB->setBuffer(); -        mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); -    } +    renderTriangle();      gDeferredPostNoDoFProgram.unbind(); @@ -7760,214 +7822,323 @@ void LLPipeline::combineGlow(LLRenderTarget* src, LLRenderTarget* dst)  {      // Go ahead and do our glow combine here in our destination.  We blit this later into the front buffer. -    dst->bindTarget(); +    dst->bindTarget("combineGlow", 1);      { -          gGlowCombineProgram.bind();          gGlowCombineProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src);          gGlowCombineProgram.bindTexture(LLShaderMgr::DEFERRED_EMISSIVE, &mGlow[1]); -        mScreenTriangleVB->setBuffer(); -        mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); +        renderTriangle();      }      dst->flush(); +    LOG_GLERROR("LLPipeline::combineGlow()");  } -void LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst) +bool LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst)  { -    { -        bool dof_enabled = +    bool dof_enabled =              (RenderDepthOfFieldInEditMode || !LLToolMgr::getInstance()->inBuildMode()) &&              RenderDepthOfField &&              !gCubeSnapshot; -        gViewerWindow->setup3DViewport(); +    if(!dof_enabled) return false; -        if (dof_enabled) -        { -            LL_PROFILE_GPU_ZONE("dof"); -            LLGLDisable blend(GL_BLEND); +    gViewerWindow->setup3DViewport(); -            // depth of field focal plane calculations -            static F32 current_distance = 16.f; -            static F32 start_distance = 16.f; -            static F32 transition_time = 1.f; +    if (dof_enabled) +    { +        LL_PROFILE_GPU_ZONE("dof"); +        LLGLDisable blend(GL_BLEND); -            LLVector3 focus_point; +        // depth of field focal plane calculations +        static F32 current_distance = 16.f; +        static F32 start_distance = 16.f; +        static F32 transition_time = 1.f; -            LLViewerObject* obj = LLViewerMediaFocus::getInstance()->getFocusedObject(); -            if (obj && obj->mDrawable && obj->isSelected()) -            { // focus on selected media object -                S32 face_idx = LLViewerMediaFocus::getInstance()->getFocusedFace(); -                if (obj && obj->mDrawable) -                { -                    LLFace* face = obj->mDrawable->getFace(face_idx); -                    if (face) -                    { -                        focus_point = face->getPositionAgent(); -                    } -                } -            } +        LLVector3 focus_point; -            if (focus_point.isExactlyZero()) +        LLViewerObject* obj = LLViewerMediaFocus::getInstance()->getFocusedObject(); +        if (obj && obj->mDrawable && obj->isSelected()) +        { // focus on selected media object +            S32 face_idx = LLViewerMediaFocus::getInstance()->getFocusedFace(); +            if (obj && obj->mDrawable)              { -                if (LLViewerJoystick::getInstance()->getOverrideCamera()) -                { // focus on point under cursor -                    focus_point.set(gDebugRaycastIntersection.getF32ptr()); -                } -                else if (gAgentCamera.cameraMouselook()) -                { // focus on point under mouselook crosshairs -                    LLVector4a result; -                    result.clear(); - -                    gViewerWindow->cursorIntersect(-1, -1, 512.f, nullptr, -1, false, false, true, true, nullptr, nullptr, nullptr, &result); - -                    focus_point.set(result.getF32ptr()); -                } -                else +                LLFace* face = obj->mDrawable->getFace(face_idx); +                if (face)                  { -                    // focus on alt-zoom target -                    LLViewerRegion* region = gAgent.getRegion(); -                    if (region) -                    { -                        focus_point = LLVector3(gAgentCamera.getFocusGlobal() - region->getOriginGlobal()); -                    } +                    focus_point = face->getPositionAgent();                  }              } +        } -            LLVector3 eye = LLViewerCamera::getInstance()->getOrigin(); -            F32 target_distance = 16.f; -            if (!focus_point.isExactlyZero()) -            { -                target_distance = LLViewerCamera::getInstance()->getAtAxis() * (focus_point - eye); +        if (focus_point.isExactlyZero()) +        { +            if (LLViewerJoystick::getInstance()->getOverrideCamera()) +            { // focus on point under cursor +                focus_point.set(gDebugRaycastIntersection.getF32ptr());              } +            else if (gAgentCamera.cameraMouselook()) +            { // focus on point under mouselook crosshairs +                LLVector4a result; +                result.clear(); -            if (transition_time >= 1.f && fabsf(current_distance - target_distance) / current_distance > 0.01f) -            { // large shift happened, interpolate smoothly to new target distance -                transition_time = 0.f; -                start_distance = current_distance; -            } -            else if (transition_time < 1.f) -            { // currently in a transition, continue interpolating -                transition_time += 1.f / CameraFocusTransitionTime * gFrameIntervalSeconds.value(); -                transition_time = llmin(transition_time, 1.f); +                gViewerWindow->cursorIntersect(-1, -1, 512.f, nullptr, -1, false, false, true, true, nullptr, nullptr, nullptr, &result); -                F32 t = cosf(transition_time * F_PI + F_PI) * 0.5f + 0.5f; -                current_distance = start_distance + (target_distance - start_distance) * t; +                focus_point.set(result.getF32ptr());              }              else -            { // small or no change, just snap to target distance -                current_distance = target_distance; +            { +                // focus on alt-zoom target +                LLViewerRegion* region = gAgent.getRegion(); +                if (region) +                { +                    focus_point = LLVector3(gAgentCamera.getFocusGlobal() - region->getOriginGlobal()); +                }              } +        } + +        LLVector3 eye = LLViewerCamera::getInstance()->getOrigin(); +        F32 target_distance = 16.f; +        if (!focus_point.isExactlyZero()) +        { +            target_distance = LLViewerCamera::getInstance()->getAtAxis() * (focus_point - eye); +        } + +        if (transition_time >= 1.f && fabsf(current_distance - target_distance) / current_distance > 0.01f) +        { // large shift happened, interpolate smoothly to new target distance +            transition_time = 0.f; +            start_distance = current_distance; +        } +        else if (transition_time < 1.f) +        { // currently in a transition, continue interpolating +            transition_time += 1.f / CameraFocusTransitionTime * gFrameIntervalSeconds.value(); +            transition_time = llmin(transition_time, 1.f); -            // convert to mm -            F32 subject_distance = current_distance * 1000.f; -            F32 fnumber = CameraFNumber; -            F32 default_focal_length = CameraFocalLength; +            F32 t = cosf(transition_time * F_PI + F_PI) * 0.5f + 0.5f; +            current_distance = start_distance + (target_distance - start_distance) * t; +        } +        else +        { // small or no change, just snap to target distance +            current_distance = target_distance; +        } -            F32 fov = LLViewerCamera::getInstance()->getView(); +        // convert to mm +        F32 subject_distance = current_distance * 1000.f; +        F32 fnumber = CameraFNumber; +        F32 default_focal_length = CameraFocalLength; -            const F32 default_fov = CameraFieldOfView * F_PI / 180.f; +        F32 fov = LLViewerCamera::getInstance()->getView(); -            // F32 aspect_ratio = (F32) mRT->screen.getWidth()/(F32)mRT->screen.getHeight(); +        const F32 default_fov = CameraFieldOfView * F_PI / 180.f; -            F32 dv = 2.f * default_focal_length * tanf(default_fov / 2.f); +        // F32 aspect_ratio = (F32) mRT->screen.getWidth()/(F32)mRT->screen.getHeight(); -            F32 focal_length = dv / (2 * tanf(fov / 2.f)); +        F32 dv = 2.f * default_focal_length * tanf(default_fov / 2.f); -            // F32 tan_pixel_angle = tanf(LLDrawable::sCurPixelAngle); +        F32 focal_length = dv / (2 * tanf(fov / 2.f)); -            // from wikipedia -- c = |s2-s1|/s2 * f^2/(N(S1-f)) -            // where     N = fnumber -            //           s2 = dot distance -            //           s1 = subject distance -            //           f = focal length -            // +        // F32 tan_pixel_angle = tanf(LLDrawable::sCurPixelAngle); -            F32 blur_constant = focal_length * focal_length / (fnumber * (subject_distance - focal_length)); -            blur_constant /= 1000.f; // convert to meters for shader -            F32 magnification = focal_length / (subject_distance - focal_length); +        // from wikipedia -- c = |s2-s1|/s2 * f^2/(N(S1-f)) +        // where     N = fnumber +        //           s2 = dot distance +        //           s1 = subject distance +        //           f = focal length +        // -            { // build diffuse+bloom+CoF -                mRT->deferredLight.bindTarget(); +        F32 blur_constant = focal_length * focal_length / (fnumber * (subject_distance - focal_length)); +        blur_constant /= 1000.f; // convert to meters for shader +        F32 magnification = focal_length / (subject_distance - focal_length); -                gDeferredCoFProgram.bind(); +        { // build diffuse+bloom+CoF +            mRT->deferredLight.bindTarget("renderDOF", 1); -                gDeferredCoFProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, LLTexUnit::TFO_POINT); -                gDeferredCoFProgram.bindTexture(LLShaderMgr::DEFERRED_DEPTH, &mRT->deferredScreen, true); +            gDeferredCoFProgram.bind(); -                gDeferredCoFProgram.uniform1f(LLShaderMgr::DEFERRED_DEPTH_CUTOFF, RenderEdgeDepthCutoff); -                gDeferredCoFProgram.uniform1f(LLShaderMgr::DEFERRED_NORM_CUTOFF, RenderEdgeNormCutoff); -                gDeferredCoFProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)dst->getWidth(), (GLfloat)dst->getHeight()); -                gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_FOCAL_DISTANCE, -subject_distance / 1000.f); -                gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_BLUR_CONSTANT, blur_constant); -                gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_TAN_PIXEL_ANGLE, tanf(1.f / LLDrawable::sCurPixelAngle)); -                gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_MAGNIFICATION, magnification); -                gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF); -                gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale); +            gDeferredCoFProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, LLTexUnit::TFO_POINT); +            gDeferredCoFProgram.bindTexture(LLShaderMgr::DEFERRED_DEPTH, &mRT->deferredScreen, true); -                mScreenTriangleVB->setBuffer(); -                mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); -                gDeferredCoFProgram.unbind(); -                mRT->deferredLight.flush(); -            } +            gDeferredCoFProgram.uniform1f(LLShaderMgr::DEFERRED_DEPTH_CUTOFF, RenderEdgeDepthCutoff); +            gDeferredCoFProgram.uniform1f(LLShaderMgr::DEFERRED_NORM_CUTOFF, RenderEdgeNormCutoff); +            gDeferredCoFProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)dst->getWidth(), (GLfloat)dst->getHeight()); +            gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_FOCAL_DISTANCE, -subject_distance / 1000.f); +            gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_BLUR_CONSTANT, blur_constant); +            gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_TAN_PIXEL_ANGLE, tanf(1.f / LLDrawable::sCurPixelAngle)); +            gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_MAGNIFICATION, magnification); +            gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF); +            gDeferredCoFProgram.uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale); -            U32 dof_width = (U32)(mRT->screen.getWidth() * CameraDoFResScale); -            U32 dof_height = (U32)(mRT->screen.getHeight() * CameraDoFResScale); +            renderTriangle(); -            { // perform DoF sampling at half-res (preserve alpha channel) -                src->bindTarget(); -                glViewport(0, 0, dof_width, dof_height); +            gDeferredCoFProgram.unbind(); +            mRT->deferredLight.flush(); +        } -                gGL.setColorMask(true, false); +        U32 dof_width = (U32)(mRT->screen.getWidth() * CameraDoFResScale); +        U32 dof_height = (U32)(mRT->screen.getHeight() * CameraDoFResScale); -                gDeferredPostProgram.bind(); -                gDeferredPostProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, &mRT->deferredLight, LLTexUnit::TFO_POINT); +        { // perform DoF sampling at half-res (preserve alpha channel) +            src->bindTarget("DoF sampling", 1); +            glViewport(0, 0, dof_width, dof_height); -                gDeferredPostProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)dst->getWidth(), (GLfloat)dst->getHeight()); -                gDeferredPostProgram.uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF); -                gDeferredPostProgram.uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale); +            gGL.setColorMask(true, false); -                mScreenTriangleVB->setBuffer(); -                mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); +            gDeferredPostProgram.bind(); +            gDeferredPostProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, &mRT->deferredLight, LLTexUnit::TFO_POINT); -                gDeferredPostProgram.unbind(); +            gDeferredPostProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)dst->getWidth(), (GLfloat)dst->getHeight()); +            gDeferredPostProgram.uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF); +            gDeferredPostProgram.uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale); -                src->flush(); -                gGL.setColorMask(true, true); -            } +            renderTriangle(); -            { // combine result based on alpha +            gDeferredPostProgram.unbind(); -                dst->bindTarget(); -                glViewport(0, 0, dst->getWidth(), dst->getHeight()); +            src->flush(); +            gGL.setColorMask(true, true); +        } -                gDeferredDoFCombineProgram.bind(); -                gDeferredDoFCombineProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, LLTexUnit::TFO_POINT); -                gDeferredDoFCombineProgram.bindTexture(LLShaderMgr::DEFERRED_LIGHT, &mRT->deferredLight, LLTexUnit::TFO_POINT); +        { // combine result based on alpha -                gDeferredDoFCombineProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)dst->getWidth(), (GLfloat)dst->getHeight()); -                gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF); -                gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale); -                gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_WIDTH, (dof_width - 1) / (F32)src->getWidth()); -                gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_HEIGHT, (dof_height - 1) / (F32)src->getHeight()); +            dst->bindTarget("DoF combine", 1); +            glViewport(0, 0, dst->getWidth(), dst->getHeight()); -                mScreenTriangleVB->setBuffer(); -                mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); +            gDeferredDoFCombineProgram.bind(); +            gDeferredDoFCombineProgram.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, LLTexUnit::TFO_POINT); +            gDeferredDoFCombineProgram.bindTexture(LLShaderMgr::DEFERRED_LIGHT, &mRT->deferredLight, LLTexUnit::TFO_POINT); -                gDeferredDoFCombineProgram.unbind(); +            gDeferredDoFCombineProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)dst->getWidth(), (GLfloat)dst->getHeight()); +            gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_MAX_COF, CameraMaxCoF); +            gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_RES_SCALE, CameraDoFResScale); +            gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_WIDTH, (dof_width - 1) / (F32)src->getWidth()); +            gDeferredDoFCombineProgram.uniform1f(LLShaderMgr::DOF_HEIGHT, (dof_height - 1) / (F32)src->getHeight()); -                dst->flush(); -            } -        } -        else -        { -            copyRenderTarget(src, dst); + +            renderTriangle(); + +            gDeferredDoFCombineProgram.unbind(); +            dst->flush();          }      } + +    return true; +} + +bool LLPipeline::renderBloom(LLRenderTarget* src, LLRenderTarget* dst) +{ +    static LLCachedControl<U32> mp_render_bloom(gSavedSettings, "MPRenderBloom", 0); + +    if(mp_render_bloom < 1) return false; + +    static LLCachedControl<F32> mp_bloom_extract_brightness(gSavedSettings, "MPBloomExtractBrightness", 0.10); +    static LLCachedControl<F32> mp_bloom_radius(gSavedSettings, "MPBloomBlurRadius", 1.5); +    static LLCachedControl<F32> mp_bloom_radius_add(gSavedSettings, "MPBloomBlurRadiusAdd", 0); +    static LLCachedControl<F32> mp_bloom_strength(gSavedSettings, "MPBloomStrength", 1.0); +    static LLCachedControl<F32> mp_bloom_metal(gSavedSettings, "MPBloomExtractMetal", 0.2); +    static LLCachedControl<F32> mp_bloom_nonmetal(gSavedSettings, "MPBloomExtractNonMetal", 0.2); + +    LLGLDepthTest depth(GL_FALSE, GL_FALSE); +    LLGLDisable blend(GL_BLEND); + +    mBloomMap.bindTarget("mBloomMap", 1); + +    glClearColor(0, 0, 0, 0); +    mBloomMap.clear(); + +    gBloomExtractProgram.bind(); +    gBloomExtractProgram.bindTexture(LLShaderMgr::DIFFUSE_MAP, src); +    gBloomExtractProgram.bindTexture(LLShaderMgr::BLOOM_EXTRACT_ORM, &mRT->deferredScreen, false, LLTexUnit::TFO_POINT, 1); +    gBloomExtractProgram.bindTexture(LLShaderMgr::BLOOM_EXTRACT_EMISSIVE, &mGlow[1], false, LLTexUnit::TFO_POINT, 0); +    gBloomExtractProgram.bindTexture(LLShaderMgr::BLOOM_EXTRACT_EMISSIVE2, &mRT->deferredScreen, false, LLTexUnit::TFO_POINT, 3); + +    gBloomExtractProgram.uniform1f(LLShaderMgr::BLOOM_EXTRACT_BRIGHTNESS, 1.0 - mp_bloom_extract_brightness); +    gBloomExtractProgram.uniform1f(LLShaderMgr::BLOOM_EXTRACT_METAL, mp_bloom_metal); +    gBloomExtractProgram.uniform1f(LLShaderMgr::BLOOM_EXTRACT_NONMETAL, mp_bloom_nonmetal); + +    renderTriangle(); + +    gBloomExtractProgram.unbindTexture(LLShaderMgr::DIFFUSE_MAP); +    gBloomExtractProgram.unbindTexture(LLShaderMgr::BLOOM_EXTRACT_ORM); +    gBloomExtractProgram.unbindTexture(LLShaderMgr::BLOOM_EXTRACT_EMISSIVE); +    gBloomExtractProgram.unbindTexture(LLShaderMgr::BLOOM_EXTRACT_EMISSIVE2); + +    gBloomExtractProgram.unbind(); +    mBloomMap.flush(); + + +    // ping pong blur + +    S16 horizontal = 1, first_iteration = true; +    unsigned int amount = mp_render_bloom; +    if(amount > 10) amount = 10; + +    F32 radius = mp_bloom_radius; + +    gBloomBlurProgram.bind(); + + +    // Iteration 0 + +    gBloomBlurProgram.uniform1f(LLShaderMgr::BLOOM_BLUR_RADIUS, radius); + +    mBloomBlur[0].bindTarget("", 1); +    //mBloomBlur[0].clear(); +    gBloomBlurProgram.uniform1i( LLShaderMgr::BLOOM_BLURH, 0); +    gBloomBlurProgram.bindTexture( LLShaderMgr::BLOOM_EMAP, &mBloomMap); +    renderTriangle(); +    mBloomBlur[0].flush(); + +    mBloomBlur[1].bindTarget("", 1); +    gBloomBlurProgram.uniform1i( LLShaderMgr::BLOOM_BLURH, 1); +    gBloomBlurProgram.bindTexture( LLShaderMgr::BLOOM_EMAP, &mBloomBlur[0]); +    renderTriangle(); +    mBloomBlur[1].flush(); + + +    // additional iterations + +    for (unsigned int i = 1; i < amount; i++) +    { +        radius += mp_bloom_radius_add; +        gBloomBlurProgram.uniform1f(LLShaderMgr::BLOOM_BLUR_RADIUS, radius); + +        mBloomBlur[0].bindTarget("", 1); +        gBloomBlurProgram.uniform1i( LLShaderMgr::BLOOM_BLURH, 0); +        gBloomBlurProgram.bindTexture( LLShaderMgr::BLOOM_EMAP, &mBloomBlur[1]); +        renderTriangle(); +        mBloomBlur[0].flush(); + +        mBloomBlur[1].bindTarget("", 1); +        gBloomBlurProgram.uniform1i( LLShaderMgr::BLOOM_BLURH, 1); +        gBloomBlurProgram.bindTexture( LLShaderMgr::BLOOM_EMAP, &mBloomBlur[0]); +        renderTriangle(); +        mBloomBlur[1].flush(); +    } + +    gBloomBlurProgram.unbindTexture(LLShaderMgr::BLOOM_EMAP); +    gBloomBlurProgram.unbind(); + + +    // combine + +    dst->bindTarget("bloom combine", 1); +    //dst->clear(); + +    gBloomCombineProgram.bind(); + +    gBloomCombineProgram.bindTexture(LLShaderMgr::DIFFUSE_MAP, src); +    gBloomCombineProgram.bindTexture(LLShaderMgr::BLOOM_BMAP, &mBloomBlur[1]); +    gBloomCombineProgram.uniform1f(LLShaderMgr::BLOOM_STRENGTH, mp_bloom_strength); + +    renderTriangle(); + +    gBloomCombineProgram.unbind(); +    dst->flush(); + +    return true;  }  void LLPipeline::renderFinalize() @@ -7986,7 +8157,11 @@ void LLPipeline::renderFinalize()      LLGLDisable blend(GL_BLEND);      LLGLDisable cull(GL_CULL_FACE); -    enableLightsFullbright(); +    gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft; +    gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom; +    gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth(); +    gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight(); +    glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);      gGL.setColorMask(true, true);      glClearColor(0, 0, 0, 0); @@ -7994,6 +8169,10 @@ void LLPipeline::renderFinalize()      static LLCachedControl<bool> has_hdr(gSavedSettings, "RenderHDREnabled", true);      bool hdr = gGLManager.mGLVersion > 4.05f && has_hdr(); +    U16 activeRT = 0; + +    LLRenderTarget* postHDRBuffer = &mRT->screen; +      if (hdr)      {          copyScreenSpaceReflections(&mRT->screen, &mSceneMap); @@ -8002,38 +8181,49 @@ void LLPipeline::renderFinalize()          generateExposure(&mLuminanceMap, &mExposureMap); -        tonemap(&mRT->screen, &mPostMap); +        tonemap(&mRT->screen, &mRT->deferredLight); + +        postHDRBuffer = &mRT->deferredLight; -        applyCAS(&mPostMap, &mRT->screen);      } -    generateSMAABuffers(&mRT->screen); +    gammaCorrect(postHDRBuffer, &mPostMaps[0]); -    gammaCorrect(&mRT->screen, &mPostMap); +    generateGlow(&mPostMaps[0]);      LLVertexBuffer::unbind(); -    applySMAA(&mPostMap, &mRT->screen); +    if(renderBloom(&mPostMaps[activeRT], &mPostMaps[1 - activeRT])) +    { +        activeRT = 1 - activeRT; +    } -    generateGlow(&mRT->screen); +    combineGlow(&mPostMaps[activeRT], &mPostMaps[1 - activeRT]); +    activeRT = 1 - activeRT; -    combineGlow(&mRT->screen, &mPostMap); +    if(applyFXAA(&mPostMaps[activeRT], &mPostMaps[1 - activeRT])) +    { +        activeRT = 1 - activeRT; +    } -    gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft; -    gGLViewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom; -    gGLViewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth(); -    gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight(); -    glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]); +    if(applyCAS(&mPostMaps[activeRT], &mPostMaps[1 - activeRT])) +    { +        activeRT = 1 - activeRT; +    } + +    if(applySMAA(&mPostMaps[activeRT], &mPostMaps[1 - activeRT])) +    { +        activeRT = 1 - activeRT; +    } -    renderDoF(&mPostMap, &mRT->screen); -    LLRenderTarget* finalBuffer = &mRT->screen; -    if (RenderFSAAType == 1) +    if(renderDoF(&mPostMaps[activeRT], &mPostMaps[1 - activeRT]))      { -        applyFXAA(&mRT->screen, &mPostMap); -        finalBuffer = &mPostMap; +        activeRT = 1 - activeRT;      } +    LLRenderTarget* finalBuffer = &mPostMaps[activeRT]; +      if (RenderBufferVisualization > -1)      {          switch (RenderBufferVisualization) @@ -8063,6 +8253,27 @@ void LLPipeline::renderFinalize()              }              break;          } +        case 7: +            visualizeBuffers(&mBloomMap, finalBuffer, 0); +            break; +        case 8: +            visualizeBuffers(&mBloomBlur[1], finalBuffer, 0); +            break; +        case 9: +            visualizeBuffers(&mPostMaps[activeRT], finalBuffer, 0); +            break; +        case 10: +            visualizeBuffers(&mGlow[0], finalBuffer, 0); +            break; +        case 11: +            visualizeBuffers(&mGlow[1], finalBuffer, 0); +            break; +        case 12: +            visualizeBuffers(&mGlow[2], finalBuffer, 0); +            break; +        case 13: +            visualizeBuffers(&mSceneMap, finalBuffer, 0); +            break;          default:              break;          } @@ -8080,8 +8291,7 @@ void LLPipeline::renderFinalize()      {          LLGLDepthTest depth_test(GL_TRUE, GL_TRUE, GL_ALWAYS); -        mScreenTriangleVB->setBuffer(); -        mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); +        renderTriangle();      }      gDeferredPostNoDoFNoiseProgram.unbind(); @@ -8096,8 +8306,8 @@ void LLPipeline::renderFinalize()      /*if (LLRenderTarget::sUseFBO && !gCubeSnapshot)      { // copy depth buffer from mRT->screen to framebuffer          LLRenderTarget::copyContentsToFramebuffer(mRT->screen, 0, 0, mRT->screen.getWidth(), mRT->screen.getHeight(), 0, 0, -                                                  mRT->screen.getWidth(), mRT->screen.getHeight(), -                                                  GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST); +                                                mRT->screen.getWidth(), mRT->screen.getHeight(), +                                                GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);      }*/      LLVertexBuffer::unbind(); @@ -8106,6 +8316,7 @@ void LLPipeline::renderFinalize()      // flush calls made to "addTrianglesDrawn" so far to stats machinery      recordTrianglesDrawn(); +    LOG_GLERROR("LLPipeline::renderFinalize()");  }  void LLPipeline::bindLightFunc(LLGLSLShader& shader) @@ -8125,6 +8336,8 @@ void LLPipeline::bindLightFunc(LLGLSLShader& shader)  void LLPipeline::bindShadowMaps(LLGLSLShader& shader)  { +    LOG_GLERROR("bindShadowMaps() 1"); +      for (U32 i = 0; i < 4; i++)      {          LLRenderTarget* shadow_target = getSunShadowTarget(i); @@ -8138,6 +8351,8 @@ void LLPipeline::bindShadowMaps(LLGLSLShader& shader)          }      } +    LOG_GLERROR("bindShadowMaps() 2"); +      for (U32 i = 4; i < 6; i++)      {          S32 channel = shader.enableTexture(LLShaderMgr::DEFERRED_SHADOW0 + i); @@ -8246,7 +8461,7 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_      bindLightFunc(shader); -    stop_glerror(); +    LOG_GLERROR("bindDeferredShader()");      light_target = light_target ? light_target : deferred_light_target;      channel = shader.enableTexture(LLShaderMgr::DEFERRED_LIGHT, light_target->getUsage()); @@ -8262,11 +8477,11 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_          }      } -    stop_glerror(); +    LOG_GLERROR("bindDeferredShader() 2");      bindShadowMaps(shader); -    stop_glerror(); +    LOG_GLERROR("bindDeferredShader() 3");      F32 mat[16*6];      for (U32 i = 0; i < 16; i++) @@ -8281,7 +8496,7 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_      shader.uniformMatrix4fv(LLShaderMgr::DEFERRED_SHADOW_MATRIX, 6, false, mat); -    stop_glerror(); +    LOG_GLERROR("bindDeferredShader() 4");      if (!LLPipeline::sReflectionProbesEnabled)      { @@ -8298,8 +8513,8 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_              F32* m = gGLModelView;              F32 mat[] = { m[0], m[1], m[2], -                          m[4], m[5], m[6], -                          m[8], m[9], m[10] }; +                        m[4], m[5], m[6], +                        m[8], m[9], m[10] };              shader.uniformMatrix3fv(LLShaderMgr::DEFERRED_ENV_MAT, 1, true, mat);          } @@ -8435,6 +8650,8 @@ void LLPipeline::renderDeferredLighting()          return;      } +    LOG_GLERROR("renderDeferredLighting begin"); +      llassert(!sRenderingHUDs);      F32 light_scale = 1.f; @@ -8479,7 +8696,7 @@ void LLPipeline::renderDeferredLighting()          if ((RenderDeferredSSAO && !gCubeSnapshot) || RenderShadowDetail > 0)          {              LL_PROFILE_GPU_ZONE("sun program"); -            deferred_light_target->bindTarget(); +            deferred_light_target->bindTarget("sun_shader", 1);              {  // paint shadow/SSAO light map (direct lighting lightmap)                  LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("renderDeferredLighting - sun shadow"); @@ -8491,8 +8708,8 @@ void LLPipeline::renderDeferredLighting()                  glClearColor(0, 0, 0, 0);                  sun_shader.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, -                                              (GLfloat)deferred_light_target->getWidth(), -                                              (GLfloat)deferred_light_target->getHeight()); +                                            (GLfloat)deferred_light_target->getWidth(), +                                            (GLfloat)deferred_light_target->getHeight());                  {                      LLGLDisable   blend(GL_BLEND); @@ -8511,7 +8728,7 @@ void LLPipeline::renderDeferredLighting()              LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("renderDeferredLighting - soften shadow");              LL_PROFILE_GPU_ZONE("soften shadow");              // blur lightmap -            screen_target->bindTarget(); +            screen_target->bindTarget("SSAO", 1);              glClearColor(1, 1, 1, 1);              screen_target->clear(GL_COLOR_BUFFER_BIT);              glClearColor(0, 0, 0, 0); @@ -8544,8 +8761,7 @@ void LLPipeline::renderDeferredLighting()              {                  LLGLDisable   blend(GL_BLEND);                  LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS); -                mScreenTriangleVB->setBuffer(); -                mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); +                renderTriangle();              }              screen_target->flush(); @@ -8553,27 +8769,27 @@ void LLPipeline::renderDeferredLighting()              bindDeferredShader(gDeferredBlurLightProgram, screen_target); -            deferred_light_target->bindTarget(); +            deferred_light_target->bindTarget("blur light", 1);              gDeferredBlurLightProgram.uniform2f(sDelta, 0.f, 1.f);              {                  LLGLDisable   blend(GL_BLEND);                  LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS); -                mScreenTriangleVB->setBuffer(); -                mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); +                renderTriangle();              }              deferred_light_target->flush();              unbindDeferredShader(gDeferredBlurLightProgram);          } -        screen_target->bindTarget(); +        screen_target->bindTarget("renderDeferredLighting screen_target", 1);          // clear color buffer here - zeroing alpha (glow) is important or it will accumulate against sky          glClearColor(0, 0, 0, 0);          screen_target->clear(GL_COLOR_BUFFER_BIT);          if (RenderDeferredAtmospheric) -        {  // apply sunlight contribution +        { +            // apply sunlight contribution              LLGLSLShader &soften_shader = gDeferredSoftenProgram;              LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("renderDeferredLighting - atmospherics"); @@ -8600,8 +8816,7 @@ void LLPipeline::renderDeferredLighting()                  LLGLDisable   blend(GL_BLEND);                  // full screen blit -                mScreenTriangleVB->setBuffer(); -                mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); +                renderTriangle();              }              unbindDeferredShader(gDeferredSoftenProgram); @@ -8817,8 +9032,7 @@ void LLPipeline::renderDeferredLighting()                          gDeferredMultiLightProgram[idx].uniform1i(LLShaderMgr::CLASSIC_MODE, (psky->canAutoAdjust()) ? 1 : 0);                          far_z = 0.f;                          count = 0; -                        mScreenTriangleVB->setBuffer(); -                        mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); +                        renderTriangle();                          unbindDeferredShader(gDeferredMultiLightProgram[idx]);                      }                  } @@ -8854,6 +9068,9 @@ void LLPipeline::renderDeferredLighting()                      gDeferredMultiSpotLightProgram.uniform1i(LLShaderMgr::CLASSIC_MODE, (psky->canAutoAdjust()) ? 1 : 0);                      mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); +                    /* +                    gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); +                    */                  }                  gDeferredMultiSpotLightProgram.disableTexture(LLShaderMgr::DEFERRED_PROJECTION); @@ -8869,35 +9086,35 @@ void LLPipeline::renderDeferredLighting()          pushRenderTypeMask();          andRenderTypeMask(LLPipeline::RENDER_TYPE_ALPHA, -                          LLPipeline::RENDER_TYPE_ALPHA_PRE_WATER, -                          LLPipeline::RENDER_TYPE_ALPHA_POST_WATER, -                          LLPipeline::RENDER_TYPE_FULLBRIGHT, -                          LLPipeline::RENDER_TYPE_VOLUME, -                          LLPipeline::RENDER_TYPE_GLOW, -                          LLPipeline::RENDER_TYPE_BUMP, -                          LLPipeline::RENDER_TYPE_GLTF_PBR, -                          LLPipeline::RENDER_TYPE_PASS_SIMPLE, -                          LLPipeline::RENDER_TYPE_PASS_ALPHA, -                          LLPipeline::RENDER_TYPE_PASS_ALPHA_MASK, -                          LLPipeline::RENDER_TYPE_PASS_BUMP, -                          LLPipeline::RENDER_TYPE_PASS_POST_BUMP, -                          LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT, -                          LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT_ALPHA_MASK, -                          LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT_SHINY, -                          LLPipeline::RENDER_TYPE_PASS_GLOW, -                          LLPipeline::RENDER_TYPE_PASS_GLTF_GLOW, -                          LLPipeline::RENDER_TYPE_PASS_GRASS, -                          LLPipeline::RENDER_TYPE_PASS_SHINY, -                          LLPipeline::RENDER_TYPE_PASS_INVISIBLE, -                          LLPipeline::RENDER_TYPE_PASS_INVISI_SHINY, -                          LLPipeline::RENDER_TYPE_AVATAR, -                          LLPipeline::RENDER_TYPE_CONTROL_AV, -                          LLPipeline::RENDER_TYPE_ALPHA_MASK, -                          LLPipeline::RENDER_TYPE_FULLBRIGHT_ALPHA_MASK, -                          LLPipeline::RENDER_TYPE_TERRAIN, -                          LLPipeline::RENDER_TYPE_WATER, -                          LLPipeline::RENDER_TYPE_WATEREXCLUSION, -                          END_RENDER_TYPES); +                        LLPipeline::RENDER_TYPE_ALPHA_PRE_WATER, +                        LLPipeline::RENDER_TYPE_ALPHA_POST_WATER, +                        LLPipeline::RENDER_TYPE_FULLBRIGHT, +                        LLPipeline::RENDER_TYPE_VOLUME, +                        LLPipeline::RENDER_TYPE_GLOW, +                        LLPipeline::RENDER_TYPE_BUMP, +                        LLPipeline::RENDER_TYPE_GLTF_PBR, +                        LLPipeline::RENDER_TYPE_PASS_SIMPLE, +                        LLPipeline::RENDER_TYPE_PASS_ALPHA, +                        LLPipeline::RENDER_TYPE_PASS_ALPHA_MASK, +                        LLPipeline::RENDER_TYPE_PASS_BUMP, +                        LLPipeline::RENDER_TYPE_PASS_POST_BUMP, +                        LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT, +                        LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT_ALPHA_MASK, +                        LLPipeline::RENDER_TYPE_PASS_FULLBRIGHT_SHINY, +                        LLPipeline::RENDER_TYPE_PASS_GLOW, +                        LLPipeline::RENDER_TYPE_PASS_GLTF_GLOW, +                        LLPipeline::RENDER_TYPE_PASS_GRASS, +                        LLPipeline::RENDER_TYPE_PASS_SHINY, +                        LLPipeline::RENDER_TYPE_PASS_INVISIBLE, +                        LLPipeline::RENDER_TYPE_PASS_INVISI_SHINY, +                        LLPipeline::RENDER_TYPE_AVATAR, +                        LLPipeline::RENDER_TYPE_CONTROL_AV, +                        LLPipeline::RENDER_TYPE_ALPHA_MASK, +                        LLPipeline::RENDER_TYPE_FULLBRIGHT_ALPHA_MASK, +                        LLPipeline::RENDER_TYPE_TERRAIN, +                        LLPipeline::RENDER_TYPE_WATER, +                        LLPipeline::RENDER_TYPE_WATEREXCLUSION, +                        END_RENDER_TYPES);          renderGeomPostDeferred(*LLViewerCamera::getInstance());          popRenderTypeMask(); @@ -8916,11 +9133,14 @@ void LLPipeline::renderDeferredLighting()          }      }      gGL.setColorMask(true, true); + +    LOG_GLERROR("renderDeferredLighting end");  }  void LLPipeline::doAtmospherics()  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE; +    LOG_GLERROR("doAtmospherics begin");      if (sImpostorRender)      { // do not attempt atmospherics on impostors @@ -8938,7 +9158,7 @@ void LLPipeline::doAtmospherics()              LLRenderTarget& dst = gPipeline.mWaterDis;              mRT->screen.flush(); -            dst.bindTarget(); +            dst.bindTarget("doAtmospherics dst", 1);              gCopyDepthProgram.bind();              S32 diff_map = gCopyDepthProgram.getTextureChannel(LLShaderMgr::DIFFUSE_MAP); @@ -8948,11 +9168,10 @@ void LLPipeline::doAtmospherics()              gGL.getTexUnit(depth_map)->bind(&depth_src, true);              gGL.setColorMask(false, false); -            gPipeline.mScreenTriangleVB->setBuffer(); -            gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); +            renderTriangle();              dst.flush(); -            mRT->screen.bindTarget(); +            mRT->screen.bindTarget("atmospherics", 1);          }          LLGLEnable blend(GL_BLEND); @@ -8974,13 +9193,14 @@ void LLPipeline::doAtmospherics()          LLGLDepthTest depth(GL_FALSE);          // full screen blit -        mScreenTriangleVB->setBuffer(); -        mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); +        renderTriangle();          unbindDeferredShader(haze_shader);          gGL.setSceneBlendType(LLRender::BT_ALPHA);      } + +    LOG_GLERROR("doAtmospherics end");  }  void LLPipeline::doWaterHaze() @@ -9002,7 +9222,8 @@ void LLPipeline::doWaterHaze()              LLRenderTarget& dst = gPipeline.mWaterDis;              mRT->screen.flush(); -            dst.bindTarget(); + +            dst.bindTarget("water haze copy depth", 1);              gCopyDepthProgram.bind();              S32 diff_map = gCopyDepthProgram.getTextureChannel(LLShaderMgr::DIFFUSE_MAP); @@ -9012,11 +9233,10 @@ void LLPipeline::doWaterHaze()              gGL.getTexUnit(depth_map)->bind(&depth_src, true);              gGL.setColorMask(false, false); -            gPipeline.mScreenTriangleVB->setBuffer(); -            gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); +            renderTriangle();              dst.flush(); -            mRT->screen.bindTarget(); +            mRT->screen.bindTarget("water haze", 1);          }          LLGLEnable blend(GL_BLEND); @@ -9042,8 +9262,7 @@ void LLPipeline::doWaterHaze()              LLGLDepthTest depth(GL_FALSE);              // full screen blit -            mScreenTriangleVB->setBuffer(); -            mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); +            renderTriangle();          }          else          { @@ -9062,14 +9281,15 @@ void LLPipeline::doWaterHaze()          unbindDeferredShader(haze_shader); -          gGL.setSceneBlendType(LLRender::BT_ALPHA);      } + +    LOG_GLERROR("after doWaterHaze()");  }  void LLPipeline::doWaterExclusionMask()  { -    mWaterExclusionMask.bindTarget(); +    mWaterExclusionMask.bindTarget("", 1);      glClearColor(1, 1, 1, 1);      mWaterExclusionMask.clear();      mWaterExclusionPool->render(); @@ -9222,6 +9442,7 @@ void LLPipeline::setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep)          }      } +    LOG_GLERROR("setupSpotLight() end");  }  void LLPipeline::unbindDeferredShader(LLGLSLShader &shader) @@ -9229,7 +9450,7 @@ void LLPipeline::unbindDeferredShader(LLGLSLShader &shader)      LLRenderTarget* deferred_target       = &mRT->deferredScreen;      LLRenderTarget* deferred_light_target = &mRT->deferredLight; -    stop_glerror(); +    LOG_GLERROR("unbindDeferredShader() begin");      shader.disableTexture(LLShaderMgr::NORMAL_MAP, deferred_target->getUsage());      shader.disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, deferred_target->getUsage());      shader.disableTexture(LLShaderMgr::DEFERRED_SPECULAR, deferred_target->getUsage()); @@ -9278,6 +9499,8 @@ void LLPipeline::unbindDeferredShader(LLGLSLShader &shader)      gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);      gGL.getTexUnit(0)->activate();      shader.unbind(); + +    LOG_GLERROR("unbindDeferredShader() end");  }  void LLPipeline::setEnvMat(LLGLSLShader& shader) @@ -9333,33 +9556,38 @@ void LLPipeline::bindReflectionProbes(LLGLSLShader& shader)      }      // reflection probe shaders generally sample the scene map as well for SSR -    channel = shader.enableTexture(LLShaderMgr::SCENE_MAP); -    if (channel > -1) -    { -        gGL.getTexUnit(channel)->bind(&mSceneMap); -    } +    //if(RenderScreenSpaceReflections) +    //{ +        //LL_WARNS() << "binding SSR to reflection maps" << LL_ENDL; -    shader.uniform1f(LLShaderMgr::DEFERRED_SSR_ITR_COUNT, (GLfloat)RenderScreenSpaceReflectionIterations); -    shader.uniform1f(LLShaderMgr::DEFERRED_SSR_DIST_BIAS, RenderScreenSpaceReflectionDistanceBias); -    shader.uniform1f(LLShaderMgr::DEFERRED_SSR_RAY_STEP, RenderScreenSpaceReflectionRayStep); -    shader.uniform1f(LLShaderMgr::DEFERRED_SSR_GLOSSY_SAMPLES, (GLfloat)RenderScreenSpaceReflectionGlossySamples); -    shader.uniform1f(LLShaderMgr::DEFERRED_SSR_REJECT_BIAS, RenderScreenSpaceReflectionDepthRejectBias); -    mPoissonOffset++; +        channel = shader.enableTexture(LLShaderMgr::SCENE_MAP); +        if (channel > -1) +        { +            gGL.getTexUnit(channel)->bind(&mSceneMap); +        } -    if (mPoissonOffset > 128 - RenderScreenSpaceReflectionGlossySamples) -        mPoissonOffset = 0; +        shader.uniform1f(LLShaderMgr::DEFERRED_SSR_ITR_COUNT, (GLfloat)RenderScreenSpaceReflectionIterations); +        shader.uniform1f(LLShaderMgr::DEFERRED_SSR_DIST_BIAS, RenderScreenSpaceReflectionDistanceBias); +        shader.uniform1f(LLShaderMgr::DEFERRED_SSR_RAY_STEP, RenderScreenSpaceReflectionRayStep); +        shader.uniform1f(LLShaderMgr::DEFERRED_SSR_GLOSSY_SAMPLES, (GLfloat)RenderScreenSpaceReflectionGlossySamples); +        shader.uniform1f(LLShaderMgr::DEFERRED_SSR_REJECT_BIAS, RenderScreenSpaceReflectionDepthRejectBias); +        mPoissonOffset++; -    shader.uniform1f(LLShaderMgr::DEFERRED_SSR_NOISE_SINE, (GLfloat)mPoissonOffset); -    shader.uniform1f(LLShaderMgr::DEFERRED_SSR_ADAPTIVE_STEP_MULT, RenderScreenSpaceReflectionAdaptiveStepMultiplier); +        if (mPoissonOffset > 128 - RenderScreenSpaceReflectionGlossySamples) +            mPoissonOffset = 0; -    channel = shader.enableTexture(LLShaderMgr::SCENE_DEPTH); -    if (channel > -1) -    { -        gGL.getTexUnit(channel)->bind(&mSceneMap, true); -    } +        shader.uniform1f(LLShaderMgr::DEFERRED_SSR_NOISE_SINE, (GLfloat)mPoissonOffset); +        shader.uniform1f(LLShaderMgr::DEFERRED_SSR_ADAPTIVE_STEP_MULT, RenderScreenSpaceReflectionAdaptiveStepMultiplier); +        channel = shader.enableTexture(LLShaderMgr::SCENE_DEPTH); +        if (channel > -1) +        { +            gGL.getTexUnit(channel)->bind(&mSceneMap, true); +        } +    //} +    LOG_GLERROR("bindReflectionProbes() end");  }  void LLPipeline::unbindReflectionProbes(LLGLSLShader& shader) @@ -9373,6 +9601,8 @@ void LLPipeline::unbindReflectionProbes(LLGLSLShader& shader)              gGL.getTexUnit(channel)->enable(LLTexUnit::TT_TEXTURE);          }      } + +    LOG_GLERROR("unbindReflectionProbes() end");  } @@ -9431,11 +9661,13 @@ static LLTrace::BlockTimerStatHandle FTM_SHADOW_ALPHA_MASKED("Alpha Masked");  static LLTrace::BlockTimerStatHandle FTM_SHADOW_ALPHA_BLEND("Alpha Blend");  static LLTrace::BlockTimerStatHandle FTM_SHADOW_ALPHA_TREE("Alpha Tree");  static LLTrace::BlockTimerStatHandle FTM_SHADOW_ALPHA_GRASS("Alpha Grass"); +static LLTrace::BlockTimerStatHandle FTM_SHADOW_ALPHA_MATERIAL("Alpha Material");  static LLTrace::BlockTimerStatHandle FTM_SHADOW_FULLBRIGHT_ALPHA_MASKED("Fullbright Alpha Masked");  void LLPipeline::renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCamera& shadow_cam, LLCullResult& result, bool depth_clamp)  { -    LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE; //LL_RECORD_BLOCK_TIME(FTM_SHADOW_RENDER); +    LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE; +    LL_RECORD_BLOCK_TIME(FTM_SHADOW_RENDER);      LL_PROFILE_GPU_ZONE("renderShadow");      LLPipeline::sShadowRender = true; @@ -9512,8 +9744,10 @@ void LLPipeline::renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCa              gGL.setColorMask(false, false);          } -        LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow simple"); //LL_RECORD_BLOCK_TIME(FTM_SHADOW_SIMPLE); +        LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow simple");          LL_PROFILE_GPU_ZONE("shadow simple"); +        LL_RECORD_BLOCK_TIME(FTM_SHADOW_SIMPLE); +          gGL.getTexUnit(0)->disable();          for (U32 type : types) @@ -9534,63 +9768,71 @@ void LLPipeline::renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCa      {          LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow geom"); +        LL_RECORD_BLOCK_TIME(FTM_SHADOW_GEOM);          renderGeomShadow(shadow_cam);      } -    if(MPRenderShadowOpti < 3) +    LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha"); +    LL_PROFILE_GPU_ZONE("shadow alpha"); +    LL_RECORD_BLOCK_TIME(FTM_SHADOW_ALPHA); + +    const S32 sun_up = LLEnvironment::instance().getIsSunUp() ? 1 : 0; +    U32 target_width = LLRenderTarget::sCurResX; + +    for (int i = 0; i < 2; ++i)      { -        LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha"); -        LL_PROFILE_GPU_ZONE("shadow alpha"); -        const S32 sun_up = LLEnvironment::instance().getIsSunUp() ? 1 : 0; -        U32 target_width = LLRenderTarget::sCurResX; +        bool rigged = i == 1; -        for (int i = 0; i < 2; ++i)          { -            bool rigged = i == 1; +            LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha masked"); +            LL_PROFILE_GPU_ZONE("shadow alpha masked"); +            LL_RECORD_BLOCK_TIME(FTM_SHADOW_ALPHA_MASKED); +            gDeferredShadowAlphaMaskProgram.bind(rigged); +            LLGLSLShader::sCurBoundShaderPtr->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_up); +            LLGLSLShader::sCurBoundShaderPtr->uniform1f(LLShaderMgr::DEFERRED_SHADOW_TARGET_WIDTH, (float)target_width); +            renderMaskedObjects(LLRenderPass::PASS_ALPHA_MASK, true, true, rigged); +        } -            { -                LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha masked"); -                LL_PROFILE_GPU_ZONE("shadow alpha masked"); -                gDeferredShadowAlphaMaskProgram.bind(rigged); -                LLGLSLShader::sCurBoundShaderPtr->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_up); -                LLGLSLShader::sCurBoundShaderPtr->uniform1f(LLShaderMgr::DEFERRED_SHADOW_TARGET_WIDTH, (float)target_width); -                renderMaskedObjects(LLRenderPass::PASS_ALPHA_MASK, true, true, rigged); -            } +        { +            LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha blend"); +            LL_PROFILE_GPU_ZONE("shadow alpha blend"); +            LL_RECORD_BLOCK_TIME(FTM_SHADOW_ALPHA_BLEND); +            renderAlphaObjects(rigged); +        } -            { -                LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha blend"); -                LL_PROFILE_GPU_ZONE("shadow alpha blend"); -                renderAlphaObjects(rigged); -            } +        { +            LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow fullbright alpha masked"); +            LL_PROFILE_GPU_ZONE("shadow alpha masked"); +            LL_RECORD_BLOCK_TIME(FTM_SHADOW_FULLBRIGHT_ALPHA_MASKED); +            gDeferredShadowFullbrightAlphaMaskProgram.bind(rigged); +            LLGLSLShader::sCurBoundShaderPtr->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_up); +            LLGLSLShader::sCurBoundShaderPtr->uniform1f(LLShaderMgr::DEFERRED_SHADOW_TARGET_WIDTH, (float)target_width); +            renderFullbrightMaskedObjects(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, true, true, rigged); +        } + +        { +            LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha grass"); +            LL_PROFILE_GPU_ZONE("shadow alpha grass"); +            LL_RECORD_BLOCK_TIME(FTM_SHADOW_ALPHA_GRASS); + +            gDeferredTreeShadowProgram.bind(rigged); +            LLGLSLShader::sCurBoundShaderPtr->setMinimumAlpha(ALPHA_BLEND_CUTOFF); + +            if (i == 0)              { -                LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow fullbright alpha masked"); -                LL_PROFILE_GPU_ZONE("shadow alpha masked"); -                gDeferredShadowFullbrightAlphaMaskProgram.bind(rigged); -                LLGLSLShader::sCurBoundShaderPtr->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_up); -                LLGLSLShader::sCurBoundShaderPtr->uniform1f(LLShaderMgr::DEFERRED_SHADOW_TARGET_WIDTH, (float)target_width); -                renderFullbrightMaskedObjects(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, true, true, rigged); +                renderObjects(LLRenderPass::PASS_GRASS, true);              }              { -                LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha grass"); -                LL_PROFILE_GPU_ZONE("shadow alpha grass"); -                gDeferredTreeShadowProgram.bind(rigged); -                LLGLSLShader::sCurBoundShaderPtr->setMinimumAlpha(ALPHA_BLEND_CUTOFF); +                LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha material"); +                LL_PROFILE_GPU_ZONE("shadow alpha material"); +                LL_RECORD_BLOCK_TIME(FTM_SHADOW_ALPHA_MATERIAL); -                if (i == 0) -                { -                    renderObjects(LLRenderPass::PASS_GRASS, true); -                } - -                { -                    LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("shadow alpha material"); -                    LL_PROFILE_GPU_ZONE("shadow alpha material"); -                    renderMaskedObjects(LLRenderPass::PASS_NORMSPEC_MASK, true, false, rigged); -                    renderMaskedObjects(LLRenderPass::PASS_MATERIAL_ALPHA_MASK, true, false, rigged); -                    renderMaskedObjects(LLRenderPass::PASS_SPECMAP_MASK, true, false, rigged); -                    renderMaskedObjects(LLRenderPass::PASS_NORMMAP_MASK, true, false, rigged); -                } +                renderMaskedObjects(LLRenderPass::PASS_NORMSPEC_MASK, true, false, rigged); +                renderMaskedObjects(LLRenderPass::PASS_MATERIAL_ALPHA_MASK, true, false, rigged); +                renderMaskedObjects(LLRenderPass::PASS_SPECMAP_MASK, true, false, rigged); +                renderMaskedObjects(LLRenderPass::PASS_NORMMAP_MASK, true, false, rigged);              }          } @@ -9868,16 +10110,24 @@ public:  void LLPipeline::generateSunShadow(LLCamera& camera)  { -    if (!sRenderDeferred || RenderShadowDetail <= 0 || (MPRenderShadowOpti > 0 && gCubeSnapshot)) +    if (!sRenderDeferred || RenderShadowDetail <= 0)      {          return;      } +    if(gCubeSnapshot) +    { +        LL_WARNS() << "generateSunShadow() gCubeSnapshot" << LL_ENDL; +        return; +    } +      LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE; //LL_RECORD_BLOCK_TIME(FTM_GEN_SUN_SHADOW);      LL_PROFILE_GPU_ZONE("generateSunShadow");      LLDisableOcclusionCulling no_occlusion; +    U32 splits = 4; +      bool skip_avatar_update = false;      if (!isAgentAvatarValid() || gAgentCamera.getCameraAnimating() || gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK || !LLVOAvatar::sVisibleInFirstPerson)      { @@ -9982,7 +10232,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)      LLPlane shadow_near_clip;      {          LLVector3 p = camera.getOrigin(); // gAgent.getPositionAgent(); -        p += caster_dir * RenderFarClip*2.f; +        p += caster_dir * RenderFarClip*1.1f;          shadow_near_clip.setVec(p, caster_dir);      } @@ -10055,30 +10305,36 @@ void LLPipeline::generateSunShadow(LLCamera& camera)              update_min_max(min, max, fp[i]);          } +        F32 maxDist = gSavedSettings.getF32("MPRenderShadowMaxDist");          near_clip    = llclamp(-max.mV[2], 0.01f, 4.0f); -        F32 far_clip = llclamp(-min.mV[2]*2.f, 16.0f, 512.0f); - -        //far_clip = llmin(far_clip, 128.f); +        F32 far_clip = llclamp(-min.mV[2]*1.1, 16.0f, maxDist);          far_clip = llmin(far_clip, camera.getFar());          F32 range = far_clip-near_clip; -        LLVector3 split_exp = RenderShadowSplitExponent; +        F32 closestDist = 2.0; +        F32 closeDist = 10.0; -        F32 da = 1.f-llmax( fabsf(lightDir*up), fabsf(lightDir*camera.getLeftAxis()) ); +        mSunClipPlanes.mV[0] = near_clip + closestDist; +        mSunClipPlanes.mV[1] = near_clip + closeDist; +        mSunClipPlanes.mV[2] = mSunClipPlanes.mV[1] + (range-closeDist)*0.4; +        mSunClipPlanes.mV[3] = far_clip; +        /* +        LLVector3 split_exp = RenderShadowSplitExponent; +        F32 da = 1.f-llmax( fabsf(lightDir*up), fabsf(lightDir*camera.getLeftAxis()) );          da = powf(da, split_exp.mV[2]); -          F32 sxp = split_exp.mV[1] + (split_exp.mV[0]-split_exp.mV[1])*da; -        for (U32 i = 0; i < 4; ++i) +        for (U32 i = 0; i < splits; ++i)          { -            F32 x = (F32)(i+1)/4.f; +            F32 x = (F32)(i+1)/(F32)splits;              x = powf(x, sxp);              mSunClipPlanes.mV[i] = near_clip+range*x;          } +        */ -        mSunClipPlanes.mV[0] *= 1.25f; //bump back first split for transition padding +        //mSunClipPlanes.mV[0] *= 1.1f; //bump back first split for transition padding      }      if (gCubeSnapshot) @@ -10098,7 +10354,11 @@ void LLPipeline::generateSunShadow(LLCamera& camera)      }      else      { -        for (S32 j = 0; j < (gCubeSnapshot ? 2 : 4); j++) +        S32 begin = 0; +        S32 end = splits-1; +        if(gCubeSnapshot) end = 1; + +        for (S32 j = begin; j <= end; j++)          {              if (!hasRenderDebugMask(RENDER_DEBUG_SHADOW_FRUSTA) && !gCubeSnapshot)              { @@ -10136,8 +10396,8 @@ void LLPipeline::generateSunShadow(LLCamera& camera)                  delta += (frust[i+4]-frust[(i+2)%4+4])*0.05f;                  delta.normVec();                  F32 dp = delta*pn; -                frust[i] = eye + (delta*dist[j]*0.75f)/dp; -                frust[i+4] = eye + (delta*dist[j+1]*1.25f)/dp; +                frust[i] = eye + (delta*dist[j]*0.9f)/dp; +                frust[i+4] = eye + (delta*dist[j+1]*1.1f)/dp;              }              shadow_cam.calcAgentFrustumPlanes(frust); @@ -10150,12 +10410,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)              std::vector<LLVector3> fp; -            U32 splits = 3; -            if(MPRenderShadowOpti == 1) splits = 2; -            else if(MPRenderShadowOpti >= 2) splits = 1; - -            if (!gPipeline.getVisiblePointCloud(shadow_cam, min, max, fp, lightDir) -                || j > splits) +            if (!gPipeline.getVisiblePointCloud(shadow_cam, min, max, fp, lightDir))              {                  //no possible shadow receivers                  if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA) && !gCubeSnapshot) @@ -10165,7 +10420,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)                      mShadowCamera[j+4] = shadow_cam;                  } -                mRT->shadow[j].bindTarget(); +                mRT->shadow[j].bindTarget("", 1);                  {                      LLGLDepthTest depth(GL_TRUE);                      mRT->shadow[j].clear(); @@ -10455,8 +10710,9 @@ void LLPipeline::generateSunShadow(LLCamera& camera)              stop_glerror(); -            mRT->shadow[j].bindTarget(); -            mRT->shadow[j].getViewport(gGLViewport); +            mRT->shadow[j].bindTarget("mRT->shadow[j] (rendering)", 1); +            //mRT->shadow[j].getViewport(gGLViewport); +            //mRT->shadow[j].getViewport(0, 0, SHADOWS_RESX, SHADOWS_RESY);              mRT->shadow[j].clear();              { @@ -10604,8 +10860,8 @@ void LLPipeline::generateSunShadow(LLCamera& camera)                  // -                mSpotShadow[i].bindTarget(); -                mSpotShadow[i].getViewport(gGLViewport); +                mSpotShadow[i].bindTarget("mSpotShadow[i]", 1); +                //mSpotShadow[i].getViewport(gGLViewport);                  mSpotShadow[i].clear();                  static LLCullResult result[2]; @@ -10653,6 +10909,8 @@ void LLPipeline::generateSunShadow(LLCamera& camera)      {          gAgentAvatarp->updateAttachmentVisibility(gAgentCamera.getCameraMode());      } + +    LOG_GLERROR("LLPipeline::generateSunShadow()");  }  void LLPipeline::renderGroups(LLRenderPass* pass, U32 type, bool texture) @@ -10668,6 +10926,8 @@ void LLPipeline::renderGroups(LLRenderPass* pass, U32 type, bool texture)              pass->renderGroup(group,type,texture);          }      } + +    LOG_GLERROR("LLPipeline::renderGroups()");  }  void LLPipeline::renderRiggedGroups(LLRenderPass* pass, U32 type, bool texture) @@ -10683,6 +10943,8 @@ void LLPipeline::renderRiggedGroups(LLRenderPass* pass, U32 type, bool texture)              pass->renderRiggedGroup(group, type, texture);          }      } + +    LOG_GLERROR("LLPipeline::renderRiggedGroups()");  }  void LLPipeline::profileAvatar(LLVOAvatar* avatar, bool profile_attachments) @@ -10699,7 +10961,7 @@ void LLPipeline::profileAvatar(LLVOAvatar* avatar, bool profile_attachments)      LLGLSLShader* cur_shader = LLGLSLShader::sCurBoundShaderPtr; -    mRT->deferredScreen.bindTarget(); +    mRT->deferredScreen.bindTarget("mRT->deferredScreen in profileAvatar", 1);      mRT->deferredScreen.clear();      if (!profile_attachments) @@ -10753,6 +11015,8 @@ void LLPipeline::profileAvatar(LLVOAvatar* avatar, bool profile_attachments)      {          cur_shader->bind();      } + +    LOG_GLERROR("LLPipeline::profileAvatar()");  }  void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar, bool for_profile, LLViewerObject* specific_attachment) @@ -10777,12 +11041,12 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar, bool      // previews can't be muted or impostered      bool visually_muted = !for_profile && !preview_avatar && avatar->isVisuallyMuted();      LL_DEBUGS_ONCE("AvatarRenderPipeline") << "Avatar " << avatar->getID() -                              << " is " << ( visually_muted ? "" : "not ") << "visually muted" -                              << LL_ENDL; +                            << " is " << ( visually_muted ? "" : "not ") << "visually muted" +                            << LL_ENDL;      bool too_complex = !for_profile && !preview_avatar && avatar->isTooComplex();      LL_DEBUGS_ONCE("AvatarRenderPipeline") << "Avatar " << avatar->getID() -                              << " is " << ( too_complex ? "" : "not ") << "too complex" -                              << LL_ENDL; +                            << " is " << ( too_complex ? "" : "not ") << "too complex" +                            << LL_ENDL;      pushRenderTypeMask(); @@ -10812,7 +11076,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar, bool              RENDER_TYPE_CLOUDS,              RENDER_TYPE_HUD_PARTICLES,              END_RENDER_TYPES -         ); +        );      }      if (specific_attachment && specific_attachment->isHUDAttachment()) @@ -10973,7 +11237,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar, bool          {              if (!avatar->mImpostor.isComplete())              { -                avatar->mImpostor.allocate(resX, resY, GL_RGBA, true); +                avatar->mImpostor.allocate(resX, resY, GL_RGBA8, true);                  if (LLPipeline::sRenderDeferred)                  { @@ -10989,7 +11253,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar, bool                  avatar->mImpostor.resize(resX, resY);              } -            avatar->mImpostor.bindTarget(); +            avatar->mImpostor.bindTarget("avatar->mImpostor", 1);          }      } @@ -11126,6 +11390,9 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar, bool      }      LLVertexBuffer::unbind(); + +    LOG_GLERROR("LLPipeline::generateImpostor()"); +      LLGLState::checkStates();  } @@ -11401,7 +11668,7 @@ void LLPipeline::hideDrawable( LLDrawable *pDrawable )      //hide the children      LLViewerObject::const_child_list_t& child_list = pDrawable->getVObj()->getChildren();      for ( LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); -          iter != child_list.end(); iter++ ) +        iter != child_list.end(); iter++ )      {          LLViewerObject* child = *iter;          LLDrawable* drawable = child->mDrawable; @@ -11419,7 +11686,7 @@ void LLPipeline::unhideDrawable( LLDrawable *pDrawable )      //restore children      LLViewerObject::const_child_list_t& child_list = pDrawable->getVObj()->getChildren();      for ( LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); -          iter != child_list.end(); iter++) +        iter != child_list.end(); iter++)      {          LLViewerObject* child = *iter;          LLDrawable* drawable = child->mDrawable; @@ -11450,7 +11717,7 @@ void LLPipeline::skipRenderingShadows()      for (S32 j = 0; j < 4; j++)      { -        mRT->shadow[j].bindTarget(); +        mRT->shadow[j].bindTarget("skip rendering shadows", 1);          mRT->shadow[j].clear();          mRT->shadow[j].flush();      } diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index da9b8189e2..c56e181d2d 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -125,6 +125,8 @@ public:  private:      //implementation of above, wrapped for easy error handling      eFBOStatus doAllocateScreenBuffer(U32 resX, U32 resY); +    void renderTriangle(); +  public:      //attempt to allocate screen buffers at resX, resY @@ -158,15 +160,17 @@ public:      void tonemap(LLRenderTarget* src, LLRenderTarget* dst);      void gammaCorrect(LLRenderTarget* src, LLRenderTarget* dst);      void generateGlow(LLRenderTarget* src); -    void applyCAS(LLRenderTarget* src, LLRenderTarget* dst); -    void applyFXAA(LLRenderTarget* src, LLRenderTarget* dst); +    bool applyCAS(LLRenderTarget* src, LLRenderTarget* dst); +    bool applyFXAA(LLRenderTarget* src, LLRenderTarget* dst);      void generateSMAABuffers(LLRenderTarget* src); -    void applySMAA(LLRenderTarget* src, LLRenderTarget* dst); -    void renderDoF(LLRenderTarget* src, LLRenderTarget* dst); +    bool applySMAA(LLRenderTarget* src, LLRenderTarget* dst); +    bool renderDoF(LLRenderTarget* src, LLRenderTarget* dst);      void copyRenderTarget(LLRenderTarget* src, LLRenderTarget* dst);      void combineGlow(LLRenderTarget* src, LLRenderTarget* dst);      void visualizeBuffers(LLRenderTarget* src, LLRenderTarget* dst, U32 bufferIndex); +    bool renderBloom(LLRenderTarget* src, LLRenderTarget* dst); +      void init();      void cleanup();      bool isInit() { return mInitialized; }; @@ -228,12 +232,12 @@ public:      LLViewerObject* lineSegmentIntersectInHUD(const LLVector4a& start, const LLVector4a& end, -                                              bool pick_transparent, -                                              S32* face_hit,                          // return the face hit -                                              LLVector4a* intersection = NULL,         // return the intersection point -                                              LLVector2* tex_coord = NULL,            // return the texture coordinates of the intersection point -                                              LLVector4a* normal = NULL,               // return the surface normal at the intersection point -                                              LLVector4a* tangent = NULL             // return the surface tangent at the intersection point +                                            bool pick_transparent, +                                            S32* face_hit,                          // return the face hit +                                            LLVector4a* intersection = NULL,         // return the intersection point +                                            LLVector2* tex_coord = NULL,            // return the texture coordinates of the intersection point +                                            LLVector4a* normal = NULL,               // return the surface normal at the intersection point +                                            LLVector4a* tangent = NULL             // return the surface tangent at the intersection point          );      // Something about these textures has changed.  Dirty them. @@ -729,8 +733,12 @@ public:      LLRenderTarget          mExposureMap;      LLRenderTarget          mLastExposure; +    LLRenderTarget          mBloomMap; +    LLRenderTarget          mBloomBlur[2]; +      // tonemapped and gamma corrected render ready for post -    LLRenderTarget          mPostMap; +    //LLRenderTarget          mPostMap; +    LLRenderTarget          mPostMaps[2];      // FXAA helper target      LLRenderTarget          mFXAAMap; @@ -835,8 +843,8 @@ protected:      {          Light(LLDrawable* ptr, F32 d, F32 f = 0.0f)              : drawable(ptr), -              dist(d), -              fade(f) +            dist(d), +            fade(f)          {}          LLPointer<LLDrawable> drawable;          F32 dist; @@ -1008,7 +1016,7 @@ public:      static bool RenderDeferred;      static F32 RenderDeferredSunWash;      static U32 RenderFSAAType; -    static U32 RenderResolutionDivisor; +    static F32 RenderResolutionDivisor;      static bool RenderUIBuffer;      static S32 RenderShadowDetail;      static S32 MPRenderShadowOpti; diff --git a/indra/newview/skins/default/textures/megapahit/fps_button.png b/indra/newview/skins/default/textures/megapahit/fps_button.pngBinary files differ new file mode 100644 index 0000000000..fa436a620d --- /dev/null +++ b/indra/newview/skins/default/textures/megapahit/fps_button.png diff --git a/indra/newview/skins/default/textures/megapahit/mp_blue_bullet.png b/indra/newview/skins/default/textures/megapahit/mp_blue_bullet.pngBinary files differ new file mode 100644 index 0000000000..1a27570786 --- /dev/null +++ b/indra/newview/skins/default/textures/megapahit/mp_blue_bullet.png diff --git a/indra/newview/skins/default/textures/megapahit/mp_green_bullet.png b/indra/newview/skins/default/textures/megapahit/mp_green_bullet.pngBinary files differ new file mode 100644 index 0000000000..f4c28e4bc9 --- /dev/null +++ b/indra/newview/skins/default/textures/megapahit/mp_green_bullet.png diff --git a/indra/newview/skins/default/textures/megapahit/mp_help_bullet.png b/indra/newview/skins/default/textures/megapahit/mp_help_bullet.pngBinary files differ new file mode 100644 index 0000000000..64c8933a78 --- /dev/null +++ b/indra/newview/skins/default/textures/megapahit/mp_help_bullet.png diff --git a/indra/newview/skins/default/textures/megapahit/mp_info_bullet.png b/indra/newview/skins/default/textures/megapahit/mp_info_bullet.pngBinary files differ new file mode 100644 index 0000000000..c90767b9ac --- /dev/null +++ b/indra/newview/skins/default/textures/megapahit/mp_info_bullet.png diff --git a/indra/newview/skins/default/textures/megapahit/mp_red_bullet.png b/indra/newview/skins/default/textures/megapahit/mp_red_bullet.pngBinary files differ new file mode 100644 index 0000000000..aeaa52b53b --- /dev/null +++ b/indra/newview/skins/default/textures/megapahit/mp_red_bullet.png diff --git a/indra/newview/skins/default/textures/megapahit/mp_yellow_bullet.png b/indra/newview/skins/default/textures/megapahit/mp_yellow_bullet.pngBinary files differ new file mode 100644 index 0000000000..026fbaf56d --- /dev/null +++ b/indra/newview/skins/default/textures/megapahit/mp_yellow_bullet.png diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 1fe1ff333a..8af67c1f88 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -931,4 +931,13 @@ with the same filename but different name    <texture name="ProgressLarge_11" file_name="icons/ProgressLarge_11.png" preload="true" />    <texture name="ProgressLarge_12" file_name="icons/ProgressLarge_12.png" preload="true" /> +  <texture name="mp_fpsButton" file_name="megapahit/fps_button.png" preload="false" /> + +  <texture name="mp_red_bullet" file_name="megapahit/mp_red_bullet.png" preload="false" /> +  <texture name="mp_yellow_bullet" file_name="megapahit/mp_yellow_bullet.png" preload="false" /> +  <texture name="mp_green_bullet" file_name="megapahit/mp_green_bullet.png" preload="false" /> +  <texture name="mp_blue_bullet" file_name="megapahit/mp_blue_bullet.png" preload="false" /> +  <texture name="mp_help_bullet" file_name="megapahit/mp_help_bullet.png" preload="false" /> +  <texture name="mp_info_bullet" file_name="megapahit/mp_info_bullet.png" preload="false" /> +  </textures> diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml index 0d22d37085..4e7ce2c32f 100644 --- a/indra/newview/skins/default/xui/en/floater_about.xml +++ b/indra/newview/skins/default/xui/en/floater_about.xml @@ -103,8 +103,8 @@ gwigz (nya)                   EmilyAmiee  Bavid Dailey                  Aria (Tashia Redrose)  Cate (32a)                    Hiroo Ono  Melodey                       Keysin (scoutkeysin) -Yikes Lopez                   Padoria Teuden -~ ( ^-^ ) ~ (cutie_qu)        Markus Teuden +Yikes Lopez                   Padoria +~ ( ^-^ ) ~ (cutie_qu)      </text_editor>      <text            follows="top|left" @@ -135,7 +135,6 @@ Vir Linden - Making it possible for the project to have a place in SL  nutsobvious - Early testing and video proof  Soft Linden - Security testing  Kyle Linden - Giving TPV parcel 2 to Erik Kundiman -Signal Linden - Opening opportunities for Megapahit to contribute more      </text_editor>      </panel>    </accordion_tab> diff --git a/indra/newview/skins/default/xui/en/floater_mp_performance.xml b/indra/newview/skins/default/xui/en/floater_mp_performance.xml index 1b5cf82dcb..13a32479fa 100644 --- a/indra/newview/skins/default/xui/en/floater_mp_performance.xml +++ b/indra/newview/skins/default/xui/en/floater_mp_performance.xml @@ -1,65 +1,66 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <floater - positioning="cascading" - legacy_header_height="40" - top="12" - right="-334" - height="80" - min_height="120" - width="330" - min_width="330" - can_minimize="true" - can_close="true" - can_resize="false" - layout="topright" - name="mpv_performance" - single_instance="true" - save_rect="true" - save_visibility="true" - title="FPS Limiter"> +positioning="cascading" +legacy_header_height="40" +top="12" +right="-334" +height="80" +min_height="120" +width="330" +min_width="330" +can_minimize="true" +can_close="true" +can_resize="false" +layout="topright" +name="mpv_performance" +single_instance="true" +save_rect="true" +save_visibility="true" +title="FPS Limiter"> - <panel -     name="panel_fps" -     border="false" -     width="320" -     height="60" -     left="10" -     top="40" -     follows="left|top|right|bottom" -     layout="topleft" -     > +<panel +    name="panel_fps" +    border="false" +    width="320" +    height="60" +    left="10" +    top="40" +    follows="left|top|right|bottom" +    layout="topleft" +    > -     <slider -     follows="left|top" -     width="240" -     height="15" -     left="12" -     layout="topleft" -     name="fpsSlider" -     enabled="true" -     control_name="fpsSlider" -     decimal_digits="0" -     increment="12" -     initial_value="0" -     label="Max FPS:" -     label_width="50" -     text_width="2" -     can_edit_text="false" -     show_text="false" -     > -     </slider> +    <slider +    follows="left|top" +    width="240" +    height="15" +    left="12" +    layout="topleft" +    name="fpsSliderCtrl" +    enabled="true" +    decimal_digits="0" +    min_val="0" +    max_val="132" +    increment="12" +    initial_value="132" +    label="Max FPS:" +    label_width="50" +    text_width="2" +    can_edit_text="false" +    show_text="false" +    > +    </slider> -     <text -     follows="left|top" -     width="50" -     height="15" -     left_delta="252" -     layout="topleft" -     type="string" -     name="fpsText" -     > -       no limit -     </text> +    <text +    follows="left|top" +    width="50" +    height="15" +    left_delta="252" +    layout="topleft" +    type="string" +    name="fpsTextCtrl" +    > +      no limit +    </text>  </panel> diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml index 4b0e0bb221..a96a4f2b75 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences.xml @@ -1,175 +1,201 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <floater - legacy_header_height="18" - positioning="centered" - default_tab_group="1" - height="530" - layout="topleft" - name="Preferences" - help_topic="preferences" - save_rect="true" - single_instance="true" - title="PREFERENCES" - width="658"> -   <button -     follows="right|bottom" -     height="23" -     label="OK" -     label_selected="OK" -     layout="topleft" -     right="-105" -     name="OK" -     top="492" -     width="90"> -        <button.commit_callback -         function="Pref.OK" /> -    </button> -    <button -     follows="right|bottom" -     height="23" -     label="Cancel" -     label_selected="Cancel" -     layout="topleft" -     left_pad="5" -     name="Cancel" -     right="-10" -     width="90" > -        <button.commit_callback -         function="Pref.Cancel" /> -    </button> - -    <panel -     name="search_panel" -     layout="topleft" -     follows="left|top|right" -     left="4" -     right="-4" -     top="21" -     height="18" -     tab_group="2"> -        <search_editor -         clear_button_visible="true" -         follows="left|top|right" -         height="18" -         label="Search Settings" -         layout="topleft" -         left="0" -         max_length_bytes="255" -         name="search_prefs_edit" -         right="-1" -         text_pad_left="6" -         tool_tip="Type the search term you are interested in here. Results will be displayed for partial fulltext matches within the setting's name or comment." -         top="0"> -         <search_editor.commit_callback -          function="UpdateFilter" /> -         <search_editor.clear_button -          rect.height="18" -          rect.width="18" -          rect.bottom="-1" /> -         <search_editor.search_button -          rect.height="12" -          rect.width="12" -          rect.bottom="-1" /> -        </search_editor> -    </panel> - -    <tab_container -     follows="all" -     halign="left" -     height="440" -     layout="topleft" -     left="0" -     name="pref core" -     tab_group="1" -     tab_position="left" -     tab_width="140" -     tab_padding_right="0" -     top="40" -     width="658"> -        <panel -	 class="panel_preference" -         filename="panel_preferences_general.xml" -         label="General" -         layout="topleft" -         help_topic="preferences_general_tab" -         name="general" /> -        <panel -	 class="panel_preference_graphics" -         filename="panel_preferences_graphics1.xml" -         label="Graphics" -         layout="topleft" -         help_topic="preferences_display_tab" -         name="display" /> -        <panel -		 class="panel_preference" -         filename="panel_preferences_sound.xml" -         label="Sound & Media" -         layout="topleft" -         help_topic="preferences_audio_tab" -         name="audio" /> -        <panel -		 class="panel_preference" -         filename="panel_preferences_chat.xml" -         label="Chat" -         layout="topleft" -         help_topic="preferences_chat_tab" -         name="chat" /> -        <panel -		 class="panel_preference" -         filename="panel_preferences_move.xml" -         label="Move & View" -         layout="topleft" -         help_topic="preferences_move_tab" -         name="move" /> -        <panel -		 class="panel_preference" -         filename="panel_preferences_alerts.xml" -         label="Notifications" -         layout="topleft" -         help_topic="preferences_msgs_tab" -         name="msgs" /> -        <panel -		 class="panel_preference" -         filename="panel_preferences_colors.xml" -         label="Colors" -         layout="topleft" -         help_topic="preferences_colors_tab" -         name="colors" /> -        <panel -         class="panel_preference_privacy" -         filename="panel_preferences_privacy.xml" -         label="Privacy" -         layout="topleft" -         help_topic="preferences_im_tab" -         name="im" /> -        <panel -		 class="panel_preference" -         filename="panel_preferences_setup.xml" -         label="Setup" -         layout="topleft" -         help_topic="preferences_input_tab" -         name="input" /> -        <panel -		 class="panel_preference" -         filename="panel_preferences_advanced.xml" -         label="Advanced" -         layout="topleft" -         help_topic="preferences_advanced1_tab" -         name="advanced1" /> -        <panel -         class="panel_preference" -         filename="panel_preferences_uploads.xml" -         label="Uploads" -         layout="topleft" -         help_topic="preferences_uploads_tab" -         name="uploads" /> -        <panel -         class="panel_preference_controls" -         filename="panel_preferences_controls.xml" -         label="Controls" -         layout="topleft" -         help_topic="preferences_controls_tab" -         name="controls" /> -    </tab_container> +legacy_header_height="18" +positioning="centered" +default_tab_group="1" +height="530" +layout="topleft" +name="Preferences" +help_topic="preferences" +save_rect="true" +single_instance="true" +title="PREFERENCES" +width="658"> + +<button +follows="right|bottom" +height="23" +label="OK" +label_selected="OK" +layout="topleft" +right="-105" +name="OK" +top="492" +width="90"> +   <button.commit_callback +   function="Pref.OK" /> +</button> + +<button +follows="right|bottom" +height="23" +label="Cancel" +label_selected="Cancel" +layout="topleft" +left_pad="5" +name="Cancel" +right="-10" +width="90" > +   <button.commit_callback +   function="Pref.Cancel" /> +</button> + +<panel +name="search_panel" +layout="topleft" +follows="left|top|right" +left="4" +right="-4" +top="21" +height="18" +tab_group="2"> + +   <search_editor +   clear_button_visible="true" +   follows="left|top|right" +   height="18" +   label="Search Settings" +   layout="topleft" +   left="0" +   max_length_bytes="255" +   name="search_prefs_edit" +   right="-1" +   text_pad_left="6" +   tool_tip="Type the search term you are interested in here. Results will be displayed for partial fulltext matches within the setting's name or comment." +   top="0"> + +   <search_editor.commit_callback +      function="UpdateFilter" /> + +   <search_editor.clear_button +      rect.height="18" +      rect.width="18" +      rect.bottom="-1" /> + +   <search_editor.search_button +      rect.height="12" +      rect.width="12" +      rect.bottom="-1" /> +   </search_editor> +</panel> + +<tab_container +follows="all" +halign="left" +height="440" +layout="topleft" +left="0" +name="pref core" +tab_group="1" +tab_position="left" +tab_width="140" +tab_padding_right="0" +top="40" +width="658"> + +   <panel +   class="panel_preference" +   filename="panel_preferences_general.xml" +   label="General" +   layout="topleft" +   help_topic="preferences_general_tab" +   name="general" /> + +   <panel +   class="panel_preference_graphics" +   filename="panel_preferences_graphics1.xml" +   label="Graphics" +   layout="topleft" +   help_topic="preferences_display_tab" +   name="display" /> + +   <panel +   class="panel_preference_graphics3" +   filename="panel_preferences_graphics3.xml" +   label="Visual Effects" +   layout="topleft" +   help_topic="preferences_display_tab" +   name="display3" /> + +   <panel +   class="panel_preference" +   filename="panel_preferences_sound.xml" +   label="Sound & Media" +   layout="topleft" +   help_topic="preferences_audio_tab" +   name="audio" /> + +   <panel +   class="panel_preference" +   filename="panel_preferences_chat.xml" +   label="Chat" +   layout="topleft" +   help_topic="preferences_chat_tab" +   name="chat" /> + +   <panel +   class="panel_preference" +   filename="panel_preferences_move.xml" +   label="Move & View" +   layout="topleft" +   help_topic="preferences_move_tab" +   name="move" /> + +   <panel +   class="panel_preference" +   filename="panel_preferences_alerts.xml" +   label="Notifications" +   layout="topleft" +   help_topic="preferences_msgs_tab" +   name="msgs" /> + +   <panel +   class="panel_preference" +   filename="panel_preferences_colors.xml" +   label="Colors" +   layout="topleft" +   help_topic="preferences_colors_tab" +   name="colors" /> + +   <panel +   class="panel_preference_privacy" +   filename="panel_preferences_privacy.xml" +   label="Privacy" +   layout="topleft" +   help_topic="preferences_im_tab" +   name="im" /> + +   <panel +   class="panel_preference" +   filename="panel_preferences_setup.xml" +   label="Setup" +   layout="topleft" +   help_topic="preferences_input_tab" +   name="input" /> + +   <panel +   class="panel_preference" +   filename="panel_preferences_advanced.xml" +   label="Advanced" +   layout="topleft" +   help_topic="preferences_advanced1_tab" +   name="advanced1" /> + +   <panel +   class="panel_preference" +   filename="panel_preferences_uploads.xml" +   label="Uploads" +   layout="topleft" +   help_topic="preferences_uploads_tab" +   name="uploads" /> + +   <panel +   class="panel_preference_controls" +   filename="panel_preferences_controls.xml" +   label="Controls" +   layout="topleft" +   help_topic="preferences_controls_tab" +   name="controls" /> +</tab_container>  </floater> diff --git a/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml index 88d6ae1bc2..ddb2833b5d 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml @@ -766,88 +766,12 @@         label="Sun/Moon + Projectors"         name="2"         value="2"/> -  </combo_box> - -  <text -    type="string" -    length="1" -    follows="left|top" -    height="16" -    layout="topleft" -    left="420" -    name="RenderShadowQualityText" -    text_readonly_color="LabelDisabledColor" -    top_delta="22" -    width="128"> -      Shadows Optimisations -  </text> - -  <combo_box -   control_name="MPRenderShadowOpti" -   height="18" -   layout="topleft" -   left_delta="130" -   top_delta="0" -   name="MPShadowQuality" -   width="150"> -     <combo_box.item -       label="No optimisation" -       name="0" -       value="0"/> -     <combo_box.item -       label="Medium" -       name="1" -       value="1"/> -    <combo_box.item -       label="Faster" -       name="2" -       value="2"/> -     <combo_box.item -       label="Fastest" +      <combo_box.item +       label="Projectors only"         name="3"         value="3"/>    </combo_box> -  <text -    type="string" -    length="1" -    follows="left|top" -    height="16" -    layout="topleft" -    left="420" -    name="RenderShadowResolutionScaleText" -    text_readonly_color="LabelDisabledColor" -    top_delta="22" -    width="128"> -      Shadows Resolution -  </text> - -  <combo_box -   control_name="RenderShadowResolutionScale" -   height="18" -   layout="topleft" -   left_delta="130" -   top_delta="0" -   name="RenderShadowResolutionScale" -   width="150"> -     <combo_box.item -       label="Default" -       name="Default" -       value="1.0"/> -     <combo_box.item -       label="High" -       name="High" -       value="1.5"/> -    <combo_box.item -       label="Ultra" -       name="Ultra" -       value="2.0"/> -    <combo_box.item -       label="Crazy" -       name="Crazy" -       value="3.0"/> -  </combo_box> -    <check_box      control_name="RenderScreenSpaceReflections"      height="16" diff --git a/indra/newview/skins/default/xui/en/panel_performance_preferences.xml b/indra/newview/skins/default/xui/en/panel_performance_preferences.xml index ece9bb2552..8d4e8dc8e8 100644 --- a/indra/newview/skins/default/xui/en/panel_performance_preferences.xml +++ b/indra/newview/skins/default/xui/en/panel_performance_preferences.xml @@ -420,6 +420,7 @@     width="180">        (Enter value between 0.0 and 4.0)    </text> +    <text     follows="left|top"     font="SansSerifSmall" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml index 8248da9fda..c38af9d4fa 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml @@ -213,6 +213,7 @@       layout="topleft"       left="30"       name="stream_notification_channel_enabled" +     top_pad="10"       width="256">      </check_box>      <spinner @@ -232,15 +233,6 @@       name="stream_notification_channel"       top_pad="-15"       width="170" /> -    <check_box -     control_name="SnapshotTimestamp" -     height="16" -     label="Add timestamp to snapshot file names" -     layout="topleft" -     left="30" -     name="snapshot_timestamp" -     width="256"> -    </check_box>      <check_box       control_name="AllowMultipleViewers" @@ -250,7 +242,7 @@       layout="topleft"       left="30"       name="allow_multiple_viewer_check" -     top_pad="15" +     top_pad="20"       width="237"/>      <check_box       control_name="ForceShowGrid" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_colors.xml b/indra/newview/skins/default/xui/en/panel_preferences_colors.xml index 6fd6c81217..df9f467fca 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_colors.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_colors.xml @@ -505,7 +505,6 @@         Skin     </text>     <radio_group -     control_name="skin_selection"       height="20"       layout="topleft"       left="35" @@ -538,6 +537,15 @@           name="radio3"           value="contrast"           width="75" /> +        <radio_item +         label="contrast gold" +         left_pad="0" +         layout="topleft" +         top_delta="0" +         height="16" +         name="radio2" +         value="contrast_gold" +         width="75" />          <radio_group.commit_callback              function="Pref.SelectSkin" />      </radio_group> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics3.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics3.xml new file mode 100644 index 0000000000..8b76ece106 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics3.xml @@ -0,0 +1,1814 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> + +<panel +name="Visuals effects panel" +follows="left|top|right|bottom" +label="Visuals Effects" +layout="topleft" +width="517" +height="438" +left="102" +top="1" +border="true" +> + +<tab_container +name="preferences_visuals_tab_container" +enabled="true" +top_pad="0" +follows="left|top" +width="517" +height="430" +left_delta="0" +tab_position="top" +tab_stop="false"> + +<panel +label="Megapahit" +name="preferences_visuals_megapahit" +layout="topleft" +follows="top|left"> + +<text +follows="left|top" +layout="topleft" +top_pad="20" +width="400" +height="18" +left="20" +font="SansSerifSmall" +text_color="White" +> +Megapahit recommended settings: +</text> + +<text +follows="left|top" +layout="topleft" +width="400" +height="18" +left="120" +top_pad="55" +font="SansSerifSmall" +> +Clicking the button below is a good starting point +</text> + +<button +name="MPBalancedButton" +follows="top|left" +layout="topleft" +width="200" +height="23" +left="155" +top_pad="40" +label="Recommended Settings" +> +</button> + +<text +follows="left|top" +layout="topleft" +width="460" +height="18" +left="50" +top_pad="60" +font="SansSerifSmall" +> +We recommend capping the fps (touch the fps counter on the top right corner) +</text> + +</panel> + +<panel +label="Antialiasing" +name="preferences_visuals_aa" +layout="topleft" +follows="top|left"> + +<text +name="mp_aa_lbl" +follows="left|top" +layout="topleft" +top_pad="20" +width="100" +height="18" +left="20" +font="SansSerifSmall" +text_color="White" +> +Antialiasing: +</text> + +<text +name="mp_aa_type_lbl" +type="string" +layout="topleft" +follows="left|top" +width="140" +height="16" +left="32" +top_pad="10" +text_readonly_color="LabelDisabledColor" +> +Type: +</text> + +<combo_box +name="mp_aatype_ctrl" +control_name="RenderFSAAType" +label="Antialiasing" +layout="topleft" +width="150" +height="18" +left_delta="150" +top_delta="0" +initial_value="0" +> +<combo_box.item +  label="Disabled" +  name="FSAADisabled" +  value="0" /> +<combo_box.item +  label="FXAA" +  name="FXAA" +  value="1" /> +<combo_box.item +  label="SMAA" +  name="SMAA" +  value="2" /> +</combo_box> + +<icon +name="mp_aa_bullet" +tool_tip="Low performance impact" +image_name="mp_blue_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="55" +top_delta="-2" +/> + +<icon +name="mp_aa_info_bullet" +tool_tip="Antialiasing method (FXAA is fast but blurry, SMAA is sharper)." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="mp_aa_quality_lbl" +tool_tip="Antialiasing quality: We recommend High or Ultra" +type="string" +length="1" +layout="topleft" +follows="left|top" +width="140" +height="16" +left="32" +top_pad="10" +text_readonly_color="LabelDisabledColor" +> +Quality: +</text> + +<combo_box +name="mp_aa_quality_ctrl" +control_name="RenderFSAASamples" +label="Antialiasing" +layout="topleft" +width="150" +height="18" +left_delta="150" +top_delta="0" +> +<combo_box.item +label="Low" +name="Low" +value="0" /> +<combo_box.item +label="Medium" +name="Medium" +value="1" /> +<combo_box.item +label="High" +name="High" +value="2" /> +<combo_box.item +label="Ultra" +name="Ultra" +value="3" /> +</combo_box> + +<icon +name="mp_aaq_bullet" +tool_tip="Low performance impact" +image_name="mp_blue_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="55" +top_delta="-2" +/> + +<icon +name="mp_aaq_info_bullet" +tool_tip="Quality of the selected antialiasing" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="mp_cas_lbl" +type="string" +length="1" +layout="topleft" +follows="left|top" +width="140" +height="16" +left="32" +top_pad="20" +text_readonly_color="LabelDisabledColor" +> +Sharpness: +</text> + +<slider +name="mp_cas_ctrl" +control_name="RenderCASSharpness" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="150" +top_delta="0" +initial_value="0.0" +min_val="0.0" +max_val="1.0" +decimal_digits="1" +label_width="2" +> +</slider> + +<icon +name="mp_cas_bullet" +tool_tip="No performance impact, except there is an issue currently with the combination of SMAA and Sharpness, where the performance is going down. We are investigating..." +image_name="mp_blue_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_cas_info_bullet" +tool_tip="Add sharpness to the image." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +follows="left|top" +layout="topleft" +width="400" +height="18" +left="55" +top_pad="40" +font="SansSerifSmall" +> +Beware: SMAA + Sharpness currently causes a slow down on Mac. +</text> + +</panel> + +<panel +label="Shadows" +name="preferences_visuals_shadows" +layout="topleft" +follows="top|left"> + +<text +name="mp_shadows_lbl" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="20" +top_pad="20" +font="SansSerifSmall" +text_color="White" +> +Shadows +</text> + +<text +name="shadow_src_lbl" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="10" +font="SansSerifSmall" +> +Shadows source: +</text> + +<combo_box +name="ShadowDetailCtrl" +control_name="RenderShadowDetail" +layout="topleft" +width="150" +height="18" +left_delta="150" +top_delta="0" +> +<combo_box.item +label="None" +name="0" +value="0"/> +<combo_box.item +label="Sun/Moon" +name="1" +value="1"/> +<combo_box.item +label="Sun/Moon + Projectors" +name="2" +value="2"/> +<combo_box.item +label="Projectors only" +name="3" +value="3"/> +</combo_box> + +<icon +name="mp_shadows_bullet" +tool_tip="High to extreme performance impact" +image_name="mp_red_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="55" +top_delta="-2" +/> + +<icon +name="mp_shadows_info_bullet" +tool_tip="Enables a shadow source (Projectors only is experimental)" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="shadow_dist_lbl" +tool_tip="Maximum Shadow Draw distance (Enormous performance penalty)" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="10" +font="SansSerifSmall"> +Shadows Distance +</text> + +<slider +name="MPShadowDistCtrl" +control_name="MPRenderShadowMaxDist" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="150" +top_delta="-1" +increment="8" +initial_value="64" +min_val="16" +max_val="256" +decimal_digits="0" +label_width="2"> +</slider> + +<icon +name="mp_shadowd_bullet" +tool_tip="Move to the left to improve performance" +image_name="mp_yellow_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_shadowd_info_bullet" +tool_tip="Limit the maximum shadow render distance" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="shadow_res_lbl" +tool_tip="Shadow Resolution (Important video memory impact. Lower this if you encounter performance drop, or instability.)" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="10" +font="SansSerifSmall" +> +Shadows Resolution +</text> + +<slider +name="MPShadowResCtrl" +control_name="RenderShadowResolutionScale" +decimal_digits="1" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="150" +top_delta="-1" +increment="0.5" +initial_value="1.5" +min_val="1.0" +max_val="6.0" +label_width="2" +> +</slider> + +<icon +name="mp_shadowdd_bullet" +tool_tip="Move to the right to improve quality: High memory usage and potentially unstable on lower end gpus" +image_name="mp_yellow_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_shadowdd_info_bullet" +tool_tip="Improves the shadow map resolution (Use carefully)" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="shadow_res_lbl" +tool_tip="Shadow smoothness (This will only work if you activate Ambient Occlusion)" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="10" +font="SansSerifSmall" +> +Shadows Smoothness +</text> + +<slider +name="shadowBlurCtrl" +control_name="RenderShadowBlurSize" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="150" +top_delta="-1" +increment="0.1" +initial_value="1.0" +min_val="0.0" +max_val="3.0" +decimal_digits="1" +label_width="2" +> +</slider> + +<icon +name="mp_shadowsblur_bullet" +tool_tip="No performance impact" +image_name="mp_blue_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_shadowsblur_info_bullet" +tool_tip="Adjust the shadow smoothness. This only works if SSAO is turned on" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="shadow_ssao_lbl" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="20" +top_pad="40" +font="SansSerifSmall" +text_color="White" +> +Ambient Occlusion +</text> + +<check_box +name="mp_ssao_ctrl" +control_name="RenderDeferredSSAO" +label="Screen Space Ambient Occlusion" +layout="topleft" +width="200" +height="16" +left="20" +top_delta="32" +initial_value="true" +> +<check_box.commit_callback +function="Pref.RenderOptionUpdate" /> +</check_box> + +<icon +name="mp_ssao_bullet" +tool_tip="Low to Medium performance impact" +image_name="mp_yellow_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_ssao_info_bullet" +tool_tip="Adds some shadow based on surface proximity." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +</panel> + +<panel +label="Bloom" +name="preferences_visuals_bloom" +layout="topleft" +follows="top|left"> + +<text +name="mp_bloom_lbl" +follows="left|top" +layout="topleft" +width="200" +height="18" +left="20" +top_pad="20" +font="SansSerifSmall" +text_color="White" +> +Bloom (experimental) +</text> + +<text +name="mp_bloom_level_lbl" +tool_tip="Bloom Level: The higher, the more diffuse (medium gpu cost)\n Note: This setting can fix a performance issue when antialiasing is turned on)" +type="string" +length="1" +follows="left|top" +width="140" +height="16" +layout="topleft" +left="32" +top_pad="10" +text_readonly_color="LabelDisabledColor" +> +Bloom level: +</text> + +<combo_box +name="MPBloomCtrl" +control_name="MPRenderBloom" +layout="topleft" +width="150" +height="18" +left_delta="150" +top_delta="0" +> +<combo_box.item +label="None" +name="0" +value="0"/> +<combo_box.item +label="Level 1" +name="1" +value="1"/> +<combo_box.item +label="Level 2" +name="2" +value="2"/> +<combo_box.item +label="Level 3" +name="3" +value="3"/> +</combo_box> + +<icon +name="mp_blooml_bullet" +tool_tip="Low to Medium performance impact" +image_name="mp_yellow_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="55" +top_delta="-2" +/> + +<icon +name="mp_blooml_info_bullet" +tool_tip="Bloom adds a glowing effect around the brightest areas. The level affects the number of iterations, and the quality." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="bloom_radius_lbl" +tool_tip="Bloom Radius" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="10" +font="SansSerifSmall" +> +Bloom Radius +</text> + +<slider +name="MPBloomRadiusCtrl" +control_name="MPBloomBlurRadius" +decimal_digits="2" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="150" +top_delta="-1" +increment="0.01" +initial_value="1.0" +label_width="2" +min_val="0.0" +max_val="3.0" +> +</slider> + +<icon +name="mp_bloomr_bullet" +tool_tip="No performance impact" +image_name="mp_blue_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_bloomr_info_bullet" +tool_tip="Adjust the base radius of the effect" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="bloom_radiusadd_lbl" +tool_tip="Bloom Radius addition" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="10" +font="SansSerifSmall" +> +Bloom Radius addition +</text> + +<slider +name="MPBloomRadiusAddCtrl" +control_name="MPBloomBlurRadiusAdd" +decimal_digits="2" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="150" +top_delta="-1" +increment="0.01" +initial_value="1.0" +label_width="2" +min_val="-3.0" +max_val="3.0" +> +</slider> + +<icon +name="mp_bloomra_bullet" +tool_tip="No performance impact" +image_name="mp_blue_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_bloomra_info_bullet" +tool_tip="Adjust the added radius for each iteration" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="bloom_extract_lbl" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="10" +font="SansSerifSmall" +> +Bloom Range +</text> + +<slider +name="MPBloomRangeCtrl" +control_name="MPBloomExtractBrightness" +decimal_digits="2" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="150" +top_delta="-1" +increment="0.025" +initial_value="0.1" +label_width="2" +min_val="0.0" +max_val="0.5" +> +</slider> + +<icon +name="mp_bloomrange_bullet" +tool_tip="No performance impact" +image_name="mp_blue_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_bloomrange_info_bullet" +tool_tip="When moved to the right, it will take more of the bright areas." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="bloom_strength_lbl" +tool_tip="Bloom: Strength of the effect (no performance impact)" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="10" +font="SansSerifSmall"> +Bloom Strength +</text> + +<slider +name="MPBloomStrCtrl" +control_name="MPBloomStrength" +decimal_digits="1" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="150" +top_delta="-1" +increment="0.1" +initial_value="1.0" +min_val="0.5" +max_val="2.0" +label_width="2" +> +</slider> + +<icon +name="mp_bloomstr_bullet" +tool_tip="No performance impact" +image_name="mp_blue_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_bloomstr_info_bullet" +tool_tip="Controls the effect strength" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="bloom_metal_lbl" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="10" +font="SansSerifSmall" +> +Bloom Metal +</text> + +<slider +name="MPBloomMetalCtrl" +control_name="MPBloomExtractMetal" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="150" +top_delta="-1" +increment="0.05" +initial_value="0.2" +decimal_digits="2" +min_val="0.0" +max_val="1.0" +label_width="2" +> +</slider> + +<icon +name="mp_bloommetal_bullet" +tool_tip="No performance impact" +image_name="mp_blue_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_bloommetal_info_bullet" +tool_tip="When moved to the right, the effect will apply on more metallic surfaces." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="bloom_nonmetal_lbl" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="10" +font="SansSerifSmall"> +Bloom Non Metal +</text> + +<slider +name="MPBloomNonMetalCtrl" +control_name="MPBloomExtractNonMetal" +layout="topleft" +follows="left|top" +width="200" +height="16" +left_delta="150" +top_delta="-1" +increment="0.05" +initial_value="0.2" +label_width="2" +decimal_digits="2" +min_val="0.0" +max_val="1.0" +> +</slider> + +<icon +name="mp_bloomnonmet_bullet" +tool_tip="No performance impact" +image_name="mp_blue_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_bloomnonmet_info_bullet" +tool_tip="When moved to the right, the effect will apply on more non-metallic surfaces." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +</panel> + +<panel +name="preferences_visuals_probes" +label="Probes" +layout="topleft" +follows="top|left" +> + +<text +name="mp_probes_lbl" +follows="left|top" +layout="topleft" +width="100" +height="18" +left="20" +top_pad="20" +font="SansSerifSmall" +text_color="White" +> +Reflection Probes +</text> + +<icon +name="mp_probedetail_info_bullet" +tool_tip="Reflection probes are a fundamental part of how pbr lighting is calculated" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="probes_detail_lbl" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="10" +font="SansSerifSmall" +> +Reflection Detail: +</text> + +<combo_box +name="mp_probes_detail_ctrl" +control_name="RenderReflectionProbeDetail" +layout="topleft" +width="150" +height="18" +left_delta="150" +top_delta="0" +> +<combo_box.item +label="Static Only" +name="0" +value="0"/> +<combo_box.item +label="Static+Dynamic" +name="1" +value="1"/> +<combo_box.item +label="Realtime" +name="2" +value="2"/> +</combo_box> + +<icon +name="mp_probedetail_bullet" +tool_tip="High to extreme performance impact" +image_name="mp_red_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="55" +top_delta="-2" +/> + +<icon +name="mp_probedetail_info_bullet" +tool_tip="Controls how often the reflection probes update with the surrounding. We recommend Static Only for daily usage (specially on Mac)" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="probes_coverage_lbl" +tool_tip="Reflection probes level (Important memory usage and performance penalty)" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="10" +font="SansSerifSmall" +> +Reflection Coverage: +</text> + +<combo_box +name="probes_level_ctrl" +control_name="RenderReflectionProbeLevel" +layout="topleft" +width="150" +height="18" +left_delta="150" +top_delta="0" +> +<combo_box.item +label="None" +name="0" +value="0"/> +<combo_box.item +label="Manual only" +name="1" +value="1"/> +<combo_box.item +label="Manual + terrain" +name="2" +value="2"/> +<combo_box.item +label="Full scene" +name="3" +value="3"/> +</combo_box> + +<icon +name="mp_probedetail_bullet" +tool_tip="Medium to High performance impact" +image_name="mp_yellow_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="55" +top_delta="-2" +/> + +<icon +name="mp_probedetail_info_bullet" +tool_tip="Controls what part of the surrounding the reflections probes are capturing. We recommend Manual only." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="probes_count_lbl" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="10" +font="SansSerifSmall" +> +Max Reflection Probes: +</text> + +<combo_box +name="mp_probes_count_ctrl" +control_name="RenderReflectionProbeCount" +label="Max. Reflection Probes:" +layout="topleft" +width="150" +height="18" +left_delta="150" +top_delta="0" +> +<combo_box.item +label="None" +name="1" +value="1"/> +<combo_box.item +label="Low" +name="32" +value="32"/> +<combo_box.item +label="Medium" +name="64" +value="64"/> +<combo_box.item +label="High" +name="128" +value="128"/> +<combo_box.item +label="Ultra" +name="256" +value="256"/> +</combo_box> + +<icon +name="mp_probecount_bullet" +tool_tip="Medium to High performance and memory usage impact" +image_name="mp_yellow_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="55" +top_delta="-2" +/> + +<icon +name="mp_probecount_info_bullet" +tool_tip="Limits the maximum number of active reflections probes" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="probes_res_lbl" +tool_tip="Sets the resolution used to calculate the probes (Important to extreme video memory impact and performance)" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="10" +font="SansSerifSmall" +> +Reflection Resolution: +</text> + +<combo_box +name="ProbeResCtrl" +control_name="RenderReflectionProbeResolution" +layout="topleft" +width="150" +height="18" +left_delta="150" +top_delta="0" +> +<combo_box.item +label="Low" +name="low" +value="64"/> +<combo_box.item +label="Default" +name="default" +value="128"/> +<combo_box.item +label="High" +name="high" +value="256"/> +<combo_box.item +label="Maximum" +name="maximum" +value="512"/> +</combo_box> + +<icon +name="mp_proberes_bullet" +tool_tip="Medium to Extreme performance and memory usage impact" +image_name="mp_red_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="55" +top_delta="-2" +/> + +<icon +name="mp_proberes_info_bullet" +tool_tip="Improves the quality of the probes" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="mp_probe_dd_lbl" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="10" +font="SansSerifSmall" +> +Draw Distance +</text> + +<slider +control_name="RenderReflectionProbeDrawDistance" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="150" +top_delta="-1" +initial_value="32" +min_val="8" +max_val="64" +increment="8" +decimal_digits="0" +label_width="2"> +</slider> + +<icon +name="mp_probedd_bullet" +tool_tip="Medium to High performance impact" +image_name="mp_yellow_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_probedd_info_bullet" +tool_tip="Controls the draw distance at which the probes are calculating the surrounding" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="mp_probe_ud_lbl" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="10" +font="SansSerifSmall" +> +Default Probe Update +</text> + +<slider +control_name="RenderDefaultProbeUpdatePeriod" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="150" +top_delta="-1" +initial_value="15" +increment="1" +min_val="2" +max_val="60" +decimal_digits="0" +label_width="2" +> +</slider> + +<icon +name="mp_dprobeperiod_bullet" +tool_tip="When moved to the right, the performance will improve." +image_name="mp_green_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_dprobeperiod_info_bullet" +tool_tip="Controls how the default probe update is delayed." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="mp_probe_ud_lbl" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="10" +font="SansSerifSmall" +> +Other Probes delay +</text> + +<slider +name="MPProbeUpdCtrl" +control_name="MPRenderProbeUpdatePeriod" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="150" +top_delta="-1" +initial_value="15" +increment="1" +min_val="0" +max_val="60" +decimal_digits="0" +label_width="2" +> +</slider> + +<icon +name="mp_probeperiod_bullet" +tool_tip="When moved to the right, the performance will improve." +image_name="mp_green_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_probeperiod_info_bullet" +tool_tip="Controls how each probe update is delayed." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="mp_probe_slow_lbl" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="10" +font="SansSerifSmall" +> +Refresh delay +</text> + +<slider +name="MPProbeSlowCtrl" +control_name="MPRenderProbeSlowDown" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="150" +top_delta="-1" +initial_value="0.01" +increment="0.01" +min_val="0" +max_val="0.2" +decimal_digits="2" +label_width="2"> +</slider> + +<icon +name="mp_probeslowdown_bullet" +tool_tip="When moved to the right, the performance will improve." +image_name="mp_green_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_probeslowdown_info_bullet" +tool_tip="Controls how often the probes update process is called. When moved to the right, the update be slower." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +</panel> + +<panel +label="Quality" +name="preferences_visuals_others" +layout="topleft" +follows="top|left"> + +<check_box +name="VintageCtrl" +control_name="RenderDisableVintageMode" +label="HDR and Emissive" +layout="topleft" +width="250" +height="16" +left="20" +top_delta="32" +initial_value="false" +> +<check_box.commit_callback +function="Pref.RenderOptionUpdate" /> +</check_box> + +<icon +name="mp_hdr_bullet" +tool_tip="Low to Medium performance impact. We recommend it ON, unless you are using a weaker/older computer." +image_name="mp_yellow_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_hdr_info_bullet" +tool_tip="Enables Higher color fidelity, and several other post-processing effects." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<check_box +name="mp_transparent_water" +control_name="RenderTransparentWater" +label="Transparent Water" +layout="topleft" +width="250" +height="16" +left="20" +top_delta="32" +initial_value="true" +> +<check_box.commit_callback +function="Pref.RenderOptionUpdate" /> +</check_box> + +<icon +name="mp_twater_bullet" +tool_tip="Low to Medium performance impact. We recommend it ON, unless you are using a weaker/older computer." +image_name="mp_yellow_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_twater_info_bullet" +tool_tip="Enables higher quality water with transparency." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<check_box +name="colorPrecisionCtrl" +control_name="MPLowColorPrecision" +label="Lower color precision (needs restart)" +layout="topleft" +width="250" +height="16" +left="20" +top_delta="32" +initial_value="false" +> +<check_box.commit_callback +function="Pref.RenderOptionUpdate" /> +</check_box> + +<icon +name="mp_lowcolor_bullet" +tool_tip="Can help performance specially in high resolution" +image_name="mp_green_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_lowcolor_info_bullet" +tool_tip="Lowers the internal color precision which can help with performance." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<text +name="mp_resdiv_lbl" +follows="left|top" +layout="topleft" +width="140" +height="18" +left="32" +top_pad="30" +font="SansSerifSmall" +> +Resolution divisor +</text> + +<slider +control_name="RenderResolutionDivisor" +follows="left|top" +layout="topleft" +width="200" +height="16" +left_delta="150" +top_delta="-1" +initial_value="1.0" +increment="0.25" +min_val="1.0" +max_val="4.0" +decimal_digits="2" +label_width="2"> +</slider> + +</panel> + +<panel +label="For nerds" +name="preferences_visuals_others" +layout="topleft" +follows="top|left"> + +<check_box +name="MultiTexCtrl" +control_name="RenderGLMultiThreadedTextures" +label="Multithreaded Textures" +layout="topleft" +width="250" +height="16" +left="20" +top_delta="32" +initial_value="false" +> +</check_box> + +<icon +name="mp_multitex_bullet" +tool_tip="Improves textures loading performance on certain hardware. But can be unstable." +image_name="mp_yellow_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_multitex_info_bullet" +tool_tip="Enables loading textures using multiple threads." +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<check_box +name="AppleMultGLCtrl" +control_name="RenderAppleUseMultGL" +label="Apple Multithreaded OpenGL" +layout="topleft" +width="250" +height="16" +left="20" +top_delta="32" +initial_value="false" +> +</check_box> + +<icon +name="mp_applemulti_bullet" +tool_tip="Variable performance impact. Can be unstable!" +image_name="mp_yellow_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_applemulti_info_bullet" +tool_tip="Enables Apple OpenGL Multithreaded optimisations. Can be unstable!!" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +<check_box +name="NoGLDebugCtrl" +control_name="MPNoGLDebug" +label="No GL Debug" +layout="topleft" +width="250" +height="16" +left="20" +top_delta="32" +initial_value="true" +> +</check_box> + +<icon +name="mp_nodebug_bullet" +tool_tip="Leave this always to ON for optimal performance" +image_name="mp_yellow_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="-2" +/> + +<icon +name="mp_nodebug_info_bullet" +tool_tip="Ensures there is no opengl debug. This should be set to ON!" +image_name="mp_info_bullet" +follows="left|top" +width="16" +height="16" +layout="topleft" +left_pad="5" +top_delta="0" +/> + +</panel> + +</tab_container> + +</panel>
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_local.xml b/indra/newview/skins/default/xui/en/panel_snapshot_local.xml index 52f9068264..ae203d68de 100644 --- a/indra/newview/skins/default/xui/en/panel_snapshot_local.xml +++ b/indra/newview/skins/default/xui/en/panel_snapshot_local.xml @@ -28,9 +28,9 @@       top_delta="2">          Disk      </text> -    <view_border  +    <view_border       bevel_style="in" -     follows="left|top|right"  +     follows="left|top|right"       height="1"       left="9"       layout="topleft" @@ -74,6 +74,10 @@           label="1600x1200"           name="1600x1200"           value="[i1600,i1200]" /> +         <combo_box.item +         label="2048x2048" +         name="2048x2048" +         value="[i2048,i2048]" />          <combo_box.item           label="Custom"           name="Custom" diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml index 5e05eb2837..3bf402b7fd 100644 --- a/indra/newview/skins/default/xui/en/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml @@ -1,203 +1,209 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <panel - background_opaque="true" - background_visible="true" - bg_opaque_color="DkGray" - chrome="true" - follows="top|right" - height="19" - layout="topleft" - left="0" - mouse_opaque="false" - name="status" - top="19" - width="1000"> -    <panel.string -     name="packet_loss_tooltip"> -        Packet Loss -    </panel.string> -    <panel.string -     name="bandwidth_tooltip"> -        Bandwidth -    </panel.string> -    <panel.string -     name="time"> -        [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] -    </panel.string> -    <panel.string -     name="timeTooltip"> -        [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt] -    </panel.string> -	<panel.string -     name="buycurrencylabel"> -        L$ [AMT] -    </panel.string> -  <panel -	 height="18" -	 left="-398" -	 top="0" -	 width="120" -	 follows="right|top" -	 name="menu_search_panel" -	 background_opaque="true" -	 background_visible="true" -	 bg_opaque_color="MouseGray"> -		<search_editor -		 clear_button_visible="true" -		 follows="left|top" -		 height="18" -		 label="Search Menus" -		 layout="topleft" -		 left="0" -		 max_length_bytes="255" -		 name="search_menu_edit" -		 right="-1" -		 text_pad_left="6" -		 tool_tip="Type the search term you are interested in here. Results will be displayed for partial fulltext matches within the menu." -		 top="0"> -			<search_button  -			 top_pad="4" -			 left_pad="4"  -			 width="12" -			 height="12"  -			 image_unselected="Search" -			 image_selected="Search"/> -			<clear_button -			 bottom="2" -			 height="12" -			 image_unselected="Icon_Close_Foreground" -			 image_selected="Icon_Close_Press" -			 pad_right="4" -			 pad_left="4" -			 width="12"/> -		</search_editor> -  </panel> -  <panel -    height="18" -    left="-398" -    width="185" -    top="1" -    follows="right|top"  -    name="balance_bg"> -    <text -     halign="center" -     font="SansSerifSmall" -     follows="all" -     height="18" -     left="0"  -     name="balance" -     tool_tip="Click to refresh your L$ balance" -     v_pad="4" -     top="0" -     wrap="false"  -     value="L$??"  -     width="40" /> -    <button -     halign="center" -     font="SansSerifSmall" -     follows="right|top|bottom" -     image_hover_unselected="PushButton_Over" -     image_unselected="PushButton_Off" -     image_pressed="PushButton_Press" -     height="18" -     label="Buy L$" -     label_color="White" -     left_pad="0" -     label_shadow="true" -     name="buyL" -     pad_right="0" -     tool_tip="Click to buy more L$" -     top="0" -     width="80" /> -    <button -     halign="left" -     font="SansSerifSmall" -     follows="right|top|bottom" -     imgoverlay_label_space="7" -     image_overlay="Command_MiniCart_Icon" -     image_overlay_alignment="left" -     image_hover_unselected="PushButton_Over" -     image_unselected="PushButton_Off" -     image_pressed="PushButton_Press" -     height="18" -     label="Shop" -     label_color="White" -     left_pad="0" -     label_shadow="true" -     name="goShop" -     tool_tip="Open Second Life Marketplace" -     top="0" -     width="65" /> -  </panel> -    <text -     type="string" -     font="SansSerifSmall" -     text_readonly_color="TimeTextColor" -     follows="right|top" -     halign="right" -     height="16" -     top="5" -     layout="topleft" -     left_pad="0" -     name="TimeText" -     tool_tip="Current time (Pacific)" -     width="85"> -        24:00 AM PST -    </text> -    <icon -     follows="right|top" -     height="16" -     image_name="Cam_FreeCam_Off" -     left_pad="8" -     top="2" -     name="presets_icon_camera" -     width="18" /> -    <icon -     follows="right|top" -     height="13" -     image_name="Presets_Icon" -     left_pad="8" -     top="4" -     name="presets_icon_graphic" -     width="16" /> -    <button -     follows="right|top" -     height="16" -     image_selected="Play_Off" -     image_unselected="Pause_Off" -     image_pressed="Pause_Press" -     image_pressed_selected="Play_Press" -     is_toggle="true" -     left_pad="5" -     top="1" -     name="media_toggle_btn" -     tool_tip="Start/Stop All Media (Music, Video, Web pages)" -     width="16" > -    </button> -    <button -     follows="right|top" -     height="16" -     image_selected="AudioMute_Off" -     image_pressed="Audio_Press" -     image_unselected="Audio_Off" -     is_toggle="true" -     left_pad="5" -     top="2" -     name="volume_btn" -     width="16" /> -     <button -     type="string" -     font="SansSerif" -     label_color="FpsTextColor" -     follows="right|top" -     halign="center" -     valign="center" -     height="18" -     top="1" -     left_pad="4" -     name="FpsText" -     tool_tip="fps" -     width="32"> -     60 -     </button> +background_opaque="true" +background_visible="true" +bg_opaque_color="DkGray" +chrome="true" +follows="top|right" +height="19" +layout="topleft" +left="0" +mouse_opaque="false" +name="status" +top="19" +width="1000"> +   <panel.string +   name="packet_loss_tooltip"> +      Packet Loss +   </panel.string> +   <panel.string +   name="bandwidth_tooltip"> +      Bandwidth +   </panel.string> +   <panel.string +   name="time"> +      [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] +   </panel.string> +   <panel.string +   name="timeTooltip"> +      [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt] +   </panel.string> +<panel.string +   name="buycurrencylabel"> +      L$ [AMT] +   </panel.string> +<panel +   height="18" +   left="-398" +   top="0" +   width="120" +   follows="right|top" +   name="menu_search_panel" +   background_opaque="true" +   background_visible="true" +   bg_opaque_color="MouseGray"> +   <search_editor +      clear_button_visible="true" +      follows="left|top" +      height="18" +      label="Search Menus" +      layout="topleft" +      left="0" +      max_length_bytes="255" +      name="search_menu_edit" +      right="-1" +      text_pad_left="6" +      tool_tip="Type the search term you are interested in here. Results will be displayed for partial fulltext matches within the menu." +      top="0"> +      <search_button +         top_pad="4" +         left_pad="4" +         width="12" +         height="12" +         image_unselected="Search" +         image_selected="Search"/> +      <clear_button +         bottom="2" +         height="12" +         image_unselected="Icon_Close_Foreground" +         image_selected="Icon_Close_Press" +         pad_right="4" +         pad_left="4" +         width="12"/> +   </search_editor> +</panel> +<panel +   height="18" +   left="-398" +   width="185" +   top="1" +   follows="right|top" +   name="balance_bg"> +   <text +   halign="center" +   font="SansSerifSmall" +   follows="all" +   height="18" +   left="0" +   name="balance" +   tool_tip="Click to refresh your L$ balance" +   v_pad="4" +   top="0" +   wrap="false" +   value="L$??" +   width="40" /> +   <button +   halign="center" +   font="SansSerifSmall" +   follows="right|top|bottom" +   image_hover_unselected="PushButton_Over" +   image_unselected="PushButton_Off" +   image_pressed="PushButton_Press" +   height="18" +   label="Buy L$" +   label_color="White" +   left_pad="0" +   label_shadow="true" +   name="buyL" +   pad_right="0" +   tool_tip="Click to buy more L$" +   top="0" +   width="80" /> +   <button +   halign="left" +   font="SansSerifSmall" +   follows="right|top|bottom" +   imgoverlay_label_space="7" +   image_overlay="Command_MiniCart_Icon" +   image_overlay_alignment="left" +   image_hover_unselected="PushButton_Over" +   image_unselected="PushButton_Off" +   image_pressed="PushButton_Press" +   height="18" +   label="Shop" +   label_color="White" +   left_pad="0" +   label_shadow="true" +   name="goShop" +   tool_tip="Open Second Life Marketplace" +   top="0" +   width="65" /> +</panel> +   <text +   type="string" +   font="SansSerifSmall" +   text_readonly_color="TimeTextColor" +   follows="right|top" +   halign="right" +   height="16" +   top="5" +   layout="topleft" +   left_pad="0" +   name="TimeText" +   tool_tip="Current time (Pacific)" +   width="85"> +      24:00 AM PST +   </text> +   <icon +   follows="right|top" +   height="16" +   image_name="Cam_FreeCam_Off" +   left_pad="8" +   top="2" +   name="presets_icon_camera" +   width="18" /> +   <icon +   follows="right|top" +   height="13" +   image_name="Presets_Icon" +   left_pad="8" +   top="4" +   name="presets_icon_graphic" +   width="16" /> +   <button +   follows="right|top" +   height="16" +   image_selected="Play_Off" +   image_unselected="Pause_Off" +   image_pressed="Pause_Press" +   image_pressed_selected="Play_Press" +   is_toggle="true" +   left_pad="5" +   top="1" +   name="media_toggle_btn" +   tool_tip="Start/Stop All Media (Music, Video, Web pages)" +   width="16" > +   </button> +   <button +   follows="right|top" +   height="16" +   image_selected="AudioMute_Off" +   image_pressed="Audio_Press" +   image_unselected="Audio_Off" +   is_toggle="true" +   left_pad="5" +   top="2" +   name="volume_btn" +   width="16" /> +   <button +   type="string" +   font="SansSerif" +   image_unselected="mp_fpsButton" +   image_selected="mp_fpsButton" +   image_hover_unselected="mp_fpsButton" +   image_pressed="mp_fpsButton" +   image_pressed_selected="mp_fpsButton" +   image_color="White" +   label_color="FpsTextColor" +   follows="right|top" +   halign="center" +   valign="center" +   height="18" +   top="1" +   left_pad="2" +   name="FpsText" +   tool_tip="fps: Color indicates frametime fluctuations (Green is optimal)" +   width="32"> +   60 +   </button>  </panel> | 
