summaryrefslogtreecommitdiff
path: root/indra/llrender
diff options
context:
space:
mode:
authorTofu Linden <tofu.linden@lindenlab.com>2010-02-13 12:46:14 +0000
committerTofu Linden <tofu.linden@lindenlab.com>2010-02-13 12:46:14 +0000
commitf0062fa41ae8849235a59808e28998d224a88b52 (patch)
tree5f6a659fe68df042dd9b78641910745a1fd2fb04 /indra/llrender
parent995fca4d364d8f9c10a99047e0e62f19fa0bbda5 (diff)
parentbcbd12f7b1fd091284ac782eff63d4a18887a8e3 (diff)
merge from viewer2. this fucks up davep's optimizations, so I'll backout their backout next to restore them. I hope. Sheesh.
Diffstat (limited to 'indra/llrender')
-rw-r--r--indra/llrender/llfontgl.cpp30
-rw-r--r--indra/llrender/llrender.cpp102
-rw-r--r--indra/llrender/llrender.h19
3 files changed, 24 insertions, 127 deletions
diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp
index 25f8320b02..b6a6b448ee 100644
--- a/indra/llrender/llfontgl.cpp
+++ b/indra/llrender/llfontgl.cpp
@@ -151,16 +151,14 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
}
}
- gGL.pushUIMatrix();
-
- gGL.loadUIIdentity();
-
- gGL.translateUI(floorf(sCurOrigin.mX*sScaleX), floorf(sCurOrigin.mY*sScaleY), sCurOrigin.mZ);
+ gGL.pushMatrix();
+ glLoadIdentity();
+ gGL.translatef(floorf(sCurOrigin.mX*sScaleX), floorf(sCurOrigin.mY*sScaleY), sCurOrigin.mZ);
// this code snaps the text origin to a pixel grid to start with
F32 pixel_offset_x = llround((F32)sCurOrigin.mX) - (sCurOrigin.mX);
F32 pixel_offset_y = llround((F32)sCurOrigin.mY) - (sCurOrigin.mY);
- gGL.translateUI(-pixel_offset_x, -pixel_offset_y, 0.f);
+ gGL.translatef(-pixel_offset_x, -pixel_offset_y, 0.f);
LLFastTimer t(FTM_RENDER_FONTS);
@@ -248,6 +246,9 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
}
+ // Remember last-used texture to avoid unnecesssary bind calls.
+ LLImageGL *last_bound_texture = NULL;
+
for (i = begin_offset; i < begin_offset + length; i++)
{
llwchar wch = wstr[i];
@@ -260,8 +261,12 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
}
// Per-glyph bitmap texture.
LLImageGL *image_gl = mFontFreetype->getFontBitmapCache()->getImageGL(fgi->mBitmapNum);
- gGL.getTexUnit(0)->bind(image_gl);
-
+ if (last_bound_texture != image_gl)
+ {
+ gGL.getTexUnit(0)->bind(image_gl);
+ last_bound_texture = image_gl;
+ }
+
if ((start_x + scaled_max_pixels) < (cur_x + fgi->mXBearing + fgi->mWidth))
{
// Not enough room for this character.
@@ -325,7 +330,10 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
// recursively render ellipses at end of string
// we've already reserved enough room
- gGL.pushUIMatrix();
+ gGL.pushMatrix();
+ //glLoadIdentity();
+ //gGL.translatef(sCurOrigin.mX, sCurOrigin.mY, 0.0f);
+ //glScalef(sScaleX, sScaleY, 1.f);
renderUTF8(std::string("..."),
0,
cur_x / sScaleX, (F32)y,
@@ -336,10 +344,10 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
S32_MAX, max_pixels,
right_x,
FALSE);
- gGL.popUIMatrix();
+ gGL.popMatrix();
}
- gGL.popUIMatrix();
+ gGL.popMatrix();
return chars_drawn;
}
diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index 55c5b4531b..04ba63dd34 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -49,9 +49,6 @@ F64 gGLLastProjection[16];
F64 gGLProjection[16];
S32 gGLViewport[4];
-U32 LLRender::sUICalls = 0;
-U32 LLRender::sUIVerts = 0;
-
static const U32 LL_NUM_TEXTURE_LAYERS = 16;
static GLenum sGLTextureType[] =
@@ -258,9 +255,10 @@ bool LLTexUnit::bind(LLImageGL* texture, bool for_rendering, bool forceBind)
return false ;
}
+ gGL.flush();
+
if ((mCurrTexture != texture->getTexName()) || forceBind)
{
- gGL.flush();
activate();
enable(texture->getTarget());
mCurrTexture = texture->getTexName();
@@ -447,8 +445,6 @@ void LLTexUnit::setTextureBlendType(eTextureBlendType type)
return;
}
- gGL.flush();
-
activate();
mCurrBlendType = type;
S32 scale_amount = 1;
@@ -763,8 +759,6 @@ LLRender::LLRender()
mCurrAlphaFunc = CF_DEFAULT;
mCurrAlphaFuncVal = 0.01f;
- mCurrBlendSFactor = BF_ONE;
- mCurrBlendDFactor = BF_ZERO;
}
LLRender::~LLRender()
@@ -827,80 +821,6 @@ void LLRender::popMatrix()
glPopMatrix();
}
-void LLRender::translateUI(F32 x, F32 y, F32 z)
-{
- if (mUIOffset.empty())
- {
- llerrs << "Need to push a UI translation frame before offsetting" << llendl;
- }
-
- mUIOffset.front().mV[0] += x;
- mUIOffset.front().mV[1] += y;
- mUIOffset.front().mV[2] += z;
-}
-
-void LLRender::scaleUI(F32 x, F32 y, F32 z)
-{
- if (mUIScale.empty())
- {
- llerrs << "Need to push a UI transformation frame before scaling." << llendl;
- }
-
- mUIScale.front().scaleVec(LLVector3(x,y,z));
-}
-
-void LLRender::pushUIMatrix()
-{
- mUIOffset.push_front(mUIOffset.front());
- if (mUIScale.empty())
- {
- mUIScale.push_front(LLVector3(1,1,1));
- }
- else
- {
- mUIScale.push_front(mUIScale.front());
- }
-}
-
-void LLRender::popUIMatrix()
-{
- if (mUIOffset.empty())
- {
- llerrs << "UI offset stack blown." << llendl;
- }
- mUIOffset.pop_front();
- mUIScale.pop_front();
-}
-
-LLVector3 LLRender::getUITranslation()
-{
- if (mUIOffset.empty())
- {
- llerrs << "UI offset stack empty." << llendl;
- }
- return mUIOffset.front();
-}
-
-LLVector3 LLRender::getUIScale()
-{
- if (mUIScale.empty())
- {
- llerrs << "UI scale stack empty." << llendl;
- }
- return mUIScale.front();
-}
-
-
-void LLRender::loadUIIdentity()
-{
- if (mUIOffset.empty())
- {
- llerrs << "Need to push UI translation frame before clearing offset." << llendl;
- }
- mUIOffset.front().setVec(0,0,0);
- mUIScale.front().setVec(1,1,1);
-}
-
void LLRender::setColorMask(bool writeColor, bool writeAlpha)
{
setColorMask(writeColor, writeColor, writeColor, writeAlpha);
@@ -923,6 +843,7 @@ void LLRender::setColorMask(bool writeColorR, bool writeColorG, bool writeColorB
void LLRender::setSceneBlendType(eBlendType type)
{
+ flush();
switch (type)
{
case BT_ALPHA:
@@ -1096,12 +1017,6 @@ void LLRender::flush()
}
#endif
- if (!mUIOffset.empty())
- {
- sUICalls++;
- sUIVerts += mCount;
- }
-
mBuffer->setBuffer(immediate_mask);
mBuffer->drawArrays(mMode, 0, mCount);
@@ -1121,16 +1036,7 @@ void LLRender::vertex3f(const GLfloat& x, const GLfloat& y, const GLfloat& z)
return;
}
- if (mUIOffset.empty())
- {
- mVerticesp[mCount] = LLVector3(x,y,z);
- }
- else
- {
- LLVector3 vert = (LLVector3(x,y,z)+mUIOffset.front()).scaledVec(mUIScale.front());
- mVerticesp[mCount] = vert;
- }
-
+ mVerticesp[mCount] = LLVector3(x,y,z);
mCount++;
if (mCount < 4096)
{
diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h
index a70ccf4d80..0121a190ee 100644
--- a/indra/llrender/llrender.h
+++ b/indra/llrender/llrender.h
@@ -286,14 +286,6 @@ public:
void pushMatrix();
void popMatrix();
- void translateUI(F32 x, F32 y, F32 z);
- void scaleUI(F32 x, F32 y, F32 z);
- void pushUIMatrix();
- void popUIMatrix();
- void loadUIIdentity();
- LLVector3 getUITranslation();
- LLVector3 getUIScale();
-
void flush();
void begin(const GLuint& mode);
@@ -341,9 +333,7 @@ public:
};
public:
- static U32 sUICalls;
- static U32 sUIVerts;
-
+
private:
bool mDirty;
U32 mCount;
@@ -360,14 +350,7 @@ private:
std::vector<LLTexUnit*> mTexUnits;
LLTexUnit* mDummyTexUnit;
- U32 mCurrBlendSFactor;
- U32 mCurrBlendDFactor;
-
F32 mMaxAnisotropy;
-
- std::list<LLVector3> mUIOffset;
- std::list<LLVector3> mUIScale;
-
};
extern F64 gGLModelView[16];