diff options
Diffstat (limited to 'indra/llrender')
| -rw-r--r-- | indra/llrender/llfontfreetype.cpp | 201 | ||||
| -rw-r--r-- | indra/llrender/llfontfreetype.h | 23 | ||||
| -rw-r--r-- | indra/llrender/llgl.cpp | 20 | ||||
| -rw-r--r-- | indra/llrender/llglslshader.cpp | 11 | ||||
| -rw-r--r-- | indra/llrender/llglslshader.h | 4 | ||||
| -rw-r--r-- | indra/llrender/llimagegl.cpp | 1 | ||||
| -rw-r--r-- | indra/llrender/llrender.cpp | 77 | ||||
| -rw-r--r-- | indra/llrender/llrender.h | 13 | ||||
| -rw-r--r-- | indra/llrender/llshadermgr.cpp | 2 | ||||
| -rw-r--r-- | indra/llrender/llvertexbuffer.cpp | 8 | ||||
| -rw-r--r-- | indra/llrender/llvertexbuffer.h | 4 | 
11 files changed, 171 insertions, 193 deletions
diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp index 5f04664267..d37b16ce0c 100644 --- a/indra/llrender/llfontfreetype.cpp +++ b/indra/llrender/llfontfreetype.cpp @@ -56,9 +56,9 @@  FT_Render_Mode gFontRenderMode = FT_RENDER_MODE_NORMAL; -LLFontManager *gFontManagerp = NULL; +LLFontManager *gFontManagerp = nullptr; -FT_Library gFTLibrary = NULL; +FT_Library gFTLibrary = nullptr;  //static  void LLFontManager::initClass() @@ -73,7 +73,7 @@ void LLFontManager::initClass()  void LLFontManager::cleanupClass()  {      delete gFontManagerp; -    gFontManagerp = NULL; +    gFontManagerp = nullptr;  }  LLFontManager::LLFontManager() @@ -101,6 +101,7 @@ LLFontManager::LLFontManager()  LLFontManager::~LLFontManager()  {      FT_Done_FreeType(gFTLibrary); +    unloadAllFonts();  } @@ -139,12 +140,8 @@ LLFontFreetype::LLFontFreetype()      mAscender(0.f),      mDescender(0.f),      mLineHeight(0.f), -#ifdef LL_WINDOWS -    pFileStream(NULL), -    pFtStream(NULL), -#endif      mIsFallback(false), -    mFTFace(NULL), +    mFTFace(nullptr),      mRenderGlyphCount(0),      mStyle(0),      mPointSize(0) @@ -157,35 +154,16 @@ LLFontFreetype::~LLFontFreetype()      // Clean up freetype libs.      if (mFTFace)          FT_Done_Face(mFTFace); -    mFTFace = NULL; +    mFTFace = nullptr;      // Delete glyph info      std::for_each(mCharGlyphInfoMap.begin(), mCharGlyphInfoMap.end(), DeletePairedPointer());      mCharGlyphInfoMap.clear(); -#ifdef LL_WINDOWS -    delete pFileStream; // closed by FT_Done_Face -    delete pFtStream; -#endif      delete mFontBitmapCachep;      // mFallbackFonts cleaned up by LLPointer destructor  } -#ifdef LL_WINDOWS -unsigned long ft_read_cb(FT_Stream stream, unsigned long offset, unsigned char *buffer, unsigned long count) { -    if (count <= 0) return count; -    llifstream *file_stream = static_cast<llifstream *>(stream->descriptor.pointer); -    file_stream->seekg(offset, std::ios::beg); -    file_stream->read((char*)buffer, count); -    return (unsigned long)file_stream->gcount(); -} - -void ft_close_cb(FT_Stream stream) { -    llifstream *file_stream = static_cast<llifstream *>(stream->descriptor.pointer); -    file_stream->close(); -} -#endif -  bool LLFontFreetype::loadFace(const std::string& filename, F32 point_size, F32 vert_dpi, F32 horz_dpi, bool is_fallback, S32 face_n)  {      // Don't leak face objects.  This is also needed to deal with @@ -193,26 +171,21 @@ bool LLFontFreetype::loadFace(const std::string& filename, F32 point_size, F32 v      if (mFTFace)      {          FT_Done_Face(mFTFace); -        mFTFace = NULL; +        mFTFace = nullptr;      } -    int error; -#ifdef LL_WINDOWS -    error = ftOpenFace(filename, face_n); -#else -    error = FT_New_Face( gFTLibrary, -                         filename.c_str(), -                         0, -                         &mFTFace); -#endif +    FT_Open_Args openArgs; +    memset( &openArgs, 0, sizeof( openArgs ) ); +    openArgs.memory_base = gFontManagerp->loadFont( filename, openArgs.memory_size ); + +    if( !openArgs.memory_base ) +        return false; + +    openArgs.flags = FT_OPEN_MEMORY; +    int error = FT_Open_Face( gFTLibrary, &openArgs, 0, &mFTFace );      if (error) -    { -#ifdef LL_WINDOWS -        clearFontStreams(); -#endif          return false; -    }      mIsFallback = is_fallback;      F32 pixels_per_em = (point_size / 72.f)*vert_dpi; // Size in inches * dpi @@ -227,10 +200,8 @@ bool LLFontFreetype::loadFace(const std::string& filename, F32 point_size, F32 v      {          // Clean up freetype libs.          FT_Done_Face(mFTFace); -#ifdef LL_WINDOWS -        clearFontStreams(); -#endif -        mFTFace = NULL; + +        mFTFace = nullptr;          return false;      } @@ -286,73 +257,30 @@ S32 LLFontFreetype::getNumFaces(const std::string& filename)      if (mFTFace)      {          FT_Done_Face(mFTFace); -        mFTFace = NULL; +        mFTFace = nullptr;      }      S32 num_faces = 1; -#ifdef LL_WINDOWS -    int error = ftOpenFace(filename, 0); +    FT_Open_Args openArgs; +    memset( &openArgs, 0, sizeof( openArgs ) ); +    openArgs.memory_base = gFontManagerp->loadFont( filename, openArgs.memory_size ); +    if( !openArgs.memory_base ) +        return 0; +    openArgs.flags = FT_OPEN_MEMORY; +    int error = FT_Open_Face( gFTLibrary, &openArgs, 0, &mFTFace );      if (error) -    {          return 0; -    }      else -    {          num_faces = mFTFace->num_faces; -    }      FT_Done_Face(mFTFace); -    clearFontStreams(); -    mFTFace = NULL; -#endif +    mFTFace = nullptr;      return num_faces;  } -#ifdef LL_WINDOWS -S32 LLFontFreetype::ftOpenFace(const std::string& filename, S32 face_n) -{ -    S32 error = -1; -    pFileStream = new llifstream(filename, std::ios::binary); -    if (pFileStream->is_open()) -    { -        std::streampos beg = pFileStream->tellg(); -        pFileStream->seekg(0, std::ios::end); -        std::streampos end = pFileStream->tellg(); -        std::size_t file_size = end - beg; -        pFileStream->seekg(0, std::ios::beg); - -        pFtStream = new LLFT_Stream(); -        pFtStream->base = 0; -        pFtStream->pos = 0; -        pFtStream->size = static_cast<unsigned long>(file_size); -        pFtStream->descriptor.pointer = pFileStream; -        pFtStream->read = ft_read_cb; -        pFtStream->close = ft_close_cb; - -        FT_Open_Args args; -        args.flags = FT_OPEN_STREAM; -        args.stream = (FT_StreamRec*)pFtStream; -        error = FT_Open_Face(gFTLibrary, &args, face_n, &mFTFace); -    } -    return error; -} - -void LLFontFreetype::clearFontStreams() -{ -    if (pFileStream) -    { -        pFileStream->close(); -    } -    delete pFileStream; -    delete pFtStream; -    pFileStream = NULL; -    pFtStream = NULL; -} -#endif -  void LLFontFreetype::addFallbackFont(const LLPointer<LLFontFreetype>& fallback_font,                                       const char_functor_t& functor)  { @@ -376,7 +304,7 @@ F32 LLFontFreetype::getDescenderHeight() const  F32 LLFontFreetype::getXAdvance(llwchar wch) const  { -    if (mFTFace == NULL) +    if (mFTFace == nullptr)          return 0.0;      // Return existing info only if it is current @@ -400,7 +328,7 @@ F32 LLFontFreetype::getXAdvance(llwchar wch) const  F32 LLFontFreetype::getXAdvance(const LLFontGlyphInfo* glyph) const  { -    if (mFTFace == NULL) +    if (mFTFace == nullptr)          return 0.0;      return glyph->mXAdvance; @@ -408,7 +336,7 @@ F32 LLFontFreetype::getXAdvance(const LLFontGlyphInfo* glyph) const  F32 LLFontFreetype::getXKerning(llwchar char_left, llwchar char_right) const  { -    if (mFTFace == NULL) +    if (mFTFace == nullptr)          return 0.0;      //llassert(!mIsFallback); @@ -427,7 +355,7 @@ F32 LLFontFreetype::getXKerning(llwchar char_left, llwchar char_right) const  F32 LLFontFreetype::getXKerning(const LLFontGlyphInfo* left_glyph_info, const LLFontGlyphInfo* right_glyph_info) const  { -    if (mFTFace == NULL) +    if (mFTFace == nullptr)          return 0.0;      U32 left_glyph = left_glyph_info ? left_glyph_info->mGlyphIndex : 0; @@ -450,7 +378,7 @@ LLFontGlyphInfo* LLFontFreetype::addGlyph(llwchar wch, EFontGlyphType glyph_type  {      if (!mFTFace)      { -        return NULL; +        return nullptr;      }      llassert(!mIsFallback); @@ -541,14 +469,14 @@ LLFontGlyphInfo* LLFontFreetype::addGlyph(llwchar wch, EFontGlyphType glyph_type      {          return addGlyphFromFont(this, wch, glyph_index, glyph_type);      } -    return NULL; +    return nullptr;  }  LLFontGlyphInfo* LLFontFreetype::addGlyphFromFont(const LLFontFreetype *fontp, llwchar wch, U32 glyph_index, EFontGlyphType requested_glyph_type) const  {      LL_PROFILE_ZONE_SCOPED; -    if (mFTFace == NULL) -        return NULL; +    if (mFTFace == nullptr) +        return nullptr;      llassert(!mIsFallback);      fontp->renderGlyph(requested_glyph_type, glyph_index, wch); @@ -600,7 +528,7 @@ LLFontGlyphInfo* LLFontFreetype::addGlyphFromFont(const LLFontFreetype *fontp, l      {          U8 *buffer_data = fontp->mFTFace->glyph->bitmap.buffer;          S32 buffer_row_stride = fontp->mFTFace->glyph->bitmap.pitch; -        U8 *tmp_graydata = NULL; +        U8 *tmp_graydata = nullptr;          if (fontp->mFTFace->glyph->bitmap.pixel_mode              == FT_PIXEL_MODE_MONO) @@ -704,7 +632,7 @@ void LLFontFreetype::insertGlyphInfo(llwchar wch, LLFontGlyphInfo* gi) const  void LLFontFreetype::renderGlyph(EFontGlyphType bitmap_type, U32 glyph_index, llwchar wch) const  { -    if (mFTFace == NULL) +    if (mFTFace == nullptr)          return;      FT_Int32 load_flags = FT_LOAD_FORCE_AUTOHINT; @@ -918,3 +846,58 @@ void LLFontFreetype::setSubImageLuminanceAlpha(U32 x, U32 y, U32 bitmap_num, U32      }  } + +namespace ll +{ +    namespace fonts +    { +        class LoadedFont +        { +            public: +            LoadedFont( std::string aName , std::string const &aAddress, std::size_t aSize ) +            : mAddress( aAddress ) +            { +                mName = aName; +                mSize = aSize; +                mRefs = 1; +            } +            std::string mName; +            std::string mAddress; +            std::size_t mSize; +            U32  mRefs; +        }; +    } +} + +U8 const* LLFontManager::loadFont( std::string const &aFilename, long &a_Size) +{ +    a_Size = 0; +    std::map< std::string, std::shared_ptr<ll::fonts::LoadedFont> >::iterator itr = m_LoadedFonts.find( aFilename ); +    if( itr != m_LoadedFonts.end() ) +    { +        ++itr->second->mRefs; +        // A possible overflow cannot happen here, as it is asserted that the size is less than std::numeric_limits<long>::max() a few lines below. +        a_Size = static_cast<long>(itr->second->mSize); +        return reinterpret_cast<U8 const*>(itr->second->mAddress.c_str()); +    } + +    auto strContent = LLFile::getContents(aFilename); + +    if( strContent.empty() ) +        return nullptr; + +    // For fontconfig a type of long is required, std::string::size() returns size_t. I think it is safe to limit this to 2GiB and not support fonts that huge (can that even be a thing?) +    llassert_always( strContent.size() < std::numeric_limits<long>::max() ); + +    a_Size = static_cast<long>(strContent.size()); + +    auto pCache = std::make_shared<ll::fonts::LoadedFont>( aFilename,  strContent, a_Size ); +    itr = m_LoadedFonts.insert( std::make_pair( aFilename, pCache ) ).first; + +    return reinterpret_cast<U8 const*>(itr->second->mAddress.c_str()); +} + +void LLFontManager::unloadAllFonts() +{ +    m_LoadedFonts.clear(); +} diff --git a/indra/llrender/llfontfreetype.h b/indra/llrender/llfontfreetype.h index 783bf4a4b3..a9b3a944ee 100644 --- a/indra/llrender/llfontfreetype.h +++ b/indra/llrender/llfontfreetype.h @@ -43,15 +43,28 @@ typedef struct FT_FaceRec_* LLFT_Face;  struct FT_StreamRec_;  typedef struct FT_StreamRec_ LLFT_Stream; +namespace ll +{ +    namespace fonts +    { +        class LoadedFont; +    } +} +  class LLFontManager  {  public:      static void initClass();      static void cleanupClass(); +    U8 const *loadFont( std::string const &aFilename, long &a_Size ); +  private:      LLFontManager();      ~LLFontManager(); + +    void unloadAllFonts(); +    std::map< std::string, std::shared_ptr<ll::fonts::LoadedFont> > m_LoadedFonts;  };  struct LLFontGlyphInfo @@ -90,11 +103,6 @@ public:      S32 getNumFaces(const std::string& filename); -#ifdef LL_WINDOWS -    S32 ftOpenFace(const std::string& filename, S32 face_n); -    void clearFontStreams(); -#endif -      typedef std::function<bool(llwchar)> char_functor_t;      void addFallbackFont(const LLPointer<LLFontFreetype>& fallback_font, const char_functor_t& functor = nullptr); @@ -170,11 +178,6 @@ private:      LLFT_Face mFTFace; -#ifdef LL_WINDOWS -    llifstream *pFileStream; -    LLFT_Stream *pFtStream; -#endif -      bool mIsFallback;      typedef std::pair<LLPointer<LLFontFreetype>, char_functor_t> fallback_font_t;      typedef std::vector<fallback_font_t> fallback_font_vector_t; diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index 0be27b8975..d13b98e274 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -1123,17 +1123,6 @@ bool LLGLManager::initGL()      if (mGLVersion >= 2.f)      {          parse_glsl_version(mGLSLVersionMajor, mGLSLVersionMinor); - -#if 0 && LL_DARWIN -        // TODO maybe switch to using a core profile for GL 3.2? -        // https://stackoverflow.com/a/19868861 -        //never use GLSL greater than 1.20 on OSX -        if (mGLSLVersionMajor > 1 || mGLSLVersionMinor > 30) -        { -            mGLSLVersionMajor = 1; -            mGLSLVersionMinor = 30; -        } -#endif      }      if (mGLVersion >= 2.1f && LLImageGL::sCompressTextures) @@ -1247,7 +1236,7 @@ bool LLGLManager::initGL()      // there's some implementation that reports a crazy value      mMaxUniformBlockSize = llmin(mMaxUniformBlockSize, 65536); -    if (mGLVersion >= 4.59f) +    if (mHasAnisotropic)      {          glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY, &mMaxAnisotropy);      } @@ -1411,6 +1400,11 @@ void LLGLManager::initExtensions()      mHasCubeMapArray = mGLVersion >= 3.99f;      mHasTransformFeedback = mGLVersion >= 3.99f;      mHasDebugOutput = mGLVersion >= 4.29f; +    mHasAnisotropic = mGLVersion >= 4.59f; +    if(!mHasAnisotropic && gGLHExts.mSysExts) +    { +        mHasAnisotropic = ExtensionExists("GL_EXT_texture_filter_anisotropic", gGLHExts.mSysExts); +    }      // Misc      glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, (GLint*) &mGLMaxVertexRange); @@ -2728,7 +2722,7 @@ void LLGLUserClipPlane::setPlane(F32 a, F32 b, F32 c, F32 d)      if(cplane[2] < 0)          cplane *= -1; -    glm::mat4 suffix; +    glm::mat4 suffix = glm::identity<glm::mat4>();      suffix = glm::row(suffix, 2, cplane);      glm::mat4 newP = suffix * P;      gGL.matrixMode(LLRender::MM_PROJECTION); diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index 3735a99109..9cd5dc8145 100644 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -421,8 +421,11 @@ bool LLGLSLShader::createShader()      llassert_always(!mShaderFiles.empty());  #if LL_DARWIN -    // work-around missing mix(vec3,vec3,bvec3) -    mDefines["OLD_SELECT"] = "1"; +    if(!gGLManager.mIsApple) +    { +        // work-around missing mix(vec3,vec3,bvec3) +        mDefines["OLD_SELECT"] = "1"; +    }  #endif      mShaderHash = hash(); @@ -543,7 +546,7 @@ bool LLGLSLShader::createShader()          }      } -#ifdef LL_PROFILER_ENABLE_RENDER_DOC +#if LL_PROFILER_ENABLE_RENDER_DOC      setLabel(mName.c_str());  #endif @@ -2078,7 +2081,7 @@ LLUUID LLGLSLShader::hash()      return hash_obj.digest();  } -#ifdef LL_PROFILER_ENABLE_RENDER_DOC +#if LL_PROFILER_ENABLE_RENDER_DOC  void LLGLSLShader::setLabel(const char* label) {      LL_LABEL_OBJECT_GL(GL_PROGRAM, mProgramObject, strlen(label), label);  } diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h index 873ab0cff5..4702a27cc5 100644 --- a/indra/llrender/llglslshader.h +++ b/indra/llrender/llglslshader.h @@ -361,7 +361,7 @@ public:      // hacky flag used for optimization in LLDrawPoolAlpha      bool mCanBindFast = false; -#ifdef LL_PROFILER_ENABLE_RENDER_DOC +#if LL_PROFILER_ENABLE_RENDER_DOC      void setLabel(const char* label);  #endif @@ -381,7 +381,7 @@ extern LLGLSLShader         gSolidColorProgram;  //Alpha mask shader (declared here so llappearance can access properly)  extern LLGLSLShader         gAlphaMaskProgram; -#ifdef LL_PROFILER_ENABLE_RENDER_DOC +#if LL_PROFILER_ENABLE_RENDER_DOC  #define LL_SET_SHADER_LABEL(shader) shader.setLabel(#shader)  #else  #define LL_SET_SHADER_LABEL(shader, label) diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index 1db36d91f9..52738ec626 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -338,6 +338,7 @@ S32 LLImageGL::dataFormatBits(S32 dataformat)      case GL_BGRA:                                   return 32;      // Used for QuickTime media textures on the Mac      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; diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index 1dc87a66ce..4f646cdc33 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -118,7 +118,7 @@ static const GLenum sGLBlendFactor[] =  LLTexUnit::LLTexUnit(S32 index)      : mCurrTexType(TT_NONE), -    mCurrColorScale(1), mCurrAlphaScale(1), mCurrTexture(0), +    mCurrTexture(0),      mHasMipMaps(false),      mIndex(index)  { @@ -207,6 +207,12 @@ void LLTexUnit::bindFast(LLTexture* texture)      }      glBindTexture(sGLTextureType[gl_tex->getTarget()], mCurrTexture);      mHasMipMaps = gl_tex->mHasMipMaps; +    if (gl_tex->mTexOptionsDirty) +    { +        gl_tex->mTexOptionsDirty = false; +        setTextureAddressModeFast(gl_tex->mAddressMode); +        setTextureFilteringOptionFast(gl_tex->mFilterOption); +    }  }  bool LLTexUnit::bind(LLTexture* texture, bool for_rendering, bool forceBind) @@ -461,11 +467,16 @@ void LLTexUnit::setTextureAddressMode(eTextureAddressMode mode)      activate(); -    glTexParameteri (sGLTextureType[mCurrTexType], GL_TEXTURE_WRAP_S, sGLAddressMode[mode]); -    glTexParameteri (sGLTextureType[mCurrTexType], GL_TEXTURE_WRAP_T, sGLAddressMode[mode]); +    setTextureAddressModeFast(mode); +} + +void LLTexUnit::setTextureAddressModeFast(eTextureAddressMode mode) +{ +    glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_WRAP_S, sGLAddressMode[mode]); +    glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_WRAP_T, sGLAddressMode[mode]);      if (mCurrTexType == TT_CUBE_MAP)      { -        glTexParameteri (GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, sGLAddressMode[mode]); +        glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, sGLAddressMode[mode]);      }  } @@ -475,6 +486,11 @@ void LLTexUnit::setTextureFilteringOption(LLTexUnit::eTextureFilterOptions optio      gGL.flush(); +    setTextureFilteringOptionFast(option); +} + +void LLTexUnit::setTextureFilteringOptionFast(LLTexUnit::eTextureFilterOptions option) +{      if (option == TFO_POINT)      {          glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_MAG_FILTER, GL_NEAREST); @@ -511,7 +527,7 @@ void LLTexUnit::setTextureFilteringOption(LLTexUnit::eTextureFilterOptions optio          }      } -    if (gGLManager.mGLVersion >= 4.59f) +    if (gGLManager.mHasAnisotropic)      {          if (LLImageGL::sGlobalUseAnisotropic && option == TFO_ANISOTROPIC)          { @@ -600,26 +616,6 @@ GLint LLTexUnit::getTextureSourceType(eTextureBlendSrc src, bool isAlpha)      }  } -void LLTexUnit::setColorScale(S32 scale) -{ -    if (mCurrColorScale != scale || gGL.mDirty) -    { -        mCurrColorScale = scale; -        gGL.flush(); -        glTexEnvi( GL_TEXTURE_ENV, GL_RGB_SCALE, scale ); -    } -} - -void LLTexUnit::setAlphaScale(S32 scale) -{ -    if (mCurrAlphaScale != scale || gGL.mDirty) -    { -        mCurrAlphaScale = scale; -        gGL.flush(); -        glTexEnvi( GL_TEXTURE_ENV, GL_ALPHA_SCALE, scale ); -    } -} -  // Useful for debugging that you've manually assigned a texture operation to the correct  // texture unit based on the currently set active texture in opengl.  void LLTexUnit::debugTextureUnit(void) @@ -1283,9 +1279,7 @@ void LLRender::translateUI(F32 x, F32 y, F32 z)          LL_ERRS() << "Need to push a UI translation frame before offsetting" << LL_ENDL;      } -    mUIOffset.back().mV[0] += x; -    mUIOffset.back().mV[1] += y; -    mUIOffset.back().mV[2] += z; +    mUIOffset.back().add(LLVector4a(x, y, z));  }  void LLRender::scaleUI(F32 x, F32 y, F32 z) @@ -1295,14 +1289,14 @@ void LLRender::scaleUI(F32 x, F32 y, F32 z)          LL_ERRS() << "Need to push a UI transformation frame before scaling." << LL_ENDL;      } -    mUIScale.back().scaleVec(LLVector3(x,y,z)); +    mUIScale.back().mul(LLVector4a(x, y, z));  }  void LLRender::pushUIMatrix()  {      if (mUIOffset.empty())      { -        mUIOffset.emplace_back(0.f,0.f,0.f); +        mUIOffset.emplace_back(0.f);      }      else      { @@ -1311,7 +1305,7 @@ void LLRender::pushUIMatrix()      if (mUIScale.empty())      { -        mUIScale.emplace_back(1.f,1.f,1.f); +        mUIScale.emplace_back(1.f);      }      else      { @@ -1333,18 +1327,20 @@ LLVector3 LLRender::getUITranslation()  {      if (mUIOffset.empty())      { -        return LLVector3(0,0,0); +        return LLVector3::zero;      } -    return mUIOffset.back(); + +    return LLVector3(mUIOffset.back().getF32ptr());  }  LLVector3 LLRender::getUIScale()  {      if (mUIScale.empty())      { -        return LLVector3(1,1,1); +        return LLVector3::all_one;      } -    return mUIScale.back(); + +    return LLVector3(mUIScale.back().getF32ptr());  } @@ -1354,8 +1350,9 @@ void LLRender::loadUIIdentity()      {          LL_ERRS() << "Need to push UI translation frame before clearing offset." << LL_ENDL;      } -    mUIOffset.back().setVec(0,0,0); -    mUIScale.back().setVec(1,1,1); + +    mUIOffset.back().clear(); +    mUIScale.back().splat(1);  }  void LLRender::setColorMask(bool writeColor, bool writeAlpha) @@ -1783,8 +1780,10 @@ void LLRender::vertex3f(const GLfloat& x, const GLfloat& y, const GLfloat& z)      }      else      { -        LLVector3 vert = (LLVector3(x,y,z)+mUIOffset.back()).scaledVec(mUIScale.back()); -        mVerticesp[mCount].set(vert.mV[VX], vert.mV[VY], vert.mV[VZ]); +        LLVector4a vert(x, y, z); +        vert.add(mUIOffset.back()); +        vert.mul(mUIScale.back()); +        mVerticesp[mCount] = vert;      }      mCount++; diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h index 7b6bd4198b..755aee4bd6 100644 --- a/indra/llrender/llrender.h +++ b/indra/llrender/llrender.h @@ -43,6 +43,7 @@  #include "llglheaders.h"  #include "llmatrix4a.h"  #include "glm/mat4x4.hpp" +#include <boost/align/aligned_allocator.hpp>  #include <array>  #include <list> @@ -207,11 +208,15 @@ public:      // Warning: this stays set for the bound texture forever,      // make sure you want to permanently change the address mode  for the bound texture.      void setTextureAddressMode(eTextureAddressMode mode); +    // MUST already be active and bound +    void setTextureAddressModeFast(eTextureAddressMode mode);      // Sets the filtering options used to sample the texture      // Warning: this stays set for the bound texture forever,      // make sure you want to permanently change the filtering for the bound texture.      void setTextureFilteringOption(LLTexUnit::eTextureFilterOptions option); +    // MUST already be active and bound +    void setTextureFilteringOptionFast(LLTexUnit::eTextureFilterOptions option);      static U32 getInternalType(eTextureType type); @@ -227,13 +232,9 @@ protected:      S32                 mIndex;      U32                 mCurrTexture;      eTextureType        mCurrTexType; -    S32                 mCurrColorScale; -    S32                 mCurrAlphaScale;      bool                mHasMipMaps;      void debugTextureUnit(void); -    void setColorScale(S32 scale); -    void setAlphaScale(S32 scale);      GLint getTextureSource(eTextureBlendSrc src);      GLint getTextureSourceType(eTextureBlendSrc src, bool isAlpha = false);  }; @@ -526,8 +527,8 @@ private:      eBlendFactor mCurrBlendAlphaSFactor;      eBlendFactor mCurrBlendAlphaDFactor; -    std::vector<LLVector3> mUIOffset; -    std::vector<LLVector3> mUIScale; +    std::vector<LLVector4a, boost::alignment::aligned_allocator<LLVector4a, 16> > mUIOffset; +    std::vector<LLVector4a, boost::alignment::aligned_allocator<LLVector4a, 16> > mUIScale;  };  extern F32 gGLModelView[16]; diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index 4807c12226..725380b4b2 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -458,7 +458,7 @@ GLuint LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shader_lev  // endsure work-around for missing GLSL funcs gets propogated to feature shader files (e.g. srgbF.glsl)  #if LL_DARWIN -    if (defines) +    if (!gGLManager.mIsApple && defines)      {          (*defines)["OLD_SELECT"] = "1";      } diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index 1f0c424188..d59ddd0fec 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -787,12 +787,6 @@ void LLVertexBuffer::drawElements(U32 mode, const LLVector4a* pos, const LLVecto      gGL.syncMatrices(); -    U32 mask = LLVertexBuffer::MAP_VERTEX; -    if (tc) -    { -        mask = mask | LLVertexBuffer::MAP_TEXCOORD0; -    } -      unbind();      gGL.begin(mode); @@ -885,7 +879,7 @@ bool LLVertexBuffer::validateRange(U32 start, U32 end, U32 count, U32 indices_of      return true;  } -#ifdef LL_PROFILER_ENABLE_RENDER_DOC +#if LL_PROFILER_ENABLE_RENDER_DOC  void LLVertexBuffer::setLabel(const char* label) {      LL_LABEL_OBJECT_GL(GL_BUFFER, mGLBuffer, strlen(label), label);  } diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h index 375ad76fb8..faaa6ba0f0 100644 --- a/indra/llrender/llvertexbuffer.h +++ b/indra/llrender/llvertexbuffer.h @@ -279,7 +279,7 @@ public:      //for debugging, validate data in given range is valid      bool validateRange(U32 start, U32 end, U32 count, U32 offset) const; -    #ifdef LL_PROFILER_ENABLE_RENDER_DOC +    #if LL_PROFILER_ENABLE_RENDER_DOC      void setLabel(const char* label);      #endif @@ -340,7 +340,7 @@ public:      static U32 sVertexCount;  }; -#ifdef LL_PROFILER_ENABLE_RENDER_DOC +#if LL_PROFILER_ENABLE_RENDER_DOC  #define LL_LABEL_VERTEX_BUFFER(buf, name) buf->setLabel(name)  #else  #define LL_LABEL_VERTEX_BUFFER(buf, name)  | 
