diff options
Diffstat (limited to 'indra/llrender')
| -rw-r--r-- | indra/llrender/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | indra/llrender/llcubemap.cpp | 2 | ||||
| -rw-r--r-- | indra/llrender/llcubemaparray.cpp | 2 | ||||
| -rw-r--r-- | indra/llrender/llfontfreetype.cpp | 10 | ||||
| -rw-r--r-- | indra/llrender/llfontfreetypesvg.cpp | 12 | ||||
| -rw-r--r-- | indra/llrender/llfontfreetypesvg.h | 6 | ||||
| -rw-r--r-- | indra/llrender/llfontgl.cpp | 56 | ||||
| -rw-r--r-- | indra/llrender/llfontgl.h | 4 | ||||
| -rw-r--r-- | indra/llrender/llgl.cpp | 70 | ||||
| -rw-r--r-- | indra/llrender/llgl.h | 1 | ||||
| -rw-r--r-- | indra/llrender/llglheaders.h | 40 | ||||
| -rw-r--r-- | indra/llrender/llglslshader.cpp | 45 | ||||
| -rw-r--r-- | indra/llrender/llglstates.h | 2 | ||||
| -rw-r--r-- | indra/llrender/llimagegl.cpp | 117 | ||||
| -rw-r--r-- | indra/llrender/llpostprocess.cpp | 12 | ||||
| -rw-r--r-- | indra/llrender/llrender.cpp | 127 | ||||
| -rw-r--r-- | indra/llrender/llrender.h | 29 | ||||
| -rw-r--r-- | indra/llrender/llrender2dutils.cpp | 461 | ||||
| -rw-r--r-- | indra/llrender/llrendertarget.cpp | 5 | ||||
| -rw-r--r-- | indra/llrender/llvertexbuffer.cpp | 226 | ||||
| -rw-r--r-- | indra/llrender/llvertexbuffer.h | 4 | 
21 files changed, 931 insertions, 301 deletions
diff --git a/indra/llrender/CMakeLists.txt b/indra/llrender/CMakeLists.txt index 7f881c8bb3..7424356057 100644 --- a/indra/llrender/CMakeLists.txt +++ b/indra/llrender/CMakeLists.txt @@ -106,3 +106,4 @@ target_link_libraries(llrender          OpenGL::GLU          ) +include(LibraryInstall) diff --git a/indra/llrender/llcubemap.cpp b/indra/llrender/llcubemap.cpp index 26e4aaad52..53691bafe2 100644 --- a/indra/llrender/llcubemap.cpp +++ b/indra/llrender/llcubemap.cpp @@ -214,7 +214,9 @@ void LLCubeMap::initEnvironmentMap(const std::vector<LLPointer<LLImageRaw> >& ra      enableTexture(0);      bind();      mImages[0]->setFilteringOption(LLTexUnit::TFO_ANISOTROPIC); +#if GL_VERSION_3_2      glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS); +#endif      glGenerateMipmap(GL_TEXTURE_CUBE_MAP);      gGL.getTexUnit(0)->disable();      disable(); diff --git a/indra/llrender/llcubemaparray.cpp b/indra/llrender/llcubemaparray.cpp index be69b997da..0242fe60ce 100644 --- a/indra/llrender/llcubemaparray.cpp +++ b/indra/llrender/llcubemaparray.cpp @@ -134,8 +134,10 @@ void LLCubeMapArray::allocate(U32 resolution, U32 components, U32 count, bool us      while (resolution >= 1)      { +#if GL_VERSION_4_0          glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, mip, format, resolution, resolution, count * 6, 0,              GL_RGBA, GL_UNSIGNED_BYTE, nullptr); +#endif          if (!use_mips)          { diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp index 741ed993b0..9766de1dfa 100644 --- a/indra/llrender/llfontfreetype.cpp +++ b/indra/llrender/llfontfreetype.cpp @@ -52,7 +52,9 @@  #include "llfontbitmapcache.h"  #include "llgl.h" -#define ENABLE_OT_SVG_SUPPORT +#if !defined(LL_NO_OTSVG) +    #define ENABLE_OT_SVG_SUPPORT +#endif  FT_Render_Mode gFontRenderMode = FT_RENDER_MODE_NORMAL; @@ -87,7 +89,7 @@ LLFontManager::LLFontManager()          FT_Done_FreeType(gFTLibrary);      } -#ifdef ENABLE_OT_SVG_SUPPORT +#if defined(ENABLE_OT_SVG_SUPPORT)      SVG_RendererHooks hooks = {          LLFontFreeTypeSvgRenderer::OnInit,          LLFontFreeTypeSvgRenderer::OnFree, @@ -483,8 +485,8 @@ LLFontGlyphInfo* LLFontFreetype::addGlyph(llwchar wch, EFontGlyphType glyph_type                      continue;                  }                  glyph_index = FT_Get_Char_Index(pair.first->mFTFace, wch); -                if (glyph_index) -                { +            if (glyph_index) +            {                      return addGlyphFromFont(pair.first, wch, glyph_index,                                              glyph_type);                  } diff --git a/indra/llrender/llfontfreetypesvg.cpp b/indra/llrender/llfontfreetypesvg.cpp index 355e8432aa..45cbc5dbd7 100644 --- a/indra/llrender/llfontfreetypesvg.cpp +++ b/indra/llrender/llfontfreetypesvg.cpp @@ -34,9 +34,17 @@  #endif  #define NANOSVG_IMPLEMENTATION +#if __FreeBSD__ +#include <nanosvg.h> +#else  #include <nanosvg/nanosvg.h> +#endif  #define NANOSVGRAST_IMPLEMENTATION +#if __FreeBSD__ +#include <nanosvgrast.h> +#else  #include <nanosvg/nanosvgrast.h> +#endif  #if LL_WINDOWS  #pragma warning (pop) @@ -80,6 +88,7 @@ void LLFontFreeTypeSvgRenderer::OnDataFinalizer(void* objectp)  //static  FT_Error LLFontFreeTypeSvgRenderer::OnPresetGlypthSlot(FT_GlyphSlot glyph_slot, FT_Bool cache, FT_Pointer*)  { +#ifndef LL_NO_OTSVG      FT_SVG_Document document = static_cast<FT_SVG_Document>(glyph_slot->other);      llassert(!glyph_slot->generic.data || !cache || glyph_slot->glyph_index == ((LLSvgRenderData*)glyph_slot->generic.data)->GlyphIndex); @@ -166,6 +175,9 @@ FT_Error LLFontFreeTypeSvgRenderer::OnPresetGlypthSlot(FT_GlyphSlot glyph_slot,      }      return FT_Err_Ok; +#else +    return FT_Err_Unimplemented_Feature; +#endif  }  // static diff --git a/indra/llrender/llfontfreetypesvg.h b/indra/llrender/llfontfreetypesvg.h index 4170cab273..94b83d5fff 100644 --- a/indra/llrender/llfontfreetypesvg.h +++ b/indra/llrender/llfontfreetypesvg.h @@ -29,7 +29,11 @@  #include <ft2build.h>  #include FT_TYPES_H  #include FT_MODULE_H -#include FT_OTSVG_H +#ifdef FT_OTSVG_H +    #include FT_OTSVG_H +#else +   #define LL_NO_OTSVG +#endif   // See https://freetype.org/freetype2/docs/reference/ft2-svg_fonts.html  class LLFontFreeTypeSvgRenderer diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp index 59ee8ef84f..9482987970 100644 --- a/indra/llrender/llfontgl.cpp +++ b/indra/llrender/llfontgl.cpp @@ -270,10 +270,10 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons      const LLFontGlyphInfo* next_glyph = NULL; -    const S32 GLYPH_BATCH_SIZE = 30; -    LLVector3 vertices[GLYPH_BATCH_SIZE * 4]; -    LLVector2 uvs[GLYPH_BATCH_SIZE * 4]; -    LLColor4U colors[GLYPH_BATCH_SIZE * 4]; +    const S32 GLYPH_BATCH_SIZE = 120; +    LLVector4a vertices[GLYPH_BATCH_SIZE * 6]; +    LLVector2 uvs[GLYPH_BATCH_SIZE * 6]; +    LLColor4U colors[GLYPH_BATCH_SIZE * 6];      LLColor4U text_color(color);      // Preserve the transparency to render fading emojis in fading text (e.g. @@ -305,9 +305,9 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons              // otherwise the queued glyphs will be taken from wrong textures.              if (glyph_count > 0)              { -                gGL.begin(LLRender::QUADS); +                gGL.begin(LLRender::TRIANGLES);                  { -                    gGL.vertexBatchPreTransformed(vertices, uvs, colors, glyph_count * 4); +                    gGL.vertexBatchPreTransformed(vertices, uvs, colors, glyph_count * 6);                  }                  gGL.end();                  glyph_count = 0; @@ -338,12 +338,11 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons          if (glyph_count >= GLYPH_BATCH_SIZE)          { -            gGL.begin(LLRender::QUADS); +            gGL.begin(LLRender::TRIANGLES);              { -                gGL.vertexBatchPreTransformed(vertices, uvs, colors, glyph_count * 4); +                gGL.vertexBatchPreTransformed(vertices, uvs, colors, glyph_count * 6);              }              gGL.end(); -              glyph_count = 0;          } @@ -376,9 +375,9 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons          cur_render_y = cur_y;      } -    gGL.begin(LLRender::QUADS); +    gGL.begin(LLRender::TRIANGLES);      { -        gGL.vertexBatchPreTransformed(vertices, uvs, colors, glyph_count * 4); +        gGL.vertexBatchPreTransformed(vertices, uvs, colors, glyph_count * 6);      }      gGL.end(); @@ -1226,31 +1225,42 @@ LLFontGL &LLFontGL::operator=(const LLFontGL &source)      return *this;  } -void LLFontGL::renderQuad(LLVector3* vertex_out, LLVector2* uv_out, LLColor4U* colors_out, const LLRectf& screen_rect, const LLRectf& uv_rect, const LLColor4U& color, F32 slant_amt) const +void LLFontGL::renderTriangle(LLVector4a* vertex_out, LLVector2* uv_out, LLColor4U* colors_out, const LLRectf& screen_rect, const LLRectf& uv_rect, const LLColor4U& color, F32 slant_amt) const  {      S32 index = 0; -    vertex_out[index] = LLVector3(screen_rect.mRight, screen_rect.mTop, 0.f); +    vertex_out[index] = LLVector4a(screen_rect.mRight, screen_rect.mTop, 0.f);      uv_out[index] = LLVector2(uv_rect.mRight, uv_rect.mTop);      colors_out[index] = color;      index++; -    vertex_out[index] = LLVector3(screen_rect.mLeft, screen_rect.mTop, 0.f); +    vertex_out[index] = LLVector4a(screen_rect.mLeft, screen_rect.mTop, 0.f);      uv_out[index] = LLVector2(uv_rect.mLeft, uv_rect.mTop);      colors_out[index] = color;      index++; -    vertex_out[index] = LLVector3(screen_rect.mLeft, screen_rect.mBottom, 0.f); +    vertex_out[index] = LLVector4a(screen_rect.mLeft, screen_rect.mBottom, 0.f); +    uv_out[index] = LLVector2(uv_rect.mLeft, uv_rect.mBottom); +    colors_out[index] = color; +    index++; + + +    vertex_out[index] = LLVector4a(screen_rect.mRight, screen_rect.mTop, 0.f); +    uv_out[index] = LLVector2(uv_rect.mRight, uv_rect.mTop); +    colors_out[index] = color; +    index++; + +    vertex_out[index] = LLVector4a(screen_rect.mLeft, screen_rect.mBottom, 0.f);      uv_out[index] = LLVector2(uv_rect.mLeft, uv_rect.mBottom);      colors_out[index] = color;      index++; -    vertex_out[index] = LLVector3(screen_rect.mRight, screen_rect.mBottom, 0.f); +    vertex_out[index] = LLVector4a(screen_rect.mRight, screen_rect.mBottom, 0.f);      uv_out[index] = LLVector2(uv_rect.mRight, uv_rect.mBottom);      colors_out[index] = color;  } -void LLFontGL::drawGlyph(S32& glyph_count, LLVector3* vertex_out, LLVector2* uv_out, LLColor4U* colors_out, const LLRectf& screen_rect, const LLRectf& uv_rect, const LLColor4U& color, U8 style, ShadowType shadow, F32 drop_shadow_strength) const +void LLFontGL::drawGlyph(S32& glyph_count, LLVector4a* vertex_out, LLVector2* uv_out, LLColor4U* colors_out, const LLRectf& screen_rect, const LLRectf& uv_rect, const LLColor4U& color, U8 style, ShadowType shadow, F32 drop_shadow_strength) const  {      F32 slant_offset;      slant_offset = ((style & ITALIC) ? ( -mFontFreetype->getAscenderHeight() * 0.2f) : 0.f); @@ -1264,7 +1274,7 @@ void LLFontGL::drawGlyph(S32& glyph_count, LLVector3* vertex_out, LLVector2* uv_              LLRectf screen_rect_offset = screen_rect;              screen_rect_offset.translate((F32)(pass * BOLD_OFFSET), 0.f); -            renderQuad(&vertex_out[glyph_count * 4], &uv_out[glyph_count * 4], &colors_out[glyph_count * 4], screen_rect_offset, uv_rect, color, slant_offset); +            renderTriangle(&vertex_out[glyph_count * 6], &uv_out[glyph_count * 6], &colors_out[glyph_count * 6], screen_rect_offset, uv_rect, color, slant_offset);              glyph_count++;          }      } @@ -1295,10 +1305,10 @@ void LLFontGL::drawGlyph(S32& glyph_count, LLVector3* vertex_out, LLVector2* uv_                  break;              } -            renderQuad(&vertex_out[glyph_count * 4], &uv_out[glyph_count * 4], &colors_out[glyph_count * 4], screen_rect_offset, uv_rect, shadow_color, slant_offset); +            renderTriangle(&vertex_out[glyph_count * 6], &uv_out[glyph_count * 6], &colors_out[glyph_count * 6], screen_rect_offset, uv_rect, shadow_color, slant_offset);              glyph_count++;          } -        renderQuad(&vertex_out[glyph_count * 4], &uv_out[glyph_count * 4], &colors_out[glyph_count * 4], screen_rect, uv_rect, color, slant_offset); +        renderTriangle(&vertex_out[glyph_count * 6], &uv_out[glyph_count * 6], &colors_out[glyph_count * 6], screen_rect, uv_rect, color, slant_offset);          glyph_count++;      }      else if (shadow == DROP_SHADOW) @@ -1307,14 +1317,14 @@ void LLFontGL::drawGlyph(S32& glyph_count, LLVector3* vertex_out, LLVector2* uv_          shadow_color.mV[VALPHA] = U8(color.mV[VALPHA] * drop_shadow_strength);          LLRectf screen_rect_shadow = screen_rect;          screen_rect_shadow.translate(1.f, -1.f); -        renderQuad(&vertex_out[glyph_count * 4], &uv_out[glyph_count * 4], &colors_out[glyph_count * 4], screen_rect_shadow, uv_rect, shadow_color, slant_offset); +        renderTriangle(&vertex_out[glyph_count * 6], &uv_out[glyph_count * 6], &colors_out[glyph_count * 6], screen_rect_shadow, uv_rect, shadow_color, slant_offset);          glyph_count++; -        renderQuad(&vertex_out[glyph_count * 4], &uv_out[glyph_count * 4], &colors_out[glyph_count * 4], screen_rect, uv_rect, color, slant_offset); +        renderTriangle(&vertex_out[glyph_count * 6], &uv_out[glyph_count * 6], &colors_out[glyph_count * 6], screen_rect, uv_rect, color, slant_offset);          glyph_count++;      }      else // normal rendering      { -        renderQuad(&vertex_out[glyph_count * 4], &uv_out[glyph_count * 4], &colors_out[glyph_count * 4], screen_rect, uv_rect, color, slant_offset); +        renderTriangle(&vertex_out[glyph_count * 6], &uv_out[glyph_count * 6], &colors_out[glyph_count * 6], screen_rect, uv_rect, color, slant_offset);          glyph_count++;      }  } diff --git a/indra/llrender/llfontgl.h b/indra/llrender/llfontgl.h index de7529a583..4bb6c55c65 100644 --- a/indra/llrender/llfontgl.h +++ b/indra/llrender/llfontgl.h @@ -238,8 +238,8 @@ private:      LLFontDescriptor mFontDescriptor;      LLPointer<LLFontFreetype> mFontFreetype; -    void renderQuad(LLVector3* vertex_out, LLVector2* uv_out, LLColor4U* colors_out, const LLRectf& screen_rect, const LLRectf& uv_rect, const LLColor4U& color, F32 slant_amt) const; -    void drawGlyph(S32& glyph_count, LLVector3* vertex_out, LLVector2* uv_out, LLColor4U* colors_out, const LLRectf& screen_rect, const LLRectf& uv_rect, const LLColor4U& color, U8 style, ShadowType shadow, F32 drop_shadow_fade) const; +    void renderTriangle(LLVector4a* vertex_out, LLVector2* uv_out, LLColor4U* colors_out, const LLRectf& screen_rect, const LLRectf& uv_rect, const LLColor4U& color, F32 slant_amt) const; +    void drawGlyph(S32& glyph_count, LLVector4a* vertex_out, LLVector2* uv_out, LLColor4U* colors_out, const LLRectf& screen_rect, const LLRectf& uv_rect, const LLColor4U& color, U8 style, ShadowType shadow, F32 drop_shadow_fade) const;      // Registry holds all instantiated fonts.      static LLFontRegistry* sFontRegistry; diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index 7959b3bb57..2a7cc3d141 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -50,6 +50,11 @@  #include "llglheaders.h"  #include "llglslshader.h" +#include "llvertexbuffer.h" +#include "llcontrol.h" +extern LLControlGroup gSavedSettings; + +  #if LL_WINDOWS  #include "lldxhardware.h"  #endif @@ -72,7 +77,7 @@ static const std::string HEADLESS_VERSION_STRING("1.0");  llofstream gFailLog; -#if GL_ARB_debug_output +#if GL_ARB_debug_output || GL_KHR_debug  #ifndef APIENTRY  #define APIENTRY @@ -95,9 +100,9 @@ void APIENTRY gl_debug_callback(GLenum source,      }*/      if (gGLManager.mIsDisabled && -        severity == GL_DEBUG_SEVERITY_HIGH_ARB && -        source == GL_DEBUG_SOURCE_API_ARB && -        type == GL_DEBUG_TYPE_ERROR_ARB && +        severity == GL_DEBUG_SEVERITY_HIGH && +        source == GL_DEBUG_SOURCE_API && +        type == GL_DEBUG_TYPE_ERROR &&          id == GL_INVALID_VALUE)      {          // Suppress messages about deleting already deleted objects called from LLViewerWindow::stopGL() @@ -157,7 +162,11 @@ void APIENTRY gl_debug_callback(GLenum source,      if (ubo != 0)      {          glGetBufferParameteriv(GL_UNIFORM_BUFFER, GL_BUFFER_SIZE, &ubo_size); +#if GL_EXT_buffer_storage +        glGetBufferParameteriv(GL_UNIFORM_BUFFER, GL_BUFFER_IMMUTABLE_STORAGE_EXT, &ubo_immutable); +#else          glGetBufferParameteriv(GL_UNIFORM_BUFFER, GL_BUFFER_IMMUTABLE_STORAGE, &ubo_immutable); +#endif      }      // No needs to halt when is called from LLViewerWindow::stopGL() @@ -211,8 +220,6 @@ LLMatrix4 gGLObliqueProjectionInverse;  std::list<LLGLUpdate*> LLGLUpdate::sGLQ; -#if (LL_WINDOWS || LL_LINUX)  && !LL_MESA_HEADLESS -  #if LL_WINDOWS  // WGL_ARB_create_context  PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB = nullptr; @@ -232,7 +239,7 @@ PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC             wglBlitContextFramebufferAMD = n  PFNWGLSWAPINTERVALEXTPROC    wglSwapIntervalEXT = nullptr;  PFNWGLGETSWAPINTERVALEXTPROC wglGetSwapIntervalEXT = nullptr; -#endif +/*  // GL_VERSION_1_2  //PFNGLDRAWRANGEELEMENTSPROC  glDrawRangeElements = nullptr; @@ -978,6 +985,7 @@ PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC    glMultiDrawArraysIndirectCount = nullpt  PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC  glMultiDrawElementsIndirectCount = nullptr;  PFNGLPOLYGONOFFSETCLAMPPROC              glPolygonOffsetClamp = nullptr; +*/  #endif  LLGLManager gGLManager; @@ -994,6 +1002,7 @@ LLGLManager::LLGLManager() :      mIsAMD(false),      mIsNVIDIA(false),      mIsIntel(false), +    mIsApple(false),  #if LL_DARWIN      mIsMobileGF(false),  #endif @@ -1131,6 +1140,7 @@ bool LLGLManager::initGL()  #endif      } +#if GL_VERSION_1_3      if (mGLVersion >= 2.1f && LLImageGL::sCompressTextures)      { //use texture compression          glHint(GL_TEXTURE_COMPRESSION_HINT, GL_NICEST); @@ -1139,6 +1149,7 @@ bool LLGLManager::initGL()      { //GL version is < 3.0, always disable texture compression          LLImageGL::sCompressTextures = false;      } +#endif      // Trailing space necessary to keep "nVidia Corpor_ati_on" cards      // from being recognized as ATI. @@ -1155,7 +1166,7 @@ bool LLGLManager::initGL()          mIsNVIDIA = true;      }      else if (mGLVendor.find("INTEL") != std::string::npos -#if LL_LINUX +#if LL_LINUX || __FreeBSD__           // The Mesa-based drivers put this in the Renderer string,           // not the Vendor string.           || mGLRenderer.find("INTEL") != std::string::npos @@ -1165,6 +1176,11 @@ bool LLGLManager::initGL()          mGLVendorShort = "INTEL";          mIsIntel = true;      } +    else if(mGLVendor.find("APPLE") != std::string::npos) +    { +        mGLVendorShort = "APPLE"; +        mIsApple = TRUE; +    }      else      {          mGLVendorShort = "MISC"; @@ -1233,10 +1249,12 @@ bool LLGLManager::initGL()      }      glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &mNumTextureImageUnits); +#if GL_VERSION_3_2      glGetIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &mMaxColorTextureSamples);      glGetIntegerv(GL_MAX_DEPTH_TEXTURE_SAMPLES, &mMaxDepthTextureSamples);      glGetIntegerv(GL_MAX_INTEGER_SAMPLES, &mMaxIntegerSamples);      glGetIntegerv(GL_MAX_SAMPLE_MASK_WORDS, &mMaxSampleMaskWords); +#endif      glGetIntegerv(GL_MAX_SAMPLES, &mMaxSamples);      glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, &mMaxUniformBlockSize); @@ -1246,11 +1264,23 @@ bool LLGLManager::initGL()      if (mGLVersion >= 4.59f)      { -        glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY, &mMaxAnisotropy); +        glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &mMaxAnisotropy);      }      initGLStates(); +    U32 MPVBufferOptiMode = gSavedSettings.getU32("MPVBufferOptiMode"); +    if (MPVBufferOptiMode == 0) +    { +        if(mIsApple) MPVBufferOptiMode = 2; +        else MPVBufferOptiMode = 1; +        gSavedSettings.setU32("MPVBufferOptiMode",MPVBufferOptiMode); +    } +    LLVertexBuffer::sMappingMode = MPVBufferOptiMode; +    //LLRender::sMappingMode = MPVBufferOptiMode; + +    LL_INFOS() << "milo init sMappingMode " << MPVBufferOptiMode << LL_ENDL; +      return true;  } @@ -1367,6 +1397,7 @@ void LLGLManager::asLLSD(LLSD& info)      info["is_ati"] = mIsAMD;  // note, do not rename is_ati to is_amd without coordinating with DW      info["is_nvidia"] = mIsNVIDIA;      info["is_intel"] = mIsIntel; +    info["is_apple"] = mIsApple;      info["gl_renderer"] = mGLRenderer;  } @@ -1386,6 +1417,9 @@ void LLGLManager::shutdownGL()  void LLGLManager::initExtensions()  { +#if LL_LINUX +    glh_init_extensions(""); +#endif  #if LL_DARWIN      GLint num_extensions = 0;      std::string all_extensions{""}; @@ -1416,10 +1450,10 @@ void LLGLManager::initExtensions()      mInited = true; -#if (LL_WINDOWS || LL_LINUX) && !LL_MESA_HEADLESS +/* +#if LL_WINDOWS      LL_DEBUGS("RenderInit") << "GL Probe: Getting symbols" << LL_ENDL; -#if LL_WINDOWS      // WGL_AMD_gpu_association      wglGetGPUIDsAMD = (PFNWGLGETGPUIDSAMDPROC)GLH_EXT_GET_PROC_ADDRESS("wglGetGPUIDsAMD");      wglGetGPUInfoAMD = (PFNWGLGETGPUINFOAMDPROC)GLH_EXT_GET_PROC_ADDRESS("wglGetGPUInfoAMD"); @@ -1437,8 +1471,6 @@ void LLGLManager::initExtensions()      // WGL_ARB_create_context      wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)GLH_EXT_GET_PROC_ADDRESS("wglCreateContextAttribsARB"); -#endif -      // Load entire OpenGL API through GetProcAddress, leaving sections beyond mGLVersion unloaded @@ -2256,6 +2288,7 @@ void LLGLManager::initExtensions()      glPolygonOffsetClamp = (PFNGLPOLYGONOFFSETCLAMPPROC)GLH_EXT_GET_PROC_ADDRESS("glPolygonOffsetClamp");  #endif +*/  }  void rotate_quat(LLQuaternion& rotation) @@ -2282,12 +2315,14 @@ void log_glerror()      error = glGetError();      while (LL_UNLIKELY(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 ;          }          else +#endif // GLU_VERSION_1_1          {              // gluErrorString returns NULL for some extensions' error codes.              // you'll probably have to grep for the number in glext.h. @@ -2306,6 +2341,7 @@ void do_assert_glerror()      if (LL_UNLIKELY(error))      {          quit = true; +#if GLU_VERSION_1_1          GLubyte const * gl_error_msg = gluErrorString(error);          if (NULL != gl_error_msg)          { @@ -2318,6 +2354,7 @@ void do_assert_glerror()              }          }          else +#endif // GLU_VERSION_1_1          {              // gluErrorString returns NULL for some extensions' error codes.              // you'll probably have to grep for the number in glext.h. @@ -2392,8 +2429,10 @@ void LLGLState::initClass()      // sStateMap[GL_TEXTURE_2D] = GL_TRUE;      //make sure multisample defaults to disabled +#if GL_EXT_multisample || GL_EXT_multisampled_compatibility      sStateMap[GL_MULTISAMPLE] = GL_FALSE;      glDisable(GL_MULTISAMPLE); +#endif  }  //static @@ -2408,6 +2447,7 @@ void LLGLState::restoreGL()  void LLGLState::resetTextureStates()  {      gGL.flush(); +#if GL_VERSION_1_3      GLint maxTextureUnits;      glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &maxTextureUnits); @@ -2417,6 +2457,7 @@ void LLGLState::resetTextureStates()          glClientActiveTexture(GL_TEXTURE0+j);          j == 0 ? gGL.getTexUnit(j)->enable(LLTexUnit::TT_TEXTURE) : gGL.getTexUnit(j)->disable();      } +#endif  }  void LLGLState::dumpStates() @@ -2566,6 +2607,7 @@ void parse_gl_version( S32* major, S32* minor, S32* release, std::string* vendor      {          return;      } +    LL_INFOS() << "GL: "  << version << LL_ENDL;      version_string->assign(version); @@ -2945,5 +2987,3 @@ extern "C"      __declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1;  }  #endif - - diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h index 909dad2e85..a3d87e001c 100644 --- a/indra/llrender/llgl.h +++ b/indra/llrender/llgl.h @@ -101,6 +101,7 @@ public:      bool mIsAMD;      bool mIsNVIDIA;      bool mIsIntel; +    bool mIsApple;  #if LL_DARWIN      // Needed to distinguish problem cards on older Macs that break with Materials diff --git a/indra/llrender/llglheaders.h b/indra/llrender/llglheaders.h index c5e1ff3e23..0e278e1744 100644 --- a/indra/llrender/llglheaders.h +++ b/indra/llrender/llglheaders.h @@ -41,6 +41,22 @@  # include "GL/glh_extensions.h"  # undef __APPLE__ +#elif LL_LINUX || __FreeBSD__ +#define GL_GLEXT_PROTOTYPES +#define GLX_GLEXT_PROTOTYPES + +#include "GL/gl.h" +#include "GL/glext.h" +#include "GL/glu.h" + +// The __APPLE__ kludge is to make glh_extensions.h not symbol-clash horribly +# define __APPLE__ +# include "GL/glh_extensions.h" +# undef __APPLE__ + +# include "GL/glx.h" +# include "GL/glxext.h" +  #elif LL_WINDOWS  //----------------------------------------------------------------------------  // LL_WINDOWS @@ -825,8 +841,12 @@ extern PFNGLPOLYGONOFFSETCLAMPPROC              glPolygonOffsetClamp;  #define GL_GLEXT_PROTOTYPES  #include "GL/glext.h" +#define GL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED +#include <OpenGL/gl3.h> +  #include "GL/glh_extensions.h" +#if 0  // These symbols don't exist on 10.3.9, so they have to be declared weak.  Redeclaring them here fixes the problem.  // Note that they also must not be called on 10.3.9.  This should be taken care of by a runtime check for the existence of the GL extension.  #include <AvailabilityMacros.h> @@ -1028,6 +1048,26 @@ extern void glGetBufferPointervARB (GLenum, GLenum, GLvoid* *);  #endif  #include <OpenGL/gl.h> +#endif // 0 + +#elif LL_LINUX + +#define GL_GLEXT_PROTOTYPES +#define GLX_GLEXT_PROTOTYPES + +#include "GL/gl.h" +#include "GL/glu.h" +#include "GL/glext.h" +#include "GL/glx.h" + +// The __APPLE__ kludge is to make glh_extensions.h not symbol-clash horribly +# define __APPLE__ +# include "GL/glh_extensions.h" +# undef __APPLE__ + +// #include <X11/Xlib.h> +// #include <X11/Xutil.h> +#include "GL/glh_extensions.h"  #endif // LL_MESA / LL_WINDOWS / LL_DARWIN diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index 25e4a88f28..880b491253 100644 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -235,12 +235,18 @@ void LLGLSLShader::placeProfileQuery(bool for_runtime)              glGenQueries(1, &mPrimitivesQuery);          } -        glBeginQuery(GL_TIME_ELAPSED, mTimerQuery); +#if GL_EXT_timer_query || GL_EXT_disjoint_timer_query +        glBeginQuery(GL_TIME_ELAPSED_EXT, mTimerQuery); +#endif          if (!for_runtime)          { +#if GL_VERSION_1_5              glBeginQuery(GL_SAMPLES_PASSED, mSamplesQuery); +#endif +#if GL_VERSION_3_0              glBeginQuery(GL_PRIMITIVES_GENERATED, mPrimitivesQuery); +#endif          }      }  } @@ -251,19 +257,30 @@ bool LLGLSLShader::readProfileQuery(bool for_runtime, bool force_read)      {          if (!mProfilePending)          { -            glEndQuery(GL_TIME_ELAPSED); +#if GL_EXT_timer_query || GL_EXT_disjoint_timer_query +            glEndQuery(GL_TIME_ELAPSED_EXT); +#endif              if (!for_runtime)              { +#if GL_VERSION_1_5                  glEndQuery(GL_SAMPLES_PASSED); +#endif +#if GL_VERSION_3_0                  glEndQuery(GL_PRIMITIVES_GENERATED); +#endif              }              mProfilePending = for_runtime;          }          if (mProfilePending && for_runtime && !force_read)          { +#if GL_ARB_timer_query              GLuint64 result = 0;              glGetQueryObjectui64v(mTimerQuery, GL_QUERY_RESULT_AVAILABLE, &result); +#else +            GLuint result = 0; +            glGetQueryObjectuiv(mTimerQuery, GL_QUERY_RESULT_AVAILABLE, &result); +#endif              if (result != GL_TRUE)              { @@ -271,18 +288,31 @@ bool LLGLSLShader::readProfileQuery(bool for_runtime, bool force_read)              }          } +#if GL_ARB_timer_query          GLuint64 time_elapsed = 0;          glGetQueryObjectui64v(mTimerQuery, GL_QUERY_RESULT, &time_elapsed); +#else +        GLuint time_elapsed = 0; +        glGetQueryObjectuiv(mTimerQuery, GL_QUERY_RESULT, &time_elapsed); +#endif          mTimeElapsed += time_elapsed;          mProfilePending = false;          if (!for_runtime)          { +#if GL_ARB_timer_query              GLuint64 samples_passed = 0;              glGetQueryObjectui64v(mSamplesQuery, GL_QUERY_RESULT, &samples_passed);              GLuint64 primitives_generated = 0;              glGetQueryObjectui64v(mPrimitivesQuery, GL_QUERY_RESULT, &primitives_generated); +#else +            GLuint samples_passed = 0; +            glGetQueryObjectuiv(mSamplesQuery, GL_QUERY_RESULT, &samples_passed); + +            GLuint primitives_generated = 0; +            glGetQueryObjectuiv(mPrimitivesQuery, GL_QUERY_RESULT, &primitives_generated); +#endif              sTotalTimeElapsed += time_elapsed;              sTotalSamplesDrawn += samples_passed; @@ -701,10 +731,14 @@ void LLGLSLShader::mapUniform(GLint index)          case GL_FLOAT_VEC2: size *= 2; break;          case GL_FLOAT_VEC3: size *= 3; break;          case GL_FLOAT_VEC4: size *= 4; break; +#if GL_VERSION_1_1          case GL_DOUBLE: size *= 2; break; +#if GL_VERSION_4_0          case GL_DOUBLE_VEC2: size *= 2; break;          case GL_DOUBLE_VEC3: size *= 6; break;          case GL_DOUBLE_VEC4: size *= 8; break; +#endif // GL_VERSION_4_0 +#endif // GL_VERSION_1_1          case GL_INT_VEC2: size *= 2; break;          case GL_INT_VEC3: size *= 3; break;          case GL_INT_VEC4: size *= 4; break; @@ -723,6 +757,7 @@ void LLGLSLShader::mapUniform(GLint index)          case GL_FLOAT_MAT3x4: size *= 12; break;          case GL_FLOAT_MAT4x2: size *= 8; break;          case GL_FLOAT_MAT4x3: size *= 12; break; +#if GL_VERSION_4_0          case GL_DOUBLE_MAT2: size *= 8; break;          case GL_DOUBLE_MAT3: size *= 18; break;          case GL_DOUBLE_MAT4: size *= 32; break; @@ -732,6 +767,7 @@ void LLGLSLShader::mapUniform(GLint index)          case GL_DOUBLE_MAT3x4: size *= 24; break;          case GL_DOUBLE_MAT4x2: size *= 16; break;          case GL_DOUBLE_MAT4x3: size *= 24; break; +#endif // GL_VERSION_4_0          }          mTotalUniformSize += size;      } @@ -795,7 +831,10 @@ GLint LLGLSLShader::mapUniformTextureChannel(GLint location, GLenum type, GLint  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_SHADER; -    if ((type >= GL_SAMPLER_1D && type <= GL_SAMPLER_2D_RECT_SHADOW) || +    if ( +#if GL_VERSION_2_0 +    (type >= GL_SAMPLER_1D && type <= GL_SAMPLER_2D_RECT_SHADOW) || +#endif          type == GL_SAMPLER_2D_MULTISAMPLE ||          type == GL_SAMPLER_CUBE_MAP_ARRAY)      {   //this here is a texture diff --git a/indra/llrender/llglstates.h b/indra/llrender/llglstates.h index 9bb980d7ad..68d4df8e90 100644 --- a/indra/llrender/llglstates.h +++ b/indra/llrender/llglstates.h @@ -166,6 +166,7 @@ public:  //---------------------------------------------------------------------------- +#if GL_VERSION_1_1  class LLGLSSpecular  {  public: @@ -190,6 +191,7 @@ public:          }      }  }; +#endif  //---------------------------------------------------------------------------- diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index 7e5cd628c1..fb02c72338 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -273,23 +273,31 @@ S32 LLImageGL::dataFormatBits(S32 dataformat)  {      switch (dataformat)      { +#if GL_EXT_texture_compression_s3tc || GL_EXT_texture_compression_dxt1      case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:          return 4; -    case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:    return 4;      case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:          return 8; -    case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:    return 8;      case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:          return 8; +#endif +#if GL_EXT_texture_sRGB || GL_EXT_texture_compression_s3tc_srgb +    case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:    return 4; +    case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:    return 8;      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:    return 8; +#endif      case GL_LUMINANCE:                              return 8;      case GL_ALPHA:                                  return 8;      case GL_RED:                                    return 8; +#if GL_VERSION_1_1      case GL_COLOR_INDEX:                            return 8; +#endif      case GL_LUMINANCE_ALPHA:                        return 16;      case GL_RGB:                                    return 24;      case GL_SRGB:                                   return 24;      case GL_RGB8:                                   return 24;      case GL_RGBA:                                   return 32; +#if GL_VERSION_2_1      case GL_SRGB_ALPHA:                             return 32;      case GL_BGRA:                                   return 32;      // Used for QuickTime media textures on the Mac +#endif      case GL_DEPTH_COMPONENT:                        return 24;      case GL_RGB16F:                                 return 48;      case GL_RGBA16F:                                return 64; @@ -304,6 +312,8 @@ S64 LLImageGL::dataFormatBytes(S32 dataformat, S32 width, S32 height)  {      switch (dataformat)      { +#if GL_EXT_texture_compression_s3tc || GL_EXT_texture_compression_dxt1 \ +	    || GL_EXT_texture_sRGB || GL_EXT_texture_compression_s3tc_srgb      case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:      case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: @@ -313,6 +323,7 @@ S64 LLImageGL::dataFormatBytes(S32 dataformat, S32 width, S32 height)          if (width < 4) width = 4;          if (height < 4) height = 4;          break; +#endif      default:          break;      } @@ -326,22 +337,30 @@ S32 LLImageGL::dataFormatComponents(S32 dataformat)  {      switch (dataformat)      { +#if GL_EXT_texture_compression_s3tc || GL_EXT_texture_compression_dxt1        case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:    return 3; -      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: return 3;        case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:    return 4; -      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: return 4;        case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:    return 4; +#endif +#if GL_EXT_texture_sRGB || GL_EXT_texture_compression_s3tc_srgb +      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: return 3; +      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: return 4;        case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: return 4; +#endif        case GL_LUMINANCE:                        return 1;        case GL_ALPHA:                            return 1;        case GL_RED:                              return 1; +#if GL_VERSION_1_1        case GL_COLOR_INDEX:                      return 1; +#endif        case GL_LUMINANCE_ALPHA:                  return 2;        case GL_RGB:                              return 3;        case GL_SRGB:                             return 3;        case GL_RGBA:                             return 4; +#if GL_VERSION_2_1        case GL_SRGB_ALPHA:                       return 4;        case GL_BGRA:                             return 4;       // Used for QuickTime media textures on the Mac +#endif        default:          LL_ERRS() << "LLImageGL::Unknown format: " << dataformat << LL_ENDL;          return 0; @@ -795,11 +814,13 @@ bool LLImageGL::setImage(const U8* data_in, bool data_hasmips /* = false */, S32                  }                  else                  { +#if GL_VERSION_1_1                      if(mFormatSwapBytes)                      {                          glPixelStorei(GL_UNPACK_SWAP_BYTES, 1);                          stop_glerror();                      } +#endif                      LLImageGL::setManualImage(mTarget, gl_level, mFormatInternal, w, h, mFormatPrimary, GL_UNSIGNED_BYTE, (GLvoid*)data_in, mAllowCompression);                      if (gl_level == 0) @@ -808,11 +829,13 @@ bool LLImageGL::setImage(const U8* data_in, bool data_hasmips /* = false */, S32                      }                      updatePickMask(w, h, data_in); +#if GL_VERSION_1_1                      if(mFormatSwapBytes)                      {                          glPixelStorei(GL_UNPACK_SWAP_BYTES, 0);                          stop_glerror();                      } +#endif                      stop_glerror();                  } @@ -825,11 +848,13 @@ bool LLImageGL::setImage(const U8* data_in, bool data_hasmips /* = false */, S32              {                  stop_glerror();                  { +#if GL_VERSION_1_1                      if(mFormatSwapBytes)                      {                          glPixelStorei(GL_UNPACK_SWAP_BYTES, 1);                          stop_glerror();                      } +#endif                      S32 w = getWidth(mCurrentDiscardLevel);                      S32 h = getHeight(mCurrentDiscardLevel); @@ -839,10 +864,12 @@ bool LLImageGL::setImage(const U8* data_in, bool data_hasmips /* = false */, S32                      //use legacy mipmap generation mode (note: making this condional can cause rendering issues)                      // -- but making it not conditional triggers deprecation warnings when core profile is enabled                      //      (some rendering issues while core profile is enabled are acceptable at this point in time) +#if GL_VERSION_1_4                      if (!LLRender::sGLCoreProfile)                      {                          glTexParameteri(mTarget, GL_GENERATE_MIPMAP, GL_TRUE);                      } +#endif                      LLImageGL::setManualImage(mTarget, 0, mFormatInternal,                                   w, h, @@ -853,11 +880,13 @@ bool LLImageGL::setImage(const U8* data_in, bool data_hasmips /* = false */, S32                      updatePickMask(w, h, data_in); +#if GL_VERSION_1_1                      if(mFormatSwapBytes)                      {                          glPixelStorei(GL_UNPACK_SWAP_BYTES, 0);                          stop_glerror();                      } +#endif                      if (LLRender::sGLCoreProfile)                      { @@ -942,11 +971,13 @@ bool LLImageGL::setImage(const U8* data_in, bool data_hasmips /* = false */, S32                      llassert(w > 0 && h > 0 && cur_mip_data);                      (void)cur_mip_data;                      { +#if GL_VERSION_1_1                          if(mFormatSwapBytes)                          {                              glPixelStorei(GL_UNPACK_SWAP_BYTES, 1);                              stop_glerror();                          } +#endif                          LLImageGL::setManualImage(mTarget, m, mFormatInternal, w, h, mFormatPrimary, mFormatType, cur_mip_data, mAllowCompression);                          if (m == 0) @@ -959,11 +990,13 @@ bool LLImageGL::setImage(const U8* data_in, bool data_hasmips /* = false */, S32                              updatePickMask(w, h, cur_mip_data);                          } +#if GL_VERSION_1_1                          if(mFormatSwapBytes)                          {                              glPixelStorei(GL_UNPACK_SWAP_BYTES, 0);                              stop_glerror();                          } +#endif                      }                      if (prev_mip_data && prev_mip_data != data_in)                      { @@ -998,11 +1031,13 @@ bool LLImageGL::setImage(const U8* data_in, bool data_hasmips /* = false */, S32          }          else          { +#if GL_VERSION_1_1              if(mFormatSwapBytes)              {                  glPixelStorei(GL_UNPACK_SWAP_BYTES, 1);                  stop_glerror();              } +#endif              LLImageGL::setManualImage(mTarget, 0, mFormatInternal, w, h,                           mFormatPrimary, mFormatType, (GLvoid *)data_in, mAllowCompression); @@ -1012,11 +1047,13 @@ bool LLImageGL::setImage(const U8* data_in, bool data_hasmips /* = false */, S32              stop_glerror(); +#if GL_VERSION_1_1              if(mFormatSwapBytes)              {                  glPixelStorei(GL_UNPACK_SWAP_BYTES, 0);                  stop_glerror();              } +#endif          }      } @@ -1061,13 +1098,17 @@ bool LLImageGL::preAddToAtlas(S32 discard_level, const LLImageRaw* raw_image)          {              case 1:                  // Use luminance alpha (for fonts) +#if GL_VERSION_1_1                  mFormatInternal = GL_LUMINANCE8; +#endif                  mFormatPrimary  = GL_LUMINANCE;                  mFormatType     = GL_UNSIGNED_BYTE;                  break;              case 2:                  // Use luminance alpha (for fonts) +#if GL_VERSION_1_1                  mFormatInternal = GL_LUMINANCE8_ALPHA8; +#endif                  mFormatPrimary  = GL_LUMINANCE_ALPHA;                  mFormatType     = GL_UNSIGNED_BYTE;                  break; @@ -1095,22 +1136,26 @@ bool LLImageGL::preAddToAtlas(S32 discard_level, const LLImageRaw* raw_image)      glPixelStorei(GL_UNPACK_ROW_LENGTH, raw_image->getWidth());      stop_glerror(); +#if GL_VERSION_1_1      if(mFormatSwapBytes)      {          glPixelStorei(GL_UNPACK_SWAP_BYTES, 1);          stop_glerror();      } +#endif      return true ;  }  void LLImageGL::postAddToAtlas()  { +#if GL_VERSION_1_1      if(mFormatSwapBytes)      {          glPixelStorei(GL_UNPACK_SWAP_BYTES, 0);          stop_glerror();      } +#endif      glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);      gGL.getTexUnit(0)->setTextureFilteringOption(mFilterOption); @@ -1124,7 +1169,9 @@ U32 type_width_from_pixtype(U32 pixtype)      {      case GL_UNSIGNED_BYTE:      case GL_BYTE: +#if GL_VERSION_1_2      case GL_UNSIGNED_INT_8_8_8_8_REV: +#endif          type_width = 1;          break;      case GL_UNSIGNED_SHORT: @@ -1239,11 +1286,13 @@ bool LLImageGL::setSubImage(const U8* datap, S32 data_width, S32 data_height, S3          glPixelStorei(GL_UNPACK_ROW_LENGTH, data_width);          stop_glerror(); +#if GL_VERSION_1_1          if(mFormatSwapBytes)          {              glPixelStorei(GL_UNPACK_SWAP_BYTES, 1);              stop_glerror();          } +#endif          const U8* sub_datap = datap + (y_pos * data_width + x_pos) * getComponents();          // Update the GL texture @@ -1267,11 +1316,13 @@ bool LLImageGL::setSubImage(const U8* datap, S32 data_width, S32 data_height, S3          gGL.getTexUnit(0)->disable();          stop_glerror(); +#if GL_VERSION_1_1          if(mFormatSwapBytes)          {              glPixelStorei(GL_UNPACK_SWAP_BYTES, 0);              stop_glerror();          } +#endif          glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);          stop_glerror(); @@ -1439,35 +1490,57 @@ void LLImageGL::setManualImage(U32 target, S32 miplevel, S32 intformat, S32 widt          {          case GL_RGB:          case GL_RGB8: +#if GL_VERSION_1_3              intformat = GL_COMPRESSED_RGB; +#endif              break;          case GL_SRGB:          case GL_SRGB8: +#if GL_VERSION_2_1              intformat = GL_COMPRESSED_SRGB; +#endif              break;          case GL_RGBA:          case GL_RGBA8: +#if GL_VERSION_1_3              intformat = GL_COMPRESSED_RGBA; +#endif              break; -        case GL_SRGB_ALPHA:          case GL_SRGB8_ALPHA8: +#if GL_VERSION_2_1 +        case GL_SRGB_ALPHA:              intformat = GL_COMPRESSED_SRGB_ALPHA; +#endif              break;          case GL_LUMINANCE: +#if GL_VERSION_1_1          case GL_LUMINANCE8: +#endif +#if GL_VERSION_1_3              intformat = GL_COMPRESSED_LUMINANCE; +#endif              break;          case GL_LUMINANCE_ALPHA: +#if GL_VERSION_1_1          case GL_LUMINANCE8_ALPHA8: +#endif +#if GL_VERSION_1_3              intformat = GL_COMPRESSED_LUMINANCE_ALPHA; +#endif              break;          case GL_ALPHA: +#if GL_VERSION_1_1          case GL_ALPHA8: +#endif +#if GL_VERSION_1_3              intformat = GL_COMPRESSED_ALPHA; +#endif              break;          case GL_RED:          case GL_R8: +#if GL_VERSION_3_0              intformat = GL_COMPRESSED_RED; +#endif              break;          default:              LL_WARNS() << "Could not compress format: " << std::hex << intformat << LL_ENDL; @@ -1606,13 +1679,21 @@ bool LLImageGL::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S          {          case 1:              // Use luminance alpha (for fonts) +#if GL_VERSION_1_1              mFormatInternal = GL_LUMINANCE8; +#else +            mFormatInternal = GL_LUMINANCE; +#endif              mFormatPrimary = GL_LUMINANCE;              mFormatType = GL_UNSIGNED_BYTE;              break;          case 2:              // Use luminance alpha (for fonts) +#if GL_VERSION_1_1              mFormatInternal = GL_LUMINANCE8_ALPHA8; +#else +            mFormatInternal = GL_LUMINANCE_ALPHA; +#endif              mFormatPrimary = GL_LUMINANCE_ALPHA;              mFormatType = GL_UNSIGNED_BYTE;              break; @@ -1896,6 +1977,7 @@ bool LLImageGL::readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compre      LLImageDataLock lock(imageraw); +#if GL_VERSION_1_3      if (is_compressed)      {          LLGLint glbytes; @@ -1922,6 +2004,7 @@ bool LLImageGL::readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compre          glGetTexImage(GL_TEXTURE_2D, gl_discard, mFormatPrimary, mFormatType, (GLvoid*)(imageraw->getData()));          //stop_glerror();      } +#endif // GL_VERSION_1_3      //-----------------------------------------------------------------------------------------------      if((error = glGetError()) != GL_NO_ERROR) @@ -2010,11 +2093,13 @@ bool LLImageGL::getIsResident(bool test_now)  {      if (test_now)      { +#if GL_VERSION_1_1          if (mTexName != 0)          {              glAreTexturesResident(1, (GLuint*)&mTexName, &mIsResident);          }          else +#endif          {              mIsResident = false;          } @@ -2144,12 +2229,16 @@ void LLImageGL::calcAlphaChannelOffsetAndStride()          mIsMask = false;          return; //no alpha channel.      case GL_RGBA: +#if GL_VERSION_2_1      case GL_SRGB_ALPHA: +#endif          mAlphaStride = 4;          break; +#if GL_EXT_bgra      case GL_BGRA_EXT:          mAlphaStride = 4;          break; +#endif      default:          break;      } @@ -2159,6 +2248,7 @@ void LLImageGL::calcAlphaChannelOffsetAndStride()      {          mAlphaOffset = mAlphaStride - 1 ;      } +#if GL_VERSION_1_2      else if(is_little_endian())      {          if (mFormatType == GL_UNSIGNED_INT_8_8_8_8) @@ -2181,10 +2271,15 @@ void LLImageGL::calcAlphaChannelOffsetAndStride()              mAlphaOffset = 0 ;          }      } +#endif // GL_VERSION_1_2      if( mAlphaStride < 1 || //unsupported format -        mAlphaOffset < 0 || //unsupported type -        (mFormatPrimary == GL_BGRA_EXT && mFormatType != GL_UNSIGNED_BYTE)) //unknown situation +        mAlphaOffset < 0 //unsupported type +#if GL_EXT_bgra +        || +        (mFormatPrimary == GL_BGRA_EXT && mFormatType != GL_UNSIGNED_BYTE) //unknown situation +#endif +      )      {          LL_WARNS() << "Cannot analyze alpha for image with format type " << std::hex << mFormatType << std::dec << LL_ENDL; @@ -2330,6 +2425,8 @@ bool LLImageGL::isCompressed()      bool is_compressed = false;      switch (mFormatPrimary)      { +#if GL_EXT_texture_compression_s3tc || GL_EXT_texture_compression_dxt1 \ +	    || GL_EXT_texture_sRGB || GL_EXT_texture_compression_s3tc_srgb      case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:      case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: @@ -2338,6 +2435,7 @@ bool LLImageGL::isCompressed()      case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:          is_compressed = true;          break; +#endif      default:          break;      } @@ -2356,7 +2454,10 @@ void LLImageGL::updatePickMask(S32 width, S32 height, const U8* data_in)      if (mFormatType != GL_UNSIGNED_BYTE ||          ((mFormatPrimary != GL_RGBA) -      && (mFormatPrimary != GL_SRGB_ALPHA))) +#if GL_VERSION_2_1 +      && (mFormatPrimary != GL_SRGB_ALPHA) +#endif +      ))      {          //cannot generate a pick mask for this texture          return; diff --git a/indra/llrender/llpostprocess.cpp b/indra/llrender/llpostprocess.cpp index 8ebd09f20d..29ec1408d5 100644 --- a/indra/llrender/llpostprocess.cpp +++ b/indra/llrender/llpostprocess.cpp @@ -296,8 +296,10 @@ void LLPostProcess::getShaderUniforms(glslUniforms & uniforms, GLuint & prog)  void LLPostProcess::doEffects(void)  {      /// Save GL State +#if GL_VERSION_1_1      glPushAttrib(GL_ALL_ATTRIB_BITS);      glPushClientAttrib(GL_ALL_ATTRIB_BITS); +#endif      /// Copy the screen buffer to the render texture      { @@ -322,15 +324,19 @@ void LLPostProcess::doEffects(void)      viewPerspective();      /// Reset GL State +#if GL_VERSION_1_1      glPopClientAttrib();      glPopAttrib(); +#endif      checkError();  }  void LLPostProcess::copyFrameBuffer(U32 & texture, unsigned int width, unsigned int height)  {      gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, texture); +#if GL_VERSION_3_1      glCopyTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_RGBA, 0, 0, width, height, 0); +#endif  }  void LLPostProcess::drawOrthoQuad(unsigned int width, unsigned int height, QuadType type) @@ -371,8 +377,10 @@ void LLPostProcess::createTexture(LLPointer<LLImageGL>& texture, unsigned int wi      if(texture->createGLTexture())      {          gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, texture->getTexName()); +#if GL_VERSION_3_1          glTexImage2D(GL_TEXTURE_RECTANGLE, 0, 4, width, height, 0,              GL_RGBA, GL_UNSIGNED_BYTE, &data[0]); +#endif          gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);          gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);      } @@ -406,18 +414,22 @@ bool LLPostProcess::checkError(void)      while (glErr != GL_NO_ERROR)      {          // shaderErrorLog << (const char *) gluErrorString(glErr) << std::endl; +#if GLU_VERSION_1_1          char const * err_str_raw = (const char *) gluErrorString(glErr);          if(err_str_raw == NULL)          { +#endif              std::ostringstream err_builder;              err_builder << "unknown error number " << glErr;              mShaderErrorString = err_builder.str(); +#if GLU_VERSION_1_1          }          else          {              mShaderErrorString = err_str_raw;          } +#endif          retCode = true;          glErr = glGetError(); diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index a0209fab43..1037fbbfe3 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -50,6 +50,8 @@ extern void APIENTRY gl_debug_callback(GLenum source,  thread_local LLRender gGL; +const U32 BATCH_SIZE = 16334; +  // Handy copies of last good GL matrices  F32 gGLModelView[16];  F32 gGLLastModelView[16]; @@ -66,7 +68,7 @@ S32 gGLViewport[4];  U32 LLRender::sUICalls = 0;  U32 LLRender::sUIVerts = 0;  U32 LLTexUnit::sWhiteTexture = 0; -bool LLRender::sGLCoreProfile = false; +bool LLRender::sGLCoreProfile = true;  bool LLRender::sNsightDebugSupport = false;  LLVector2 LLRender::sUIGLScaleFactor = LLVector2(1.f, 1.f); @@ -81,10 +83,16 @@ static std::unordered_map<U64, LLVBCache> sVBCache;  static const GLenum sGLTextureType[] =  {      GL_TEXTURE_2D, +#if GL_VERSION_3_1      GL_TEXTURE_RECTANGLE, +#endif      GL_TEXTURE_CUBE_MAP, +#if GL_VERSION_4_0      GL_TEXTURE_CUBE_MAP_ARRAY, +#endif +#if GL_VERSION_3_2      GL_TEXTURE_2D_MULTISAMPLE, +#endif      GL_TEXTURE_3D  }; @@ -522,17 +530,18 @@ void LLTexUnit::setTextureFilteringOption(LLTexUnit::eTextureFilterOptions optio      {          if (LLImageGL::sGlobalUseAnisotropic && option == TFO_ANISOTROPIC)          { -            glTexParameterf(sGLTextureType[mCurrTexType], GL_TEXTURE_MAX_ANISOTROPY, gGLManager.mMaxAnisotropy); +            glTexParameterf(sGLTextureType[mCurrTexType], GL_TEXTURE_MAX_ANISOTROPY_EXT, gGLManager.mMaxAnisotropy);          }          else          { -            glTexParameterf(sGLTextureType[mCurrTexType], GL_TEXTURE_MAX_ANISOTROPY, 1.f); +            glTexParameterf(sGLTextureType[mCurrTexType], GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.f);          }      }  }  GLint LLTexUnit::getTextureSource(eTextureBlendSrc src)  { +#if GL_VERSION_1_3      switch(src)      {          // All four cases should return the same value. @@ -547,8 +556,10 @@ GLint LLTexUnit::getTextureSource(eTextureBlendSrc src)          case TBS_TEX_ALPHA:          case TBS_ONE_MINUS_TEX_COLOR:          case TBS_ONE_MINUS_TEX_ALPHA: +#endif              return GL_TEXTURE; +#if GL_VERSION_1_3          // All four cases should return the same value.          case TBS_VERT_COLOR:          case TBS_VERT_ALPHA: @@ -567,6 +578,7 @@ GLint LLTexUnit::getTextureSource(eTextureBlendSrc src)              LL_WARNS() << "Unknown eTextureBlendSrc: " << src << ".  Using Vertex Color instead." << LL_ENDL;              return GL_PRIMARY_COLOR;      } +#endif  }  GLint LLTexUnit::getTextureSourceType(eTextureBlendSrc src, bool isAlpha) @@ -613,7 +625,9 @@ void LLTexUnit::setColorScale(S32 scale)      {          mCurrColorScale = scale;          gGL.flush(); +#if GL_VERSION_1_1          glTexEnvi( GL_TEXTURE_ENV, GL_RGB_SCALE, scale ); +#endif      }  } @@ -623,7 +637,9 @@ void LLTexUnit::setAlphaScale(S32 scale)      {          mCurrAlphaScale = scale;          gGL.flush(); +#if GL_VERSION_1_1          glTexEnvi( GL_TEXTURE_ENV, GL_ALPHA_SCALE, scale ); +#endif      }  } @@ -877,7 +893,9 @@ bool LLRender::init(bool needs_vertex_buffer)      glCullFace(GL_BACK);      // necessary for reflection maps +#if GL_VERSION_3_2      glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS); +#endif  #if LL_WINDOWS      if (glGenVertexArrays == nullptr) @@ -904,7 +922,7 @@ void LLRender::initVertexBuffer()      llassert_always(mBuffer.isNull());      stop_glerror();      mBuffer = new LLVertexBuffer(immediate_mask); -    mBuffer->allocateBuffer(4096, 0); +    mBuffer->allocateBuffer(BATCH_SIZE, 0);      mBuffer->getVertexStrider(mVerticesp);      mBuffer->getTexCoord0Strider(mTexcoordsp);      mBuffer->getColorStrider(mColorsp); @@ -1319,9 +1337,8 @@ 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; +    LLVector4a add(x,y,z); +    mUIOffset.back().add(add);  }  void LLRender::scaleUI(F32 x, F32 y, F32 z) @@ -1331,14 +1348,15 @@ 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)); +    LLVector4a scale(x,y,z); +    mUIScale.back().mul(scale);  }  void LLRender::pushUIMatrix()  {      if (mUIOffset.empty())      { -        mUIOffset.push_back(LLVector3(0,0,0)); +        mUIOffset.emplace_back(LLVector4a::getZero());      }      else      { @@ -1347,7 +1365,7 @@ void LLRender::pushUIMatrix()      if (mUIScale.empty())      { -        mUIScale.push_back(LLVector3(1,1,1)); +        mUIScale.emplace_back(LLVector4a(1.f));      }      else      { @@ -1371,7 +1389,7 @@ LLVector3 LLRender::getUITranslation()      {          return LLVector3(0,0,0);      } -    return mUIOffset.back(); +    return LLVector3(mUIOffset.back().getF32ptr());  }  LLVector3 LLRender::getUIScale() @@ -1380,18 +1398,17 @@ LLVector3 LLRender::getUIScale()      {          return LLVector3(1,1,1);      } -    return mUIScale.back(); +    return LLVector3(mUIScale.back().getF32ptr());  } -  void LLRender::loadUIIdentity()  {      if (mUIOffset.empty())      {          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().splat(0.f); +    mUIScale.back().splat(1.f);  }  void LLRender::setColorMask(bool writeColor, bool writeAlpha) @@ -1580,7 +1597,7 @@ void LLRender::end()          mMode != LLRender::LINES &&          mMode != LLRender::TRIANGLES &&          mMode != LLRender::POINTS) || -        mCount > 2048) +        mCount > (BATCH_SIZE / 2))      {          flush();      } @@ -1601,28 +1618,28 @@ void LLRender::flush()          //store mCount in a local variable to avoid re-entrance (drawArrays may call flush)          U32 count = mCount; -            if (mMode == LLRender::QUADS && !sGLCoreProfile) +        if (mMode == LLRender::QUADS && !sGLCoreProfile) +        { +            if (mCount%4 != 0)              { -                if (mCount%4 != 0) -                {                  count -= (mCount % 4);                  LL_WARNS() << "Incomplete quad requested." << LL_ENDL; -                }              } +        } -            if (mMode == LLRender::TRIANGLES) +        if (mMode == LLRender::TRIANGLES) +        { +            if (mCount%3 != 0)              { -                if (mCount%3 != 0) -                {                  count -= (mCount % 3);                  LL_WARNS() << "Incomplete triangle requested." << LL_ENDL; -                }              } +        } -            if (mMode == LLRender::LINES) +        if (mMode == LLRender::LINES) +        { +            if (mCount%2 != 0)              { -                if (mCount%2 != 0) -                {                  count -= (mCount % 2);                  LL_WARNS() << "Incomplete line requested." << LL_ENDL;              } @@ -1684,7 +1701,7 @@ void LLRender::flush()                  vb->setBuffer(); -                vb->setPositionData((LLVector4a*) mVerticesp.get()); +                vb->setPositionData(mVerticesp.get());                  if (attribute_mask & LLVertexBuffer::MAP_TEXCOORD0)                  { @@ -1696,9 +1713,12 @@ void LLRender::flush()                      vb->setColorData(mColorsp.get());                  } -#if LL_DARWIN -                vb->unmapBuffer(); -#endif +                //LL_INFOS() << "LLVertexBuffer::sMappingMode " << LLVertexBuffer::sMappingMode << LL_ENDL; +                if(LLVertexBuffer::sMappingMode > 1) +                { +                    vb->unmapBuffer(); +                } +                  vb->unbind();                  sVBCache[vhash] = { vb , std::chrono::steady_clock::now() }; @@ -1754,10 +1774,10 @@ void LLRender::flush()      }  } -void LLRender::vertex3f(const GLfloat& x, const GLfloat& y, const GLfloat& z) +void LLRender::vertex4a(const LLVector4a& vertex)  {      //the range of mVerticesp, mColorsp and mTexcoordsp is [0, 4095] -    if (mCount > 2048) +    if (mCount > BATCH_SIZE / 2)      { //break when buffer gets reasonably full to keep GL command buffers happy and avoid overflow below          switch (mMode)          { @@ -1768,20 +1788,20 @@ void LLRender::vertex3f(const GLfloat& x, const GLfloat& y, const GLfloat& z)          }      } -    if (mCount > 4094) +    if (mCount > BATCH_SIZE - 2)      { -    //  LL_WARNS() << "GL immediate mode overflow.  Some geometry not drawn." << LL_ENDL; +        LL_WARNS() << "GL immediate mode overflow.  Some geometry not drawn." << LL_ENDL;          return;      }      if (mUIOffset.empty())      { -        mVerticesp[mCount] = LLVector3(x,y,z); +        mVerticesp[mCount] = vertex;      }      else      { -        LLVector3 vert = (LLVector3(x,y,z)+mUIOffset.back()).scaledVec(mUIScale.back()); -        mVerticesp[mCount] = vert; +        mVerticesp[mCount].setAdd(vertex, mUIOffset.back()); +        mVerticesp[mCount].mul(mUIScale.back());      }      if (mMode == LLRender::QUADS && LLRender::sGLCoreProfile) @@ -1809,9 +1829,9 @@ void LLRender::vertex3f(const GLfloat& x, const GLfloat& y, const GLfloat& z)      mTexcoordsp[mCount] = mTexcoordsp[mCount-1];  } -void LLRender::vertexBatchPreTransformed(LLVector3* verts, S32 vert_count) +void LLRender::vertexBatchPreTransformed(LLVector4a* verts, S32 vert_count)  { -    if (mCount + vert_count > 4094) +    if (mCount + vert_count > BATCH_SIZE - 2)      {          //  LL_WARNS() << "GL immediate mode overflow.  Some geometry not drawn." << LL_ENDL;          return; @@ -1867,9 +1887,9 @@ void LLRender::vertexBatchPreTransformed(LLVector3* verts, S32 vert_count)          mVerticesp[mCount] = mVerticesp[mCount-1];  } -void LLRender::vertexBatchPreTransformed(LLVector3* verts, LLVector2* uvs, S32 vert_count) +void LLRender::vertexBatchPreTransformed(LLVector4a* verts, LLVector2* uvs, S32 vert_count)  { -    if (mCount + vert_count > 4094) +    if (mCount + vert_count > BATCH_SIZE - 2)      {          //  LL_WARNS() << "GL immediate mode overflow.  Some geometry not drawn." << LL_ENDL;          return; @@ -1928,9 +1948,9 @@ void LLRender::vertexBatchPreTransformed(LLVector3* verts, LLVector2* uvs, S32 v      }  } -void LLRender::vertexBatchPreTransformed(LLVector3* verts, LLVector2* uvs, LLColor4U* colors, S32 vert_count) +void LLRender::vertexBatchPreTransformed(LLVector4a* verts, LLVector2* uvs, LLColor4U* colors, S32 vert_count)  { -    if (mCount + vert_count > 4094) +    if (mCount + vert_count > BATCH_SIZE - 2)      {          //  LL_WARNS() << "GL immediate mode overflow.  Some geometry not drawn." << LL_ENDL;          return; @@ -1991,25 +2011,6 @@ void LLRender::vertexBatchPreTransformed(LLVector3* verts, LLVector2* uvs, LLCol      }  } -void LLRender::vertex2i(const GLint& x, const GLint& y) -{ -    vertex3f((GLfloat) x, (GLfloat) y, 0); -} - -void LLRender::vertex2f(const GLfloat& x, const GLfloat& y) -{ -    vertex3f(x,y,0); -} - -void LLRender::vertex2fv(const GLfloat* v) -{ -    vertex3f(v[0], v[1], 0); -} - -void LLRender::vertex3fv(const GLfloat* v) -{ -    vertex3f(v[0], v[1], v[2]); -}  void LLRender::texCoord2f(const GLfloat& x, const GLfloat& y)  { diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h index be9f3895e7..5852201c94 100644 --- a/indra/llrender/llrender.h +++ b/indra/llrender/llrender.h @@ -34,6 +34,7 @@  //#include "linden_common.h" +#include <array>  #include "v2math.h"  #include "v3math.h"  #include "v4coloru.h" @@ -415,11 +416,15 @@ public:      void begin(const GLuint& mode);      void end(); -    void vertex2i(const GLint& x, const GLint& y); -    void vertex2f(const GLfloat& x, const GLfloat& y); -    void vertex3f(const GLfloat& x, const GLfloat& y, const GLfloat& z); -    void vertex2fv(const GLfloat* v); -    void vertex3fv(const GLfloat* v); + +    LL_FORCE_INLINE void vertex2i(const GLint& x, const GLint& y) { vertex4a(LLVector4a((GLfloat)x,(GLfloat)y,0.f)); } +    LL_FORCE_INLINE void vertex2f(const GLfloat& x, const GLfloat& y) { vertex4a(LLVector4a(x,y,0.f)); } +    LL_FORCE_INLINE void vertex3f(const GLfloat& x, const GLfloat& y, const GLfloat& z) { vertex4a(LLVector4a(x,y,z)); } +    LL_FORCE_INLINE void vertex2fv(const GLfloat* v) { vertex4a(LLVector4a(v[0],v[1],0.f)); } +    LL_FORCE_INLINE void vertex3fv(const GLfloat* v) { vertex4a(LLVector4a(v[0],v[1],v[2])); } + +    void vertex4a(const LLVector4a& v); +      void texCoord2i(const GLint& x, const GLint& y);      void texCoord2f(const GLfloat& x, const GLfloat& y); @@ -439,9 +444,9 @@ public:      void diffuseColor4ubv(const U8* c);      void diffuseColor4ub(U8 r, U8 g, U8 b, U8 a); -    void vertexBatchPreTransformed(LLVector3* verts, S32 vert_count); -    void vertexBatchPreTransformed(LLVector3* verts, LLVector2* uvs, S32 vert_count); -    void vertexBatchPreTransformed(LLVector3* verts, LLVector2* uvs, LLColor4U*, S32 vert_count); +    void vertexBatchPreTransformed(LLVector4a* verts, S32 vert_count); +    void vertexBatchPreTransformed(LLVector4a* verts, LLVector2* uvs, S32 vert_count); +    void vertexBatchPreTransformed(LLVector4a* verts, LLVector2* uvs, LLColor4U*, S32 vert_count);      void setColorMask(bool writeColor, bool writeAlpha);      void setColorMask(bool writeColorR, bool writeColorG, bool writeColorB, bool writeAlpha); @@ -480,6 +485,8 @@ public:      static bool sNsightDebugSupport;      static LLVector2 sUIGLScaleFactor; +    //static U32 sMappingMode; +  private:      friend class LLLightState; @@ -499,7 +506,7 @@ private:      bool                mCurrColorMask[4];      LLPointer<LLVertexBuffer>   mBuffer; -    LLStrider<LLVector3>        mVerticesp; +    LLStrider<LLVector4a>        mVerticesp;      LLStrider<LLVector2>        mTexcoordsp;      LLStrider<LLColor4U>        mColorsp;      std::array<LLTexUnit, LL_NUM_TEXTURE_LAYERS> mTexUnits; @@ -511,8 +518,8 @@ private:      eBlendFactor mCurrBlendAlphaSFactor;      eBlendFactor mCurrBlendAlphaDFactor; -    std::vector<LLVector3> mUIOffset; -    std::vector<LLVector3> mUIScale; +    std::vector<LLVector4a> mUIOffset; +    std::vector<LLVector4a> mUIScale;  }; diff --git a/indra/llrender/llrender2dutils.cpp b/indra/llrender/llrender2dutils.cpp index ef02fbd071..97e9875afb 100644 --- a/indra/llrender/llrender2dutils.cpp +++ b/indra/llrender/llrender2dutils.cpp @@ -119,14 +119,18 @@ void gl_rect_2d(S32 left, S32 top, S32 right, S32 bottom, bool filled )  {      gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -    // Counterclockwise quad will face the viewer      if( filled )      { -        gGL.begin( LLRender::QUADS ); +        gGL.begin( LLRender::TRIANGLES ); +        {              gGL.vertex2i(left, top);              gGL.vertex2i(left, bottom);              gGL.vertex2i(right, bottom); + +            gGL.vertex2i(left, top); +            gGL.vertex2i(right, bottom);              gGL.vertex2i(right, top); +        }          gGL.end();      }      else @@ -171,51 +175,73 @@ void gl_drop_shadow(S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &st      LLColor4 end_color = start_color;      end_color.mV[VALPHA] = 0.f; +    gGL.begin(LLRender::TRIANGLES); -    gGL.begin(LLRender::QUADS); - -    // Right edge, CCW faces screen +    // Right edge +    gGL.color4fv(start_color.mV); +    gGL.vertex2i(right, top-lines); +    gGL.vertex2i(right, bottom); +    gGL.color4fv(end_color.mV); +    gGL.vertex2i(right+lines, bottom);      gGL.color4fv(start_color.mV); -    gGL.vertex2i(right,     top-lines); -    gGL.vertex2i(right,     bottom); +    gGL.vertex2i(right, top-lines);      gGL.color4fv(end_color.mV);      gGL.vertex2i(right+lines, bottom);      gGL.vertex2i(right+lines, top-lines); -    // Bottom edge, CCW faces screen +    // Bottom edge      gGL.color4fv(start_color.mV); -    gGL.vertex2i(right,     bottom); -    gGL.vertex2i(left+lines,    bottom); +    gGL.vertex2i(right, bottom); +    gGL.vertex2i(left+lines, bottom); +    gGL.color4fv(end_color.mV); +    gGL.vertex2i(left+lines, bottom-lines); +    gGL.color4fv(start_color.mV); +    gGL.vertex2i(right, bottom);      gGL.color4fv(end_color.mV); -    gGL.vertex2i(left+lines,    bottom-lines); -    gGL.vertex2i(right,     bottom-lines); +    gGL.vertex2i(left+lines, bottom-lines); +    gGL.vertex2i(right, bottom-lines);      // bottom left Corner      gGL.color4fv(start_color.mV); -    gGL.vertex2i(left+lines,    bottom); +    gGL.vertex2i(left+lines, bottom); +    gGL.color4fv(end_color.mV); +    gGL.vertex2i(left, bottom); + +    // bottom left corner +    gGL.vertex2i(left+1, bottom-lines+1); +    gGL.color4fv(start_color.mV); +    gGL.vertex2i(left+lines, bottom);      gGL.color4fv(end_color.mV); -    gGL.vertex2i(left,      bottom); -    // make the bottom left corner not sharp -    gGL.vertex2i(left+1,        bottom-lines+1); -    gGL.vertex2i(left+lines,    bottom-lines); +    gGL.vertex2i(left+1, bottom-lines+1); +    gGL.vertex2i(left+lines, bottom-lines);      // bottom right corner      gGL.color4fv(start_color.mV); -    gGL.vertex2i(right,     bottom); +    gGL.vertex2i(right, bottom);      gGL.color4fv(end_color.mV); -    gGL.vertex2i(right,     bottom-lines); +    gGL.vertex2i(right, bottom-lines); +      // make the rightmost corner not sharp      gGL.vertex2i(right+lines-1, bottom-lines+1); -    gGL.vertex2i(right+lines,   bottom); +    gGL.color4fv(start_color.mV); +    gGL.vertex2i(right, bottom); +    gGL.color4fv(end_color.mV); +    gGL.vertex2i(right+lines-1, bottom-lines+1); +    gGL.vertex2i(right+lines, bottom);      // top right corner      gGL.color4fv(start_color.mV); -    gGL.vertex2i( right,            top-lines ); +    gGL.vertex2i( right, top-lines );      gGL.color4fv(end_color.mV); -    gGL.vertex2i( right+lines,  top-lines ); +    gGL.vertex2i( right+lines, top-lines ); +      // make the corner not sharp -    gGL.vertex2i( right+lines-1,    top-1 ); -    gGL.vertex2i( right,            top ); +    gGL.vertex2i( right+lines-1, top-1 ); +    gGL.color4fv(start_color.mV); +    gGL.vertex2i( right, top-lines ); +    gGL.color4fv(end_color.mV); +    gGL.vertex2i( right+lines-1, top-1 ); +    gGL.vertex2i( right, top );      gGL.end();      stop_glerror(); @@ -429,165 +455,237 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTex          gGL.color4fv(color.mV); -        const S32 NUM_VERTICES = 9 * 4; // 9 quads +        const S32 NUM_VERTICES = 9 * 6;          LLVector2 uv[NUM_VERTICES]; -        LLVector3 pos[NUM_VERTICES]; +        LLVector4a pos[NUM_VERTICES];          S32 index = 0; -        gGL.begin(LLRender::QUADS); +        gGL.begin(LLRender::TRIANGLES);          {              // draw bottom left              uv[index] = LLVector2(uv_outer_rect.mLeft, uv_outer_rect.mBottom); -            pos[index] = LLVector3(draw_outer_rect.mLeft, draw_outer_rect.mBottom, 0.f); +            pos[index] = LLVector4a(draw_outer_rect.mLeft, draw_outer_rect.mBottom, 0.f);              index++;              uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mBottom); -            pos[index] = LLVector3(draw_center_rect.mLeft, draw_outer_rect.mBottom, 0.f); +            pos[index] = LLVector4a(draw_center_rect.mLeft, draw_outer_rect.mBottom, 0.f); +            index++; + +            uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom); +            pos[index] = LLVector4a(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f); +            index++; + +            uv[index] = LLVector2(uv_outer_rect.mLeft, uv_outer_rect.mBottom); +            pos[index] = LLVector4a(draw_outer_rect.mLeft, draw_outer_rect.mBottom, 0.f);              index++;              uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom); -            pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f); +            pos[index] = LLVector4a(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f);              index++;              uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mBottom); -            pos[index] = LLVector3(draw_outer_rect.mLeft, draw_center_rect.mBottom, 0.f); +            pos[index] = LLVector4a(draw_outer_rect.mLeft, draw_center_rect.mBottom, 0.f);              index++;              // draw bottom middle              uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mBottom); -            pos[index] = LLVector3(draw_center_rect.mLeft, draw_outer_rect.mBottom, 0.f); +            pos[index] = LLVector4a(draw_center_rect.mLeft, draw_outer_rect.mBottom, 0.f);              index++;              uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mBottom); -            pos[index] = LLVector3(draw_center_rect.mRight, draw_outer_rect.mBottom, 0.f); +            pos[index] = LLVector4a(draw_center_rect.mRight, draw_outer_rect.mBottom, 0.f);              index++;              uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom); -            pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f); +            pos[index] = LLVector4a(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f); +            index++; + +            uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mBottom); +            pos[index] = LLVector4a(draw_center_rect.mLeft, draw_outer_rect.mBottom, 0.f); +            index++; + +            uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom); +            pos[index] = LLVector4a(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f);              index++;              uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom); -            pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f); +            pos[index] = LLVector4a(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f);              index++;              // draw bottom right              uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mBottom); -            pos[index] = LLVector3(draw_center_rect.mRight, draw_outer_rect.mBottom, 0.f); +            pos[index] = LLVector4a(draw_center_rect.mRight, draw_outer_rect.mBottom, 0.f);              index++;              uv[index] = LLVector2(uv_outer_rect.mRight, uv_outer_rect.mBottom); -            pos[index] = LLVector3(draw_outer_rect.mRight, draw_outer_rect.mBottom, 0.f); +            pos[index] = LLVector4a(draw_outer_rect.mRight, draw_outer_rect.mBottom, 0.f);              index++;              uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mBottom); -            pos[index] = LLVector3(draw_outer_rect.mRight, draw_center_rect.mBottom, 0.f); +            pos[index] = LLVector4a(draw_outer_rect.mRight, draw_center_rect.mBottom, 0.f); +            index++; + +            uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mBottom); +            pos[index] = LLVector4a(draw_center_rect.mRight, draw_outer_rect.mBottom, 0.f); +            index++; + +            uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mBottom); +            pos[index] = LLVector4a(draw_outer_rect.mRight, draw_center_rect.mBottom, 0.f);              index++;              uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom); -            pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f); +            pos[index] = LLVector4a(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f);              index++;              // draw left              uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mBottom); -            pos[index] = LLVector3(draw_outer_rect.mLeft, draw_center_rect.mBottom, 0.f); +            pos[index] = LLVector4a(draw_outer_rect.mLeft, draw_center_rect.mBottom, 0.f);              index++;              uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom); -            pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f); +            pos[index] = LLVector4a(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f); +            index++; + +            uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop); +            pos[index] = LLVector4a(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f); +            index++; + +            uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mBottom); +            pos[index] = LLVector4a(draw_outer_rect.mLeft, draw_center_rect.mBottom, 0.f);              index++;              uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop); -            pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f); +            pos[index] = LLVector4a(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f);              index++;              uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mTop); -            pos[index] = LLVector3(draw_outer_rect.mLeft, draw_center_rect.mTop, 0.f); +            pos[index] = LLVector4a(draw_outer_rect.mLeft, draw_center_rect.mTop, 0.f);              index++;              // draw middle              uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom); -            pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f); +            pos[index] = LLVector4a(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f);              index++;              uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom); -            pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f); +            pos[index] = LLVector4a(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f);              index++;              uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop); -            pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mTop, 0.f); +            pos[index] = LLVector4a(draw_center_rect.mRight, draw_center_rect.mTop, 0.f); +            index++; + +            uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mBottom); +            pos[index] = LLVector4a(draw_center_rect.mLeft, draw_center_rect.mBottom, 0.f); +            index++; + +            uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop); +            pos[index] = LLVector4a(draw_center_rect.mRight, draw_center_rect.mTop, 0.f);              index++;              uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop); -            pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f); +            pos[index] = LLVector4a(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f);              index++;              // draw right              uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom); -            pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f); +            pos[index] = LLVector4a(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f);              index++;              uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mBottom); -            pos[index] = LLVector3(draw_outer_rect.mRight, draw_center_rect.mBottom, 0.f); +            pos[index] = LLVector4a(draw_outer_rect.mRight, draw_center_rect.mBottom, 0.f);              index++;              uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mTop); -            pos[index] = LLVector3(draw_outer_rect.mRight, draw_center_rect.mTop, 0.f); +            pos[index] = LLVector4a(draw_outer_rect.mRight, draw_center_rect.mTop, 0.f); +            index++; + +            uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mBottom); +            pos[index] = LLVector4a(draw_center_rect.mRight, draw_center_rect.mBottom, 0.f); +            index++; + +            uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mTop); +            pos[index] = LLVector4a(draw_outer_rect.mRight, draw_center_rect.mTop, 0.f);              index++;              uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop); -            pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mTop, 0.f); +            pos[index] = LLVector4a(draw_center_rect.mRight, draw_center_rect.mTop, 0.f);              index++;              // draw top left              uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mTop); -            pos[index] = LLVector3(draw_outer_rect.mLeft, draw_center_rect.mTop, 0.f); +            pos[index] = LLVector4a(draw_outer_rect.mLeft, draw_center_rect.mTop, 0.f);              index++;              uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop); -            pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f); +            pos[index] = LLVector4a(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f);              index++;              uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mTop); -            pos[index] = LLVector3(draw_center_rect.mLeft, draw_outer_rect.mTop, 0.f); +            pos[index] = LLVector4a(draw_center_rect.mLeft, draw_outer_rect.mTop, 0.f); +            index++; + +            uv[index] = LLVector2(uv_outer_rect.mLeft, uv_center_rect.mTop); +            pos[index] = LLVector4a(draw_outer_rect.mLeft, draw_center_rect.mTop, 0.f); +            index++; + +            uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mTop); +            pos[index] = LLVector4a(draw_center_rect.mLeft, draw_outer_rect.mTop, 0.f);              index++;              uv[index] = LLVector2(uv_outer_rect.mLeft, uv_outer_rect.mTop); -            pos[index] = LLVector3(draw_outer_rect.mLeft, draw_outer_rect.mTop, 0.f); +            pos[index] = LLVector4a(draw_outer_rect.mLeft, draw_outer_rect.mTop, 0.f);              index++;              // draw top middle              uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop); -            pos[index] = LLVector3(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f); +            pos[index] = LLVector4a(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f);              index++;              uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop); -            pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mTop, 0.f); +            pos[index] = LLVector4a(draw_center_rect.mRight, draw_center_rect.mTop, 0.f);              index++;              uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mTop); -            pos[index] = LLVector3(draw_center_rect.mRight, draw_outer_rect.mTop, 0.f); +            pos[index] = LLVector4a(draw_center_rect.mRight, draw_outer_rect.mTop, 0.f); +            index++; + +            uv[index] = LLVector2(uv_center_rect.mLeft, uv_center_rect.mTop); +            pos[index] = LLVector4a(draw_center_rect.mLeft, draw_center_rect.mTop, 0.f); +            index++; + +            uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mTop); +            pos[index] = LLVector4a(draw_center_rect.mRight, draw_outer_rect.mTop, 0.f);              index++;              uv[index] = LLVector2(uv_center_rect.mLeft, uv_outer_rect.mTop); -            pos[index] = LLVector3(draw_center_rect.mLeft, draw_outer_rect.mTop, 0.f); +            pos[index] = LLVector4a(draw_center_rect.mLeft, draw_outer_rect.mTop, 0.f);              index++;              // draw top right              uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop); -            pos[index] = LLVector3(draw_center_rect.mRight, draw_center_rect.mTop, 0.f); +            pos[index] = LLVector4a(draw_center_rect.mRight, draw_center_rect.mTop, 0.f);              index++;              uv[index] = LLVector2(uv_outer_rect.mRight, uv_center_rect.mTop); -            pos[index] = LLVector3(draw_outer_rect.mRight, draw_center_rect.mTop, 0.f); +            pos[index] = LLVector4a(draw_outer_rect.mRight, draw_center_rect.mTop, 0.f);              index++;              uv[index] = LLVector2(uv_outer_rect.mRight, uv_outer_rect.mTop); -            pos[index] = LLVector3(draw_outer_rect.mRight, draw_outer_rect.mTop, 0.f); +            pos[index] = LLVector4a(draw_outer_rect.mRight, draw_outer_rect.mTop, 0.f); +            index++; + +            uv[index] = LLVector2(uv_center_rect.mRight, uv_center_rect.mTop); +            pos[index] = LLVector4a(draw_center_rect.mRight, draw_center_rect.mTop, 0.f); +            index++; + +            uv[index] = LLVector2(uv_outer_rect.mRight, uv_outer_rect.mTop); +            pos[index] = LLVector4a(draw_outer_rect.mRight, draw_outer_rect.mTop, 0.f);              index++;              uv[index] = LLVector2(uv_center_rect.mRight, uv_outer_rect.mTop); -            pos[index] = LLVector3(draw_center_rect.mRight, draw_outer_rect.mTop, 0.f); +            pos[index] = LLVector4a(draw_center_rect.mRight, draw_outer_rect.mTop, 0.f);              index++;              gGL.vertexBatchPreTransformed(pos, uv, NUM_VERTICES); @@ -629,11 +727,11 @@ void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degre      if (degrees == 0.f)      { -        const S32 NUM_VERTICES = 4; // 9 quads +        const S32 NUM_VERTICES = 6;          LLVector2 uv[NUM_VERTICES]; -        LLVector3 pos[NUM_VERTICES]; +        LLVector4a pos[NUM_VERTICES]; -        gGL.begin(LLRender::QUADS); +        gGL.begin(LLRender::TRIANGLES);          {              LLVector3 ui_scale = gGL.getUIScale();              LLVector3 ui_translation = gGL.getUITranslation(); @@ -645,19 +743,27 @@ void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degre              S32 scaled_height = ll_round(height * ui_scale.mV[VY]);              uv[index] = LLVector2(uv_rect.mRight, uv_rect.mTop); -            pos[index] = LLVector3(ui_translation.mV[VX] + scaled_width, ui_translation.mV[VY] + scaled_height, 0.f); +            pos[index] = LLVector4a(ui_translation.mV[VX] + scaled_width, ui_translation.mV[VY] + scaled_height, 0.f);              index++;              uv[index] = LLVector2(uv_rect.mLeft, uv_rect.mTop); -            pos[index] = LLVector3(ui_translation.mV[VX], ui_translation.mV[VY] + scaled_height, 0.f); +            pos[index] = LLVector4a(ui_translation.mV[VX], ui_translation.mV[VY] + scaled_height, 0.f); +            index++; + +            uv[index] = LLVector2(uv_rect.mLeft, uv_rect.mBottom); +            pos[index] = LLVector4a(ui_translation.mV[VX], ui_translation.mV[VY], 0.f); +            index++; + +            uv[index] = LLVector2(uv_rect.mRight, uv_rect.mTop); +            pos[index] = LLVector4a(ui_translation.mV[VX] + scaled_width, ui_translation.mV[VY] + scaled_height, 0.f);              index++;              uv[index] = LLVector2(uv_rect.mLeft, uv_rect.mBottom); -            pos[index] = LLVector3(ui_translation.mV[VX], ui_translation.mV[VY], 0.f); +            pos[index] = LLVector4a(ui_translation.mV[VX], ui_translation.mV[VY], 0.f);              index++;              uv[index] = LLVector2(uv_rect.mRight, uv_rect.mBottom); -            pos[index] = LLVector3(ui_translation.mV[VX] + scaled_width, ui_translation.mV[VY], 0.f); +            pos[index] = LLVector4a(ui_translation.mV[VX] + scaled_width, ui_translation.mV[VY], 0.f);              index++;              gGL.vertexBatchPreTransformed(pos, uv, NUM_VERTICES); @@ -687,26 +793,32 @@ void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degre          gGL.color4fv(color.mV); -        gGL.begin(LLRender::QUADS); +        gGL.begin(LLRender::TRIANGLES);          { -            LLVector3 v; +            LLVector3 v1 = LLVector3(offset_x, offset_y, 0.f) * quat; +            LLVector3 v2 = LLVector3(-offset_x, offset_y, 0.f) * quat; +            LLVector3 v3 = LLVector3(-offset_x, -offset_y, 0.f) * quat; +            LLVector3 v4 = LLVector3(offset_x, -offset_y, 0.f) * quat; -            v = LLVector3(offset_x, offset_y, 0.f) * quat;              gGL.texCoord2f(uv_rect.mRight, uv_rect.mTop); -            gGL.vertex2f(v.mV[0], v.mV[1] ); +            gGL.vertex2f(v1.mV[0], v1.mV[1] ); -            v = LLVector3(-offset_x, offset_y, 0.f) * quat;              gGL.texCoord2f(uv_rect.mLeft, uv_rect.mTop); -            gGL.vertex2f(v.mV[0], v.mV[1] ); +            gGL.vertex2f(v2.mV[0], v2.mV[1] ); + +            gGL.texCoord2f(uv_rect.mLeft, uv_rect.mBottom); +            gGL.vertex2f(v3.mV[0], v3.mV[1] ); + +            gGL.texCoord2f(uv_rect.mRight, uv_rect.mTop); +            gGL.vertex2f(v1.mV[0], v1.mV[1] ); -            v = LLVector3(-offset_x, -offset_y, 0.f) * quat;              gGL.texCoord2f(uv_rect.mLeft, uv_rect.mBottom); -            gGL.vertex2f(v.mV[0], v.mV[1] ); +            gGL.vertex2f(v3.mV[0], v3.mV[1] ); -            v = LLVector3(offset_x, -offset_y, 0.f) * quat;              gGL.texCoord2f(uv_rect.mRight, uv_rect.mBottom); -            gGL.vertex2f(v.mV[0], v.mV[1] ); +            gGL.vertex2f(v4.mV[0], v4.mV[1] );          } +          gGL.end();          gGL.popUIMatrix();      } @@ -948,8 +1060,8 @@ void gl_washer_segment_2d(F32 outer_radius, F32 inner_radius, F32 start_radians,  void gl_rect_2d_simple_tex( S32 width, S32 height )  { -    gGL.begin( LLRender::QUADS ); - +    gGL.begin( LLRender::TRIANGLES ); +    {          gGL.texCoord2f(1.f, 1.f);          gGL.vertex2i(width, height); @@ -959,19 +1071,30 @@ void gl_rect_2d_simple_tex( S32 width, S32 height )          gGL.texCoord2f(0.f, 0.f);          gGL.vertex2i(0, 0); +        gGL.texCoord2f(1.f, 1.f); +        gGL.vertex2i(width, height); + +        gGL.texCoord2f(0.f, 0.f); +        gGL.vertex2i(0, 0); +          gGL.texCoord2f(1.f, 0.f);          gGL.vertex2i(width, 0); - +    }      gGL.end();  }  void gl_rect_2d_simple( S32 width, S32 height )  { -    gGL.begin( LLRender::QUADS ); +    gGL.begin( LLRender::TRIANGLES ); +    {          gGL.vertex2i(width, height);          gGL.vertex2i(0, height);          gGL.vertex2i(0, 0); + +        gGL.vertex2i(width, height); +        gGL.vertex2i(0, 0);          gGL.vertex2i(width, 0); +    }      gGL.end();  } @@ -1011,7 +1134,7 @@ void gl_segmented_rect_2d_tex(const S32 left,      LLVector2 width_vec((F32)width, 0.f);      LLVector2 height_vec(0.f, (F32)height); -    gGL.begin(LLRender::QUADS); +    gGL.begin(LLRender::TRIANGLES);      {          // draw bottom left          gGL.texCoord2f(0.f, 0.f); @@ -1023,6 +1146,12 @@ void gl_segmented_rect_2d_tex(const S32 left,          gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]);          gGL.vertex2fv((border_width_left + border_height_bottom).mV); +        gGL.texCoord2f(0.f, 0.f); +        gGL.vertex2f(0.f, 0.f); + +        gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +        gGL.vertex2fv((border_width_left + border_height_bottom).mV); +          gGL.texCoord2f(0.f, border_uv_scale.mV[VY]);          gGL.vertex2fv(border_height_bottom.mV); @@ -1036,6 +1165,12 @@ void gl_segmented_rect_2d_tex(const S32 left,          gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]);          gGL.vertex2fv((width_vec - border_width_right + border_height_bottom).mV); +        gGL.texCoord2f(border_uv_scale.mV[VX], 0.f); +        gGL.vertex2fv(border_width_left.mV); + +        gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +        gGL.vertex2fv((width_vec - border_width_right + border_height_bottom).mV); +          gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]);          gGL.vertex2fv((border_width_left + border_height_bottom).mV); @@ -1049,6 +1184,12 @@ void gl_segmented_rect_2d_tex(const S32 left,          gGL.texCoord2f(1.f, border_uv_scale.mV[VY]);          gGL.vertex2fv((width_vec + border_height_bottom).mV); +        gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 0.f); +        gGL.vertex2fv((width_vec - border_width_right).mV); + +        gGL.texCoord2f(1.f, border_uv_scale.mV[VY]); +        gGL.vertex2fv((width_vec + border_height_bottom).mV); +          gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]);          gGL.vertex2fv((width_vec - border_width_right + border_height_bottom).mV); @@ -1062,6 +1203,12 @@ void gl_segmented_rect_2d_tex(const S32 left,          gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]);          gGL.vertex2fv((border_width_left + height_vec - border_height_top).mV); +        gGL.texCoord2f(0.f, border_uv_scale.mV[VY]); +        gGL.vertex2fv(border_height_bottom.mV); + +        gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +        gGL.vertex2fv((border_width_left + height_vec - border_height_top).mV); +          gGL.texCoord2f(0.f, 1.f - border_uv_scale.mV[VY]);          gGL.vertex2fv((height_vec - border_height_top).mV); @@ -1075,6 +1222,12 @@ void gl_segmented_rect_2d_tex(const S32 left,          gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]);          gGL.vertex2fv((width_vec - border_width_right + height_vec - border_height_top).mV); +        gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +        gGL.vertex2fv((border_width_left + border_height_bottom).mV); + +        gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +        gGL.vertex2fv((width_vec - border_width_right + height_vec - border_height_top).mV); +          gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]);          gGL.vertex2fv((border_width_left + height_vec - border_height_top).mV); @@ -1088,6 +1241,12 @@ void gl_segmented_rect_2d_tex(const S32 left,          gGL.texCoord2f(1.f, 1.f - border_uv_scale.mV[VY]);          gGL.vertex2fv((width_vec + height_vec - border_height_top).mV); +        gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +        gGL.vertex2fv((width_vec - border_width_right + border_height_bottom).mV); + +        gGL.texCoord2f(1.f, 1.f - border_uv_scale.mV[VY]); +        gGL.vertex2fv((width_vec + height_vec - border_height_top).mV); +          gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]);          gGL.vertex2fv((width_vec - border_width_right + height_vec - border_height_top).mV); @@ -1101,6 +1260,12 @@ void gl_segmented_rect_2d_tex(const S32 left,          gGL.texCoord2f(border_uv_scale.mV[VX], 1.f);          gGL.vertex2fv((border_width_left + height_vec).mV); +        gGL.texCoord2f(0.f, 1.f - border_uv_scale.mV[VY]); +        gGL.vertex2fv((height_vec - border_height_top).mV); + +        gGL.texCoord2f(border_uv_scale.mV[VX], 1.f); +        gGL.vertex2fv((border_width_left + height_vec).mV); +          gGL.texCoord2f(0.f, 1.f);          gGL.vertex2fv((height_vec).mV); @@ -1114,6 +1279,12 @@ void gl_segmented_rect_2d_tex(const S32 left,          gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f);          gGL.vertex2fv((width_vec - border_width_right + height_vec).mV); +        gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +        gGL.vertex2fv((border_width_left + height_vec - border_height_top).mV); + +        gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f); +        gGL.vertex2fv((width_vec - border_width_right + height_vec).mV); +          gGL.texCoord2f(border_uv_scale.mV[VX], 1.f);          gGL.vertex2fv((border_width_left + height_vec).mV); @@ -1127,6 +1298,12 @@ void gl_segmented_rect_2d_tex(const S32 left,          gGL.texCoord2f(1.f, 1.f);          gGL.vertex2fv((width_vec + height_vec).mV); +        gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +        gGL.vertex2fv((width_vec - border_width_right + height_vec - border_height_top).mV); + +        gGL.texCoord2f(1.f, 1.f); +        gGL.vertex2fv((width_vec + height_vec).mV); +          gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f);          gGL.vertex2fv((width_vec - border_width_right + height_vec).mV);      } @@ -1181,7 +1358,7 @@ void gl_segmented_rect_2d_fragment_tex(const LLRect& rect,      LLVector2 x_min;      LLVector2 x_max; -    gGL.begin(LLRender::QUADS); +    gGL.begin(LLRender::TRIANGLES);      {          if (start_fragment < middle_start)          { @@ -1200,6 +1377,12 @@ void gl_segmented_rect_2d_fragment_tex(const LLRect& rect,              gGL.texCoord2f(u_max, border_uv_scale.mV[VY]);              gGL.vertex2fv((x_max + border_height_bottom).mV); +            gGL.texCoord2f(u_min, 0.f); +            gGL.vertex2fv(x_min.mV); + +            gGL.texCoord2f(u_max, border_uv_scale.mV[VY]); +            gGL.vertex2fv((x_max + border_height_bottom).mV); +              gGL.texCoord2f(u_min, border_uv_scale.mV[VY]);              gGL.vertex2fv((x_min + border_height_bottom).mV); @@ -1213,6 +1396,12 @@ void gl_segmented_rect_2d_fragment_tex(const LLRect& rect,              gGL.texCoord2f(u_max, 1.f - border_uv_scale.mV[VY]);              gGL.vertex2fv((x_max + height_vec - border_height_top).mV); +            gGL.texCoord2f(u_min, border_uv_scale.mV[VY]); +            gGL.vertex2fv((x_min + border_height_bottom).mV); + +            gGL.texCoord2f(u_max, 1.f - border_uv_scale.mV[VY]); +            gGL.vertex2fv((x_max + height_vec - border_height_top).mV); +              gGL.texCoord2f(u_min, 1.f - border_uv_scale.mV[VY]);              gGL.vertex2fv((x_min + height_vec - border_height_top).mV); @@ -1226,6 +1415,12 @@ void gl_segmented_rect_2d_fragment_tex(const LLRect& rect,              gGL.texCoord2f(u_max, 1.f);              gGL.vertex2fv((x_max + height_vec).mV); +            gGL.texCoord2f(u_min, 1.f - border_uv_scale.mV[VY]); +            gGL.vertex2fv((x_min + height_vec - border_height_top).mV); + +            gGL.texCoord2f(u_max, 1.f); +            gGL.vertex2fv((x_max + height_vec).mV); +              gGL.texCoord2f(u_min, 1.f);              gGL.vertex2fv((x_min + height_vec).mV);          } @@ -1245,6 +1440,12 @@ void gl_segmented_rect_2d_fragment_tex(const LLRect& rect,              gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]);              gGL.vertex2fv((x_max + border_height_bottom).mV); +            gGL.texCoord2f(border_uv_scale.mV[VX], 0.f); +            gGL.vertex2fv(x_min.mV); + +            gGL.texCoord2f(1.f - border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +            gGL.vertex2fv((x_max + border_height_bottom).mV); +              gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]);              gGL.vertex2fv((x_min + border_height_bottom).mV); @@ -1258,6 +1459,12 @@ void gl_segmented_rect_2d_fragment_tex(const LLRect& rect,              gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]);              gGL.vertex2fv((x_max + height_vec - border_height_top).mV); +            gGL.texCoord2f(border_uv_scale.mV[VX], border_uv_scale.mV[VY]); +            gGL.vertex2fv((x_min + border_height_bottom).mV); + +            gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +            gGL.vertex2fv((x_max + height_vec - border_height_top).mV); +              gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]);              gGL.vertex2fv((x_min + height_vec - border_height_top).mV); @@ -1271,6 +1478,12 @@ void gl_segmented_rect_2d_fragment_tex(const LLRect& rect,              gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f);              gGL.vertex2fv((x_max + height_vec).mV); +            gGL.texCoord2f(border_uv_scale.mV[VX], 1.f - border_uv_scale.mV[VY]); +            gGL.vertex2fv((x_min + height_vec - border_height_top).mV); + +            gGL.texCoord2f(1.f - border_uv_scale.mV[VX], 1.f); +            gGL.vertex2fv((x_max + height_vec).mV); +              gGL.texCoord2f(border_uv_scale.mV[VX], 1.f);              gGL.vertex2fv((x_min + height_vec).mV);          } @@ -1292,6 +1505,12 @@ void gl_segmented_rect_2d_fragment_tex(const LLRect& rect,              gGL.texCoord2f(u_max, border_uv_scale.mV[VY]);              gGL.vertex2fv((x_max + border_height_bottom).mV); +            gGL.texCoord2f(u_min, 0.f); +            gGL.vertex2fv((x_min).mV); + +            gGL.texCoord2f(u_max, border_uv_scale.mV[VY]); +            gGL.vertex2fv((x_max + border_height_bottom).mV); +              gGL.texCoord2f(u_min, border_uv_scale.mV[VY]);              gGL.vertex2fv((x_min + border_height_bottom).mV); @@ -1305,6 +1524,12 @@ void gl_segmented_rect_2d_fragment_tex(const LLRect& rect,              gGL.texCoord2f(u_max, 1.f - border_uv_scale.mV[VY]);              gGL.vertex2fv((x_max + height_vec - border_height_top).mV); +            gGL.texCoord2f(u_min, border_uv_scale.mV[VY]); +            gGL.vertex2fv((x_min + border_height_bottom).mV); + +            gGL.texCoord2f(u_max, 1.f - border_uv_scale.mV[VY]); +            gGL.vertex2fv((x_max + height_vec - border_height_top).mV); +              gGL.texCoord2f(u_min, 1.f - border_uv_scale.mV[VY]);              gGL.vertex2fv((x_min + height_vec - border_height_top).mV); @@ -1318,6 +1543,12 @@ void gl_segmented_rect_2d_fragment_tex(const LLRect& rect,              gGL.texCoord2f(u_max, 1.f);              gGL.vertex2fv((x_max + height_vec).mV); +            gGL.texCoord2f(u_min, 1.f - border_uv_scale.mV[VY]); +            gGL.vertex2fv((x_min + height_vec - border_height_top).mV); + +            gGL.texCoord2f(u_max, 1.f); +            gGL.vertex2fv((x_max + height_vec).mV); +              gGL.texCoord2f(u_min, 1.f);              gGL.vertex2fv((x_min + height_vec).mV);          } @@ -1332,7 +1563,7 @@ void gl_segmented_rect_3d_tex(const LLRectf& clip_rect, const LLRectf& center_uv  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_UI; -    gGL.begin(LLRender::QUADS); +   gGL.begin(LLRender::TRIANGLES);      {          // draw bottom left          gGL.texCoord2f(clip_rect.mLeft, clip_rect.mBottom); @@ -1344,6 +1575,12 @@ void gl_segmented_rect_3d_tex(const LLRectf& clip_rect, const LLRectf& center_uv          gGL.texCoord2f(center_uv_rect.mLeft, center_uv_rect.mBottom);          gGL.vertex3fv((center_draw_rect.mLeft * width_vec + center_draw_rect.mBottom * height_vec).mV); +        gGL.texCoord2f(clip_rect.mLeft, clip_rect.mBottom); +        gGL.vertex3f(0.f, 0.f, 0.f); + +        gGL.texCoord2f(center_uv_rect.mLeft, center_uv_rect.mBottom); +        gGL.vertex3fv((center_draw_rect.mLeft * width_vec + center_draw_rect.mBottom * height_vec).mV); +          gGL.texCoord2f(clip_rect.mLeft, center_uv_rect.mBottom);          gGL.vertex3fv((center_draw_rect.mBottom * height_vec).mV); @@ -1357,6 +1594,12 @@ void gl_segmented_rect_3d_tex(const LLRectf& clip_rect, const LLRectf& center_uv          gGL.texCoord2f(center_uv_rect.mRight, center_uv_rect.mBottom);          gGL.vertex3fv((center_draw_rect.mRight * width_vec + center_draw_rect.mBottom * height_vec).mV); +        gGL.texCoord2f(center_uv_rect.mLeft, clip_rect.mBottom); +        gGL.vertex3fv((center_draw_rect.mLeft * width_vec).mV); + +        gGL.texCoord2f(center_uv_rect.mRight, center_uv_rect.mBottom); +        gGL.vertex3fv((center_draw_rect.mRight * width_vec + center_draw_rect.mBottom * height_vec).mV); +          gGL.texCoord2f(center_uv_rect.mLeft, center_uv_rect.mBottom);          gGL.vertex3fv((center_draw_rect.mLeft * width_vec + center_draw_rect.mBottom * height_vec).mV); @@ -1370,6 +1613,12 @@ void gl_segmented_rect_3d_tex(const LLRectf& clip_rect, const LLRectf& center_uv          gGL.texCoord2f(clip_rect.mRight, center_uv_rect.mBottom);          gGL.vertex3fv((width_vec + center_draw_rect.mBottom * height_vec).mV); +        gGL.texCoord2f(center_uv_rect.mRight, clip_rect.mBottom); +        gGL.vertex3fv((center_draw_rect.mRight * width_vec).mV); + +        gGL.texCoord2f(clip_rect.mRight, center_uv_rect.mBottom); +        gGL.vertex3fv((width_vec + center_draw_rect.mBottom * height_vec).mV); +          gGL.texCoord2f(center_uv_rect.mRight, center_uv_rect.mBottom);          gGL.vertex3fv((center_draw_rect.mRight * width_vec + center_draw_rect.mBottom * height_vec).mV); @@ -1383,6 +1632,12 @@ void gl_segmented_rect_3d_tex(const LLRectf& clip_rect, const LLRectf& center_uv          gGL.texCoord2f(center_uv_rect.mLeft, center_uv_rect.mTop);          gGL.vertex3fv((center_draw_rect.mLeft * width_vec + center_draw_rect.mTop * height_vec).mV); +        gGL.texCoord2f(clip_rect.mLeft, center_uv_rect.mBottom); +        gGL.vertex3fv((center_draw_rect.mBottom * height_vec).mV); + +        gGL.texCoord2f(center_uv_rect.mLeft, center_uv_rect.mTop); +        gGL.vertex3fv((center_draw_rect.mLeft * width_vec + center_draw_rect.mTop * height_vec).mV); +          gGL.texCoord2f(clip_rect.mLeft, center_uv_rect.mTop);          gGL.vertex3fv((center_draw_rect.mTop * height_vec).mV); @@ -1396,6 +1651,12 @@ void gl_segmented_rect_3d_tex(const LLRectf& clip_rect, const LLRectf& center_uv          gGL.texCoord2f(center_uv_rect.mRight, center_uv_rect.mTop);          gGL.vertex3fv((center_draw_rect.mRight * width_vec + center_draw_rect.mTop * height_vec).mV); +        gGL.texCoord2f(center_uv_rect.mLeft, center_uv_rect.mBottom); +        gGL.vertex3fv((center_draw_rect.mLeft * width_vec + center_draw_rect.mBottom * height_vec).mV); + +        gGL.texCoord2f(center_uv_rect.mRight, center_uv_rect.mTop); +        gGL.vertex3fv((center_draw_rect.mRight * width_vec + center_draw_rect.mTop * height_vec).mV); +          gGL.texCoord2f(center_uv_rect.mLeft, center_uv_rect.mTop);          gGL.vertex3fv((center_draw_rect.mLeft * width_vec + center_draw_rect.mTop * height_vec).mV); @@ -1409,6 +1670,12 @@ void gl_segmented_rect_3d_tex(const LLRectf& clip_rect, const LLRectf& center_uv          gGL.texCoord2f(clip_rect.mRight, center_uv_rect.mTop);          gGL.vertex3fv((width_vec + center_draw_rect.mTop * height_vec).mV); +        gGL.texCoord2f(center_uv_rect.mRight, center_uv_rect.mBottom); +        gGL.vertex3fv((center_draw_rect.mRight * width_vec + center_draw_rect.mBottom * height_vec).mV); + +        gGL.texCoord2f(clip_rect.mRight, center_uv_rect.mTop); +        gGL.vertex3fv((width_vec + center_draw_rect.mTop * height_vec).mV); +          gGL.texCoord2f(center_uv_rect.mRight, center_uv_rect.mTop);          gGL.vertex3fv((center_draw_rect.mRight * width_vec + center_draw_rect.mTop * height_vec).mV); @@ -1422,6 +1689,12 @@ void gl_segmented_rect_3d_tex(const LLRectf& clip_rect, const LLRectf& center_uv          gGL.texCoord2f(center_uv_rect.mLeft, clip_rect.mTop);          gGL.vertex3fv((center_draw_rect.mLeft * width_vec + height_vec).mV); +        gGL.texCoord2f(clip_rect.mLeft, center_uv_rect.mTop); +        gGL.vertex3fv((center_draw_rect.mTop * height_vec).mV); + +        gGL.texCoord2f(center_uv_rect.mLeft, clip_rect.mTop); +        gGL.vertex3fv((center_draw_rect.mLeft * width_vec + height_vec).mV); +          gGL.texCoord2f(clip_rect.mLeft, clip_rect.mTop);          gGL.vertex3fv((height_vec).mV); @@ -1435,6 +1708,12 @@ void gl_segmented_rect_3d_tex(const LLRectf& clip_rect, const LLRectf& center_uv          gGL.texCoord2f(center_uv_rect.mRight, clip_rect.mTop);          gGL.vertex3fv((center_draw_rect.mRight * width_vec + height_vec).mV); +        gGL.texCoord2f(center_uv_rect.mLeft, center_uv_rect.mTop); +        gGL.vertex3fv((center_draw_rect.mLeft * width_vec + center_draw_rect.mTop * height_vec).mV); + +        gGL.texCoord2f(center_uv_rect.mRight, clip_rect.mTop); +        gGL.vertex3fv((center_draw_rect.mRight * width_vec + height_vec).mV); +          gGL.texCoord2f(center_uv_rect.mLeft, clip_rect.mTop);          gGL.vertex3fv((center_draw_rect.mLeft * width_vec + height_vec).mV); @@ -1448,6 +1727,12 @@ void gl_segmented_rect_3d_tex(const LLRectf& clip_rect, const LLRectf& center_uv          gGL.texCoord2f(clip_rect.mRight, clip_rect.mTop);          gGL.vertex3fv((width_vec + height_vec).mV); +        gGL.texCoord2f(center_uv_rect.mRight, center_uv_rect.mTop); +        gGL.vertex3fv((center_draw_rect.mRight * width_vec + center_draw_rect.mTop * height_vec).mV); + +        gGL.texCoord2f(clip_rect.mRight, clip_rect.mTop); +        gGL.vertex3fv((width_vec + height_vec).mV); +          gGL.texCoord2f(center_uv_rect.mRight, clip_rect.mTop);          gGL.vertex3fv((center_draw_rect.mRight * width_vec + height_vec).mV);      } @@ -1514,10 +1799,12 @@ 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 efdde77a32..dcc81a8874 100644 --- a/indra/llrender/llrendertarget.cpp +++ b/indra/llrender/llrendertarget.cpp @@ -430,7 +430,8 @@ void LLRenderTarget::bindTarget()      if (mTex.empty())      { //no color buffer to draw to -        glDrawBuffer(GL_NONE); +        GLenum drawbuffers[] = {GL_NONE}; +        glDrawBuffers(0, drawbuffers);          glReadBuffer(GL_NONE);      } @@ -498,7 +499,9 @@ void LLRenderTarget::bindTexture(U32 index, S32 channel, LLTexUnit::eTextureFilt      {          case GL_SRGB:          case GL_SRGB8: +#if GL_VERSION_2_1          case GL_SRGB_ALPHA: +#endif          case GL_SRGB8_ALPHA8:              isSRGB = true;              break; diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index 2eb7c21f77..b522eb5218 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -37,6 +37,10 @@  #include "llglslshader.h"  #include "llmemory.h" +#include "llcontrol.h" + +extern LLControlGroup gSavedSettings; +  //Next Highest Power Of Two  //helper function, returns first number > v that is a power of 2, or v if v is already a power of 2  U32 nhpo2(U32 v) @@ -290,7 +294,7 @@ static GLuint gen_buffer()  #define ANALYZE_VBO_POOL 0 -#if LL_DARWIN +#if 0 // LL_DARWIN  // experimental -- disable VBO pooling on OS X and use glMapBuffer  class LLVBOPool @@ -351,6 +355,8 @@ class LLVBOPool  public:      typedef std::chrono::steady_clock::time_point Time; +    U32 mMappingMode; +      struct Entry      {          U8* mData; @@ -358,8 +364,16 @@ public:          Time mAge;      }; +    /* +    LLVBOPool() +    { + +    } +    */ +      ~LLVBOPool()      { +        if(mMappingMode > 1) return;          clear();      } @@ -378,7 +392,8 @@ public:      U64 getVramBytesUsed()      { -        return mAllocated + mReserved; +        if(mMappingMode > 1) return mAllocated; +        else return mAllocated + mReserved;      }      // increase the size to some common value (e.g. a power of two) to increase hit rate @@ -400,6 +415,20 @@ public:          llassert(data == nullptr);  // non null data indicates a buffer that wasn't freed          llassert(size >= 2);  // any buffer size smaller than a single index is nonsensical +        if(mMappingMode > 1) +        { +            mAllocated += size; + +            { //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; +            } +            return; +        } +          mDistributed += size;          adjustSize(size);          mAllocated += size; @@ -453,6 +482,25 @@ public:          LL_PROFILE_ZONE_SCOPED_CATEGORY_VERTEX;          llassert(type == GL_ARRAY_BUFFER || type == GL_ELEMENT_ARRAY_BUFFER);          llassert(size >= 2); + +        if(mMappingMode > 1) +        { +            if (data) +            { +                ll_aligned_free_16(data); +            } + +            mAllocated -= size; +            //STOP_GLERROR; +            if (name) +            { +                glDeleteBuffers(1, &name); +            } +            //STOP_GLERROR; + +            return; +        } +          llassert(name != 0);          llassert(data != nullptr); @@ -584,6 +632,7 @@ U32 LLVertexBuffer::sGLRenderIndices = 0;  U32 LLVertexBuffer::sLastMask = 0;  U32 LLVertexBuffer::sVertexCount = 0; +U32 LLVertexBuffer::sMappingMode = 0;  //NOTE: each component must be AT LEAST 4 bytes in size to avoid a performance penalty on AMD hardware  const U32 LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_MAX] = @@ -836,6 +885,9 @@ void LLVertexBuffer::initClass(LLWindow* window)  {      llassert(sVBOPool == nullptr);      sVBOPool = new LLVBOPool(); +    sVBOPool->mMappingMode = sMappingMode; + +    //LL_INFOS() << "milo sVBOPool intialized with " << sMappingMode << LL_ENDL;  #if ENABLE_GL_WORK_QUEUE      sQueue = new GLWorkQueue(); @@ -1144,28 +1196,30 @@ U8* LLVertexBuffer::mapVertexBuffer(LLVertexBuffer::AttributeType type, U32 inde          count = mNumVerts - index;      } -#if !LL_DARWIN -    U32 start = mOffsets[type] + sTypeSize[type] * index; -    U32 end = start + sTypeSize[type] * count-1; - -    bool flagged = false; -    // flag region as mapped -    for (U32 i = 0; i < mMappedVertexRegions.size(); ++i) +    if(sMappingMode < 2)      { -        MappedRegion& region = mMappedVertexRegions[i]; -        if (expand_region(region, start, end)) +        U32 start = mOffsets[type] + sTypeSize[type] * index; +        U32 end = start + sTypeSize[type] * count-1; + +        bool flagged = false; +        // flag region as mapped +        for (U32 i = 0; i < mMappedVertexRegions.size(); ++i)          { -            flagged = true; -            break; +            MappedRegion& region = mMappedVertexRegions[i]; +            if (expand_region(region, start, end)) +            { +                flagged = true; +                break; +            }          } -    } -    if (!flagged) -    { -        //didn't expand an existing region, make a new one -        mMappedVertexRegions.push_back({ start, end }); +        if (!flagged) +        { +            //didn't expand an existing region, make a new one +            mMappedVertexRegions.push_back({ start, end }); +        }      } -#endif +      return mMappedData+mOffsets[type]+sTypeSize[type]*index;  } @@ -1179,28 +1233,29 @@ U8* LLVertexBuffer::mapIndexBuffer(U32 index, S32 count)          count = mNumIndices-index;      } -#if !LL_DARWIN -    U32 start = sizeof(U16) * index; -    U32 end = start + sizeof(U16) * count-1; - -    bool flagged = false; -    // flag region as mapped -    for (U32 i = 0; i < mMappedIndexRegions.size(); ++i) +    if(sMappingMode < 2)      { -        MappedRegion& region = mMappedIndexRegions[i]; -        if (expand_region(region, start, end)) +        U32 start = sizeof(U16) * index; +        U32 end = start + sizeof(U16) * count-1; + +        bool flagged = false; +        // flag region as mapped +        for (U32 i = 0; i < mMappedIndexRegions.size(); ++i)          { -            flagged = true; -            break; +            MappedRegion& region = mMappedIndexRegions[i]; +            if (expand_region(region, start, end)) +            { +                flagged = true; +                break; +            }          } -    } -    if (!flagged) -    { -        //didn't expand an existing region, make a new one -        mMappedIndexRegions.push_back({ start, end }); +        if (!flagged) +        { +            //didn't expand an existing region, make a new one +            mMappedIndexRegions.push_back({ start, end }); +        }      } -#endif      return mMappedIndexData + sizeof(U16)*index;  } @@ -1213,12 +1268,16 @@ U8* LLVertexBuffer::mapIndexBuffer(U32 index, S32 count)  //  dst -- mMappedData or mMappedIndexData  void LLVertexBuffer::flush_vbo(GLenum target, U32 start, U32 end, void* data, U8* dst)  { -#if LL_DARWIN -    LL_PROFILE_ZONE_NAMED_CATEGORY_VERTEX("vb memcpy"); -    STOP_GLERROR; -    // copy into mapped buffer -    memcpy(dst+start, data, end-start+1); -#else +    if(sMappingMode > 1) +    { +        //LL_INFOS() << "milo flush_vbo() NO POOL" << LL_ENDL; +        LL_PROFILE_ZONE_NAMED_CATEGORY_VERTEX("vb memcpy"); +        //STOP_GLERROR; +        // copy into mapped buffer +        memcpy(dst+start, data, end-start+1); +        return; +    } +      llassert(target == GL_ARRAY_BUFFER ? sGLRenderBuffer == mGLBuffer : sGLRenderIndices == mGLIndices);      // skip mapped data and stream to GPU via glBufferSubData @@ -1240,7 +1299,6 @@ void LLVertexBuffer::flush_vbo(GLenum target, U32 start, U32 end, void* data, U8              glBufferSubData(target, i, size, (U8*) data + (i-start));          }      } -#endif  }  void LLVertexBuffer::unmapBuffer() @@ -1254,46 +1312,50 @@ void LLVertexBuffer::unmapBuffer()          }      }; -#if LL_DARWIN -    STOP_GLERROR; -    if (mMappedData) +    if(sMappingMode > 1)      { -        if (mGLBuffer) +        //STOP_GLERROR; +        if (mMappedData)          { -            glDeleteBuffers(1, &mGLBuffer); +            if (mGLBuffer) +            { +                glDeleteBuffers(1, &mGLBuffer); +            } +            mGLBuffer = gen_buffer(); +            glBindBuffer(GL_ARRAY_BUFFER, mGLBuffer); +            sGLRenderBuffer = mGLBuffer; +            if(sMappingMode==2) glBufferData(GL_ARRAY_BUFFER, mSize, mMappedData, GL_STATIC_DRAW); +            else glBufferData(GL_ARRAY_BUFFER, mSize, mMappedData, GL_DYNAMIC_DRAW);          } -        mGLBuffer = gen_buffer(); -        glBindBuffer(GL_ARRAY_BUFFER, mGLBuffer); -        sGLRenderBuffer = mGLBuffer; -        glBufferData(GL_ARRAY_BUFFER, mSize, mMappedData, GL_STATIC_DRAW); -    } -    else if (mGLBuffer != sGLRenderBuffer) -    { -        glBindBuffer(GL_ARRAY_BUFFER, mGLBuffer); -        sGLRenderBuffer = mGLBuffer; -    } -    STOP_GLERROR; - -    if (mMappedIndexData) -    { -        if (mGLIndices) +        else if (mGLBuffer != sGLRenderBuffer)          { -            glDeleteBuffers(1, &mGLIndices); +            glBindBuffer(GL_ARRAY_BUFFER, mGLBuffer); +            sGLRenderBuffer = mGLBuffer;          } +        //STOP_GLERROR; -        mGLIndices = gen_buffer(); -        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mGLIndices); -        sGLRenderIndices = mGLIndices; +        if (mMappedIndexData) +        { +            if (mGLIndices) +            { +                glDeleteBuffers(1, &mGLIndices); +            } -        glBufferData(GL_ELEMENT_ARRAY_BUFFER, mIndicesSize, mMappedIndexData, GL_STATIC_DRAW); -    } -    else if (mGLIndices != sGLRenderIndices) -    { -        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mGLIndices); -        sGLRenderIndices = mGLIndices; +            mGLIndices = gen_buffer(); +            glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mGLIndices); +            sGLRenderIndices = mGLIndices; + +            if(sMappingMode==2) glBufferData(GL_ELEMENT_ARRAY_BUFFER, mIndicesSize, mMappedIndexData, GL_STATIC_DRAW); +            else glBufferData(GL_ELEMENT_ARRAY_BUFFER, mIndicesSize, mMappedIndexData, GL_DYNAMIC_DRAW); +        } +        else if (mGLIndices != sGLRenderIndices) +        { +            glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mGLIndices); +            sGLRenderIndices = mGLIndices; +        } +        //STOP_GLERROR; +        return;      } -    STOP_GLERROR; -#else      if (!mMappedVertexRegions.empty())      { @@ -1361,7 +1423,6 @@ void LLVertexBuffer::unmapBuffer()          flush_vbo(GL_ELEMENT_ARRAY_BUFFER, start, end, (U8*)mMappedIndexData + start, mMappedIndexData);          mMappedIndexRegions.clear();      } -#endif  }  //---------------------------------------------------------------------------- @@ -1482,13 +1543,14 @@ bool LLVertexBuffer::getClothWeightStrider(LLStrider<LLVector4>& strider, U32 in  // Set for rendering  void LLVertexBuffer::setBuffer()  { -    STOP_GLERROR; -#if LL_DARWIN -    if (!mGLBuffer) -    { // OS X doesn't allocate a buffer until we call unmapBuffer -        return; +    if(sMappingMode > 1) +    { +        if (!mGLBuffer) +        { // OS X doesn't allocate a buffer until we call unmapBuffer +            return; +        }      } -#endif +      // no data may be pending      llassert(mMappedVertexRegions.empty());      llassert(mMappedIndexRegions.empty()); diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h index 49500e28ce..4dd375a4af 100644 --- a/indra/llrender/llvertexbuffer.h +++ b/indra/llrender/llvertexbuffer.h @@ -163,7 +163,7 @@ public:      // set for rendering      // assumes (and will assert on) the following: -    //      - this buffer has no pending unampBuffer call +    //      - this buffer has no pending unmapBuffer call      //      - a shader is currently bound      //      - This buffer has sufficient attributes within it to satisfy the needs of the currently bound shader      void    setBuffer(); @@ -289,6 +289,8 @@ public:      static U32 sGLRenderIndices;      static U32 sLastMask;      static U32 sVertexCount; + +    static U32 sMappingMode;  };  #ifdef LL_PROFILER_ENABLE_RENDER_DOC  | 
