MAINT-2968 Fix for crash on AMD hardware running current drivers.

Dave Parks 2013-10-10 18:00:11 -05:00
parent a6672034b8
commit ecbdb4948f
11 changed files with 55 additions and 200 deletions

View File

@ -1123,7 +1123,10 @@ BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height)
// *TODO: Is this correct?
//gPipeline.disableLights();
stop_glerror();
glDisable(GL_LIGHTING);
if (!LLGLSLShader::sNoFixedFunction)
{
glDisable(GL_LIGHTING);
}
stop_glerror();
bool use_shaders = LLGLSLShader::sNoFixedFunction;

View File

@ -81,7 +81,7 @@ void LLCubeMap::initGL()
{
U32 texname = 0;
LLImageGL::generateTextures(LLTexUnit::TT_CUBE_MAP, GL_RGB8, 1, &texname);
LLImageGL::generateTextures(1, &texname);
for (int i = 0; i < 6; i++)
{

View File

@ -54,8 +54,6 @@ S32 LLImageGL::sGlobalTextureMemoryInBytes = 0;
S32 LLImageGL::sBoundTextureMemoryInBytes = 0;
S32 LLImageGL::sCurBoundTextureMemory = 0;
S32 LLImageGL::sCount = 0;
LLImageGL::dead_texturelist_t LLImageGL::sDeadTextureList[LLTexUnit::TT_NONE];
U32 LLImageGL::sCurTexName = 1;
BOOL LLImageGL::sGlobalUseAnisotropic = FALSE;
F32 LLImageGL::sLastFrameTime = 0.f;
@ -719,7 +717,12 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips)
mMipLevels = wpo2(llmax(w, h));
//use legacy mipmap generation mode (note: making this condional can cause rendering issues)
glTexParameteri(mTarget, GL_GENERATE_MIPMAP, GL_TRUE);
// -- 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 (!LLRender::sGLCoreProfile)
{
glTexParameteri(mTarget, GL_GENERATE_MIPMAP, GL_TRUE);
}
LLImageGL::setManualImage(mTarget, 0, mFormatInternal,
w, h,
@ -1087,108 +1090,19 @@ BOOL LLImageGL::setSubImageFromFrameBuffer(S32 fb_x, S32 fb_y, S32 x_pos, S32 y_
// static
static LLFastTimer::DeclareTimer FTM_GENERATE_TEXTURES("generate textures");
void LLImageGL::generateTextures(LLTexUnit::eTextureType type, U32 format, S32 numTextures, U32 *textures)
void LLImageGL::generateTextures(S32 numTextures, U32 *textures)
{
LLFastTimer t(FTM_GENERATE_TEXTURES);
// <FS:ND> user-defined names was deprecated with OpenGL 3.1. Just generate/delete using OpenGL function.
if (LLRender::sGLCoreProfile)
{
switch (format)
{
case GL_LUMINANCE8: format = GL_RGB8; break;
case GL_LUMINANCE8_ALPHA8:
case GL_ALPHA8: format = GL_RGBA8; break;
}
}
// bool empty = true;
//
// dead_texturelist_t::iterator iter = sDeadTextureList[type].find(format);
//
// if (iter != sDeadTextureList[type].end())
// {
// empty = iter->second.empty();
// }
//
// for (S32 i = 0; i < numTextures; ++i)
// {
// if (!empty)
// {
// textures[i] = iter->second.front();
// iter->second.pop_front();
// empty = iter->second.empty();
// }
// else
// {
// textures[i] = sCurTexName++;
// }
// }
glGenTextures( numTextures, textures );
// </FS:ND>
}
// static
void LLImageGL::deleteTextures(LLTexUnit::eTextureType type, U32 format, S32 mip_levels, S32 numTextures, U32 *textures, bool immediate)
void LLImageGL::deleteTextures(S32 numTextures, U32 *textures)
{
if (gGLManager.mInited)
{
// <FS:ND> user-defined names was deprecated with OpenGL 3.1. Just generate/delete using OpenGL function.
// switch (format)
// {
// case 0:
//
// // We get ARB errors in debug when attempting to use glTexImage2D with these deprecated pix formats
// //
// case GL_LUMINANCE8:
// case GL_INTENSITY8:
// case GL_ALPHA8:
// glDeleteTextures(numTextures, textures);
// break;
//
// default:
// {
// if (type == LLTexUnit::TT_CUBE_MAP || mip_levels == -1)
// { //unknown internal format or unknown number of mip levels, not safe to reuse
// glDeleteTextures(numTextures, textures);
// }
// else
// {
// for (S32 i = 0; i < numTextures; ++i)
// { //remove texture from VRAM by setting its size to zero
//
// for (S32 j = 0; j <= mip_levels; j++)
// {
// gGL.getTexUnit(0)->bindManual(type, textures[i]);
// U32 internal_type = LLTexUnit::getInternalType(type);
// glTexImage2D(internal_type, j, format, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
// stop_glerror();
// }
//
// llassert(std::find(sDeadTextureList[type][format].begin(),
// sDeadTextureList[type][format].end(), textures[i]) ==
// sDeadTextureList[type][format].end());
//
// sDeadTextureList[type][format].push_back(textures[i]);
// }
// }
// }
// break;
// }
glDeleteTextures(numTextures, textures);
// </FS:ND>
}
/*if (immediate)
{
LLImageGL::deleteDeadTextures();
}*/
}
// static
@ -1316,11 +1230,11 @@ BOOL LLImageGL::createGLTexture()
if(mTexName)
{
LLImageGL::deleteTextures(mBindTarget, mFormatInternal, mMipLevels, 1, (reinterpret_cast<GLuint*>(&mTexName))) ;
LLImageGL::deleteTextures(1, (reinterpret_cast<GLuint*>(&mTexName))) ;
}
LLImageGL::generateTextures(mBindTarget, mFormatInternal, 1, &mTexName);
LLImageGL::generateTextures(1, &mTexName);
stop_glerror();
if (!mTexName)
{
@ -1435,7 +1349,7 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const U8* data_in, BOOL data_
}
else
{
LLImageGL::generateTextures(mBindTarget, mFormatInternal, 1, &mTexName);
LLImageGL::generateTextures(1, &mTexName);
stop_glerror();
{
llverify(gGL.getTexUnit(0)->bind(this));
@ -1480,7 +1394,7 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const U8* data_in, BOOL data_
{
sGlobalTextureMemoryInBytes -= mTextureMemory;
LLImageGL::deleteTextures(mBindTarget, mFormatInternal, mMipLevels, 1, &old_name);
LLImageGL::deleteTextures(1, &old_name);
stop_glerror();
}
@ -1609,30 +1523,6 @@ void LLImageGL::deleteDeadTextures()
{
bool reset = false;
/*while (!sDeadTextureList.empty())
{
GLuint tex = sDeadTextureList.front();
sDeadTextureList.pop_front();
for (int i = 0; i < gGLManager.mNumTextureImageUnits; i++)
{
LLTexUnit* tex_unit = gGL.getTexUnit(i);
if (tex_unit && tex_unit->getCurrTexture() == tex)
{
tex_unit->unbind(tex_unit->getCurrType());
stop_glerror();
if (i > 0)
{
reset = true;
}
}
}
glDeleteTextures(1, &tex);
stop_glerror();
}*/
if (reset)
{
gGL.getTexUnit(0)->activate();
@ -1649,7 +1539,7 @@ void LLImageGL::destroyGLTexture()
mTextureMemory = 0;
}
LLImageGL::deleteTextures(mBindTarget, mFormatInternal, mMipLevels, 1, &mTexName);
LLImageGL::deleteTextures(1, &mTexName);
mCurrentDiscardLevel = -1 ; //invalidate mCurrentDiscardLevel.
mTexName = 0;
mGLTextureCreated = FALSE ;

View File

@ -45,16 +45,9 @@ class LLImageGL : public LLRefCount
{
friend class LLTexUnit;
public:
static U32 sCurTexName;
//previously used but now available texture names
// sDeadTextureList[<usage>][<internal format>]
typedef std::map<U32, std::list<U32> > dead_texturelist_t;
static dead_texturelist_t sDeadTextureList[LLTexUnit::TT_NONE];
// These 2 functions replace glGenTextures() and glDeleteTextures()
static void generateTextures(LLTexUnit::eTextureType type, U32 format, S32 numTextures, U32 *textures);
static void deleteTextures(LLTexUnit::eTextureType type, U32 format, S32 mip_levels, S32 numTextures, U32 *textures, bool immediate = false);
static void generateTextures(S32 numTextures, U32 *textures);
static void deleteTextures(S32 numTextures, U32 *textures);
static void deleteDeadTextures();
// Size calculation

View File

@ -194,7 +194,7 @@ bool LLRenderTarget::addColorAttachment(U32 color_fmt)
}
U32 tex;
LLImageGL::generateTextures(mUsage, color_fmt, 1, &tex);
LLImageGL::generateTextures(1, &tex);
gGL.getTexUnit(0)->bindManual(mUsage, tex);
stop_glerror();
@ -280,7 +280,7 @@ bool LLRenderTarget::allocateDepth()
}
else
{
LLImageGL::generateTextures(mUsage, GL_DEPTH_COMPONENT24, 1, &mDepth);
LLImageGL::generateTextures(1, &mDepth);
gGL.getTexUnit(0)->bindManual(mUsage, mDepth);
U32 internal_type = LLTexUnit::getInternalType(mUsage);
@ -357,7 +357,7 @@ void LLRenderTarget::release()
}
else
{
LLImageGL::deleteTextures(mUsage, 0, 0, 1, &mDepth, true);
LLImageGL::deleteTextures(1, &mDepth);
stop_glerror();
}
mDepth = 0;
@ -389,7 +389,7 @@ void LLRenderTarget::release()
if (mTex.size() > 0)
{
sBytesAllocated -= mResX*mResY*4*mTex.size();
LLImageGL::deleteTextures(mUsage, mInternalFormat[0], 0, mTex.size(), &mTex[0], true);
LLImageGL::deleteTextures(mTex.size(), &mTex[0]);
mTex.clear();
mInternalFormat.clear();
}

View File

@ -91,7 +91,6 @@ LLVBOPool LLVertexBuffer::sDynamicIBOPool(GL_DYNAMIC_DRAW_ARB, GL_ELEMENT_ARRAY_
U32 LLVBOPool::sBytesPooled = 0;
U32 LLVBOPool::sIndexBytesPooled = 0;
U32 LLVBOPool::sCurGLName = 1;
std::list<U32> LLVertexBuffer::sAvailableVAOName;
U32 LLVertexBuffer::sCurVAOName = 1;
@ -123,26 +122,11 @@ bool LLVertexBuffer::sPreferStreamDraw = false;
U32 LLVBOPool::genBuffer()
{
// <FS:ND> user-defined names was deprecated with OpenGL 3.1
U32 ret = 0;
glGenBuffersARB(1, &ret);
// U32 ret = 0;
//
// if (mGLNamePool.empty())
// {
// ret = sCurGLName++;
// }
// else
// {
// ret = mGLNamePool.front();
// mGLNamePool.pop_front();
// }
//
// return ret;
GLuint ret(0);
glGenBuffersARB( 1, &ret );
return ret;
// </FS:ND>
}
void LLVBOPool::deleteBuffer(U32 name)
@ -153,19 +137,9 @@ void LLVBOPool::deleteBuffer(U32 name)
glBindBufferARB(mType, name);
glBufferDataARB(mType, 0, NULL, mUsage);
// <FS:ND> user-defined names was deprecated with OpenGL 3.1
// llassert(std::find(mGLNamePool.begin(), mGLNamePool.end(), name) == mGLNamePool.end());
// mGLNamePool.push_back(name);
GLuint nBuffer( name );
glDeleteBuffersARB( 1, &nBuffer );
// </FS:ND>
glBindBufferARB(mType, 0);
glDeleteBuffersARB(1, &name);
}
}
@ -1398,7 +1372,7 @@ void LLVertexBuffer::allocateBuffer(S32 nverts, S32 nindices, bool create)
//actually allocate space for the vertex buffer if using VBO mapping
flush();
if (gGLManager.mHasVertexArrayObject && useVBOs() && (LLRender::sGLCoreProfile || sUseVAO))
if (gGLManager.mHasVertexArrayObject && useVBOs() && sUseVAO)
{
#if GL_ARB_vertex_array_object
mGLArray = getVAOName();

View File

@ -57,8 +57,6 @@ public:
static U32 sBytesPooled;
static U32 sIndexBytesPooled;
static U32 sCurGLName;
LLVBOPool(U32 vboUsage, U32 vboType);
const U32 mUsage;
@ -89,8 +87,6 @@ public:
// volatile U8* mClientData;
// };
//
// std::list<U32> mGLNamePool;
//
// typedef std::list<Record> record_list_t;
// std::vector<record_list_t> mFreeList;
// std::vector<U32> mMissCount;

View File

@ -91,28 +91,17 @@ class LLOcclusionQueryPool : public LLGLNamePool
public:
LLOcclusionQueryPool()
{
mCurQuery = 1;
}
protected:
std::list<GLuint> mAvailableName;
GLuint mCurQuery;
virtual GLuint allocateName()
{
GLuint ret = 0;
if (!mAvailableName.empty())
{
ret = mAvailableName.front();
mAvailableName.pop_front();
}
else
{
ret = mCurQuery++;
}
glGenQueriesARB(1, &ret);
return ret;
}
@ -121,8 +110,7 @@ protected:
#if LL_TRACK_PENDING_OCCLUSION_QUERIES
LLSpatialGroup::sPendingQueries.erase(name);
#endif
llassert(std::find(mAvailableName.begin(), mAvailableName.end(), name) == mAvailableName.end());
mAvailableName.push_back(name);
glDeleteQueriesARB(1, &name);
}
};
@ -4135,6 +4123,11 @@ void renderAvatarCollisionVolumes(LLVOAvatar* avatar)
avatar->renderCollisionVolumes();
}
void renderAvatarJoints(LLVOAvatar* avatar)
{
avatar->renderJoints();
}
void renderAgentTarget(LLVOAvatar* avatar)
{
// render these for self only (why, i don't know)
@ -4292,6 +4285,11 @@ public:
renderAvatarCollisionVolumes(avatar);
}
if (avatar && gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_AVATAR_JOINTS))
{
renderAvatarJoints(avatar);
}
if (avatar && gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_AGENT_TARGET))
{
renderAgentTarget(avatar);
@ -4575,6 +4573,7 @@ void LLSpatialPartition::renderDebug()
LLPipeline::RENDER_DEBUG_TEXTURE_ANIM |
LLPipeline::RENDER_DEBUG_RAYCAST |
LLPipeline::RENDER_DEBUG_AVATAR_VOLUME |
LLPipeline::RENDER_DEBUG_AVATAR_JOINTS |
LLPipeline::RENDER_DEBUG_AGENT_TARGET |
//LLPipeline::RENDER_DEBUG_BUILD_QUEUE |
LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA |

View File

@ -949,7 +949,7 @@ void LLVOAvatar::deleteLayerSetCaches(bool clearAll)
}
if (mBakedTextureDatas[i].mMaskTexName)
{
LLImageGL::deleteTextures(LLTexUnit::TT_TEXTURE, 0, -1, 1, (GLuint*)&(mBakedTextureDatas[i].mMaskTexName));
LLImageGL::deleteTextures(1, (GLuint*)&(mBakedTextureDatas[i].mMaskTexName));
mBakedTextureDatas[i].mMaskTexName = 0 ;
}
}
@ -7774,7 +7774,7 @@ void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerFetchedTexture
}
U32 gl_name;
LLImageGL::generateTextures(LLTexUnit::TT_TEXTURE, GL_ALPHA8, 1, &gl_name );
LLImageGL::generateTextures(1, &gl_name );
stop_glerror();
gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, gl_name);
@ -7811,7 +7811,7 @@ void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerFetchedTexture
maskData->mLastDiscardLevel = discard_level;
if (self->mBakedTextureDatas[baked_index].mMaskTexName)
{
LLImageGL::deleteTextures(LLTexUnit::TT_TEXTURE, 0, -1, 1, &(self->mBakedTextureDatas[baked_index].mMaskTexName));
LLImageGL::deleteTextures(1, &(self->mBakedTextureDatas[baked_index].mMaskTexName));
}
self->mBakedTextureDatas[baked_index].mMaskTexName = gl_name;
found_texture_id = true;

View File

@ -3429,7 +3429,7 @@ void LLVOAvatarSelf::deleteScratchTextures()
namep;
namep = sScratchTexNames.getNextData() )
{
LLImageGL::deleteTextures(LLTexUnit::TT_TEXTURE, 0, -1, 1, (U32 *)namep );
LLImageGL::deleteTextures(1, (U32 *)namep );
stop_glerror();
}

View File

@ -1242,13 +1242,13 @@ void LLPipeline::releaseGLBuffers()
if (mNoiseMap)
{
LLImageGL::deleteTextures(LLTexUnit::TT_TEXTURE, GL_RGB16F_ARB, 0, 1, &mNoiseMap);
LLImageGL::deleteTextures(1, &mNoiseMap);
mNoiseMap = 0;
}
if (mTrueNoiseMap)
{
LLImageGL::deleteTextures(LLTexUnit::TT_TEXTURE, GL_RGB16F_ARB, 0, 1, &mTrueNoiseMap);
LLImageGL::deleteTextures(1, &mTrueNoiseMap);
mTrueNoiseMap = 0;
}
@ -1273,7 +1273,7 @@ void LLPipeline::releaseLUTBuffers()
{
if (mLightFunc)
{
LLImageGL::deleteTextures(LLTexUnit::TT_TEXTURE, GL_R16F, 0, 1, &mLightFunc);
LLImageGL::deleteTextures(1, &mLightFunc);
mLightFunc = 0;
}
}
@ -1367,7 +1367,7 @@ void LLPipeline::createGLBuffers()
noise[i].mV[2] = ll_frand()*scaler+1.f-scaler/2.f;
}
LLImageGL::generateTextures(LLTexUnit::TT_TEXTURE, GL_RGB16F_ARB, 1, &mNoiseMap);
LLImageGL::generateTextures(1, &mNoiseMap);
gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mNoiseMap);
LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_RGB16F_ARB, noiseRes, noiseRes, GL_RGB, GL_FLOAT, noise, false);
@ -1383,7 +1383,7 @@ void LLPipeline::createGLBuffers()
noise[i] = ll_frand()*2.0-1.0;
}
LLImageGL::generateTextures(LLTexUnit::TT_TEXTURE, GL_RGB16F_ARB, 1, &mTrueNoiseMap);
LLImageGL::generateTextures(1, &mTrueNoiseMap);
gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mTrueNoiseMap);
LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_RGB16F_ARB, noiseRes, noiseRes, GL_RGB,GL_FLOAT, noise, false);
gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
@ -1496,7 +1496,7 @@ void LLPipeline::createLUTBuffers()
//
pix_format = GL_R32F;
#endif
LLImageGL::generateTextures(LLTexUnit::TT_TEXTURE, pix_format, 1, &mLightFunc);
LLImageGL::generateTextures(1, &mLightFunc);
gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mLightFunc);
LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, pix_format, lightResX, lightResY, GL_RED, GL_FLOAT, ls, false);
//LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_UNSIGNED_BYTE, lightResX, lightResY, GL_RED, GL_UNSIGNED_BYTE, ls, false);