Merge branch 'V2MultiWear' of git://github.com/Shyotl/SingularityViewer

This commit is contained in:
Lirusaito
2012-07-16 17:10:01 -04:00
6 changed files with 34 additions and 70 deletions

View File

@@ -435,11 +435,7 @@ LLGLManager::LLGLManager() :
mHasPointParameters(FALSE), mHasPointParameters(FALSE),
mHasDrawBuffers(FALSE), mHasDrawBuffers(FALSE),
mHasTextureRectangle(FALSE), mHasTextureRectangle(FALSE),
mHasTextureMultisample(FALSE),
mHasTransformFeedback(FALSE), mHasTransformFeedback(FALSE),
mMaxSampleMaskWords(0),
mMaxColorTextureSamples(0),
mMaxDepthTextureSamples(0),
mMaxIntegerSamples(0), mMaxIntegerSamples(0),
mHasAnisotropic(FALSE), mHasAnisotropic(FALSE),
@@ -732,12 +728,10 @@ bool LLGLManager::initGL()
stop_glerror(); stop_glerror();
if (mHasTextureMultisample) if (mHasFramebufferMultisample)
{ {
glGetIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &mMaxColorTextureSamples);
glGetIntegerv(GL_MAX_DEPTH_TEXTURE_SAMPLES, &mMaxDepthTextureSamples);
glGetIntegerv(GL_MAX_INTEGER_SAMPLES, &mMaxIntegerSamples); glGetIntegerv(GL_MAX_INTEGER_SAMPLES, &mMaxIntegerSamples);
glGetIntegerv(GL_MAX_SAMPLE_MASK_WORDS, &mMaxSampleMaskWords); glGetIntegerv(GL_MAX_SAMPLES, &mMaxSamples);
} }
stop_glerror(); stop_glerror();
@@ -749,24 +743,12 @@ bool LLGLManager::initGL()
} }
#endif #endif
stop_glerror(); stop_glerror();
mHasTextureMultisample = FALSE;
#if LL_WINDOWS
if (mIsATI)
{ //using multisample textures on ATI results in black screen for some reason
mHasTextureMultisample = FALSE;
}
#endif
if (mIsIntel && mGLVersion <= 3.f) if (mIsIntel && mGLVersion <= 3.f)
{ //never try to use framebuffer objects on older intel drivers (crashy) { //never try to use framebuffer objects on older intel drivers (crashy)
mHasFramebufferObject = FALSE; mHasFramebufferObject = FALSE;
} }
if (mHasFramebufferObject)
{
glGetIntegerv(GL_MAX_SAMPLES, &mMaxSamples);
}
stop_glerror(); stop_glerror();
setToDebugGPU(); setToDebugGPU();
@@ -847,14 +829,6 @@ std::string LLGLManager::getRawGLString()
return gl_string; return gl_string;
} }
U32 LLGLManager::getNumFBOFSAASamples(U32 samples)
{
samples = llmin(samples, (U32) mMaxColorTextureSamples);
samples = llmin(samples, (U32) mMaxDepthTextureSamples);
samples = llmin(samples, (U32) 4);
return samples;
}
void LLGLManager::shutdownGL() void LLGLManager::shutdownGL()
{ {
if (mInited) if (mInited)
@@ -960,7 +934,6 @@ void LLGLManager::initExtensions()
mHasDrawBuffers = ExtensionExists("GL_ARB_draw_buffers", gGLHExts.mSysExts); mHasDrawBuffers = ExtensionExists("GL_ARB_draw_buffers", gGLHExts.mSysExts);
mHasBlendFuncSeparate = ExtensionExists("GL_EXT_blend_func_separate", gGLHExts.mSysExts); mHasBlendFuncSeparate = ExtensionExists("GL_EXT_blend_func_separate", gGLHExts.mSysExts);
mHasTextureRectangle = ExtensionExists("GL_ARB_texture_rectangle", gGLHExts.mSysExts); mHasTextureRectangle = ExtensionExists("GL_ARB_texture_rectangle", gGLHExts.mSysExts);
mHasTextureMultisample = ExtensionExists("GL_ARB_texture_multisample", gGLHExts.mSysExts);
mHasDebugOutput = ExtensionExists("GL_ARB_debug_output", gGLHExts.mSysExts); mHasDebugOutput = ExtensionExists("GL_ARB_debug_output", gGLHExts.mSysExts);
mHasTransformFeedback = mGLVersion >= 4.f ? TRUE : FALSE; mHasTransformFeedback = mGLVersion >= 4.f ? TRUE : FALSE;
#if !LL_DARWIN #if !LL_DARWIN
@@ -1198,13 +1171,6 @@ void LLGLManager::initExtensions()
{ {
glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glBlendFuncSeparateEXT"); glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glBlendFuncSeparateEXT");
} }
if (mHasTextureMultisample)
{
glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC) GLH_EXT_GET_PROC_ADDRESS("glTexImage2DMultisample");
glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC) GLH_EXT_GET_PROC_ADDRESS("glTexImage3DMultisample");
glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC) GLH_EXT_GET_PROC_ADDRESS("glGetMultisamplefv");
glSampleMaski = (PFNGLSAMPLEMASKIPROC) GLH_EXT_GET_PROC_ADDRESS("glSampleMaski");
}
if (mHasTransformFeedback) if (mHasTransformFeedback)
{ {
glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC) GLH_EXT_GET_PROC_ADDRESS("glBeginTransformFeedback"); glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC) GLH_EXT_GET_PROC_ADDRESS("glBeginTransformFeedback");

View File

@@ -104,11 +104,7 @@ public:
BOOL mHasDrawBuffers; BOOL mHasDrawBuffers;
BOOL mHasDepthClamp; BOOL mHasDepthClamp;
BOOL mHasTextureRectangle; BOOL mHasTextureRectangle;
BOOL mHasTextureMultisample;
BOOL mHasTransformFeedback; BOOL mHasTransformFeedback;
S32 mMaxSampleMaskWords;
S32 mMaxColorTextureSamples;
S32 mMaxDepthTextureSamples;
S32 mMaxIntegerSamples; S32 mMaxIntegerSamples;
// Other extensions. // Other extensions.
@@ -155,7 +151,6 @@ public:
void printGLInfoString(); void printGLInfoString();
void getGLInfo(LLSD& info); void getGLInfo(LLSD& info);
U32 getNumFBOFSAASamples(U32 desired_samples = 32);
// In ALL CAPS // In ALL CAPS
std::string mGLVendor; std::string mGLVendor;
std::string mGLVendorShort; std::string mGLVendorShort;

View File

@@ -330,7 +330,6 @@ S32 LLImageGL::updateBoundTexMem(const S32 mem, const S32 ncomponents, S32 categ
//static //static
void LLImageGL::destroyGL(BOOL save_state) void LLImageGL::destroyGL(BOOL save_state)
{ {
deleteDeadTextures(); //Dump unimportant textures.
for (S32 stage = 0; stage < gGLManager.mNumTextureUnits; stage++) for (S32 stage = 0; stage < gGLManager.mNumTextureUnits; stage++)
{ {
gGL.getTexUnit(stage)->unbind(LLTexUnit::TT_TEXTURE); gGL.getTexUnit(stage)->unbind(LLTexUnit::TT_TEXTURE);
@@ -364,7 +363,6 @@ void LLImageGL::destroyGL(BOOL save_state)
} }
llinfos << "Storing " << stored_count << " images..." << llendl; llinfos << "Storing " << stored_count << " images..." << llendl;
sAllowReadBackRaw = false ; sAllowReadBackRaw = false ;
deleteDeadTextures();//Now, actually call glDeleteTextures for everything.
} }
//static //static
@@ -1528,7 +1526,7 @@ void LLImageGL::deleteDeadTextures()
{ {
bool reset = false; bool reset = false;
for(U32 i=0;i<LLTexUnit::TT_NONE;++i) /*for(U32 i=0;i<LLTexUnit::TT_NONE;++i)
{ {
for(dead_texturelist_t::iterator it=sDeadTextureList[i].begin();it!=sDeadTextureList[i].end();++it) for(dead_texturelist_t::iterator it=sDeadTextureList[i].begin();it!=sDeadTextureList[i].end();++it)
{ {
@@ -1554,7 +1552,7 @@ void LLImageGL::deleteDeadTextures()
stop_glerror(); stop_glerror();
} }
} }
} }*/
if (reset) if (reset)
{ {

View File

@@ -699,6 +699,28 @@ bool LLMultisampleBuffer::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth
release(); release();
stop_glerror(); stop_glerror();
if (!gGLManager.mHasFramebufferMultisample || !gGLManager.mHasFramebufferObject || !(sUseFBO || use_fbo))
return false;
if(color_fmt != GL_RGBA)
{
llwarns << "Unsupported color format: " << color_fmt << llendl;
return false;
}
//Restrict to valid sample count
{
mSamples = samples;
mSamples = llmin(mSamples, (U32)4); //Cap to prevent memory bloat.
mSamples = llmin(mSamples, (U32) gGLManager.mMaxIntegerSamples);//GL_RGBA
if(depth && !stencil)
mSamples = llmin(mSamples, (U32) gGLManager.mMaxSamples); //GL_DEPTH_COMPONENT16_ARB
}
if (mSamples <= 1)
return false;
mResX = resx; mResX = resx;
mResY = resy; mResY = resy;
@@ -706,30 +728,16 @@ bool LLMultisampleBuffer::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth
mUseDepth = depth; mUseDepth = depth;
mStencil = stencil; mStencil = stencil;
if (!gGLManager.mHasFramebufferMultisample)
{
llerrs << "Attempting to allocate unsupported render target type!" << llendl;
return false;
}
mSamples = gGLManager.getNumFBOFSAASamples(samples);
if (mSamples <= 1)
{
llerrs << "Cannot create a multisample buffer with less than 2 samples." << llendl;
return false;
}
stop_glerror();
if ((sUseFBO || use_fbo) && gGLManager.mHasFramebufferObject)
{ {
if (depth) if (depth)
{ {
stop_glerror(); stop_glerror();
if(!allocateDepth()) if(!allocateDepth())
{
release();
return false; return false;
}
stop_glerror(); stop_glerror();
} }
glGenFramebuffers(1, (GLuint *) &mFBO); glGenFramebuffers(1, (GLuint *) &mFBO);
@@ -779,6 +787,7 @@ bool LLMultisampleBuffer::addColorAttachment(U32 color_fmt)
if (glGetError() != GL_NO_ERROR) if (glGetError() != GL_NO_ERROR)
{ {
llwarns << "Unable to allocate color buffer for multisample render target." << llendl; llwarns << "Unable to allocate color buffer for multisample render target." << llendl;
release();
return false; return false;
} }

View File

@@ -343,7 +343,7 @@ void LLViewerShaderMgr::setShaders()
//setup preprocessor definitions //setup preprocessor definitions
LLShaderMgr::instance()->mDefinitions.clear(); LLShaderMgr::instance()->mDefinitions.clear();
LLShaderMgr::instance()->mDefinitions["samples"] = llformat("%d", gSavedSettings.getU32("RenderFSAASamples")/*gGLManager.getNumFBOFSAASamples(gSavedSettings.getU32("RenderFSAASamples"))*/); LLShaderMgr::instance()->mDefinitions["samples"] = llformat("%d", gSavedSettings.getU32("RenderFSAASamples"));
LLShaderMgr::instance()->mDefinitions["NUM_TEX_UNITS"] = llformat("%d", gGLManager.mNumTextureImageUnits); LLShaderMgr::instance()->mDefinitions["NUM_TEX_UNITS"] = llformat("%d", gGLManager.mNumTextureImageUnits);
initAttribsAndUniforms(); initAttribsAndUniforms();

View File

@@ -632,12 +632,6 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
static const LLCachedControl<U32> RenderFSAASamples("RenderFSAASamples",0); static const LLCachedControl<U32> RenderFSAASamples("RenderFSAASamples",0);
U32 samples = RenderFSAASamples.get() - RenderFSAASamples.get() % 2; //Must be multipe of 2. U32 samples = RenderFSAASamples.get() - RenderFSAASamples.get() % 2; //Must be multipe of 2.
//Don't multisample if not using FXAA, or if fbos are disabled, or if multisampled fbos are not supported.
if(!LLPipeline::sRenderDeferred && (!LLRenderTarget::sUseFBO || !gGLManager.mHasFramebufferMultisample))
{
samples = 0;
}
//try to allocate screen buffers at requested resolution and samples //try to allocate screen buffers at requested resolution and samples
// - on failure, shrink number of samples and try again // - on failure, shrink number of samples and try again
// - if not multisampled, shrink resolution and try again (favor X resolution over Y) // - if not multisampled, shrink resolution and try again (favor X resolution over Y)
@@ -693,6 +687,7 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
} }
mSampleBuffer.release(); mSampleBuffer.release();
mScreen.release();
if (LLPipeline::sRenderDeferred) if (LLPipeline::sRenderDeferred)
{ {
@@ -790,7 +785,6 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
if (!mScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) return false; if (!mScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE)) return false;
if(samples > 1) if(samples > 1)
{ {
if(mSampleBuffer.allocate(resX,resY,GL_RGBA,TRUE,TRUE,LLTexUnit::TT_RECT_TEXTURE,FALSE,samples)) if(mSampleBuffer.allocate(resX,resY,GL_RGBA,TRUE,TRUE,LLTexUnit::TT_RECT_TEXTURE,FALSE,samples))
mScreen.setSampleBuffer(&mSampleBuffer); mScreen.setSampleBuffer(&mSampleBuffer);
else else
@@ -906,6 +900,8 @@ void LLPipeline::releaseScreenBuffers()
{ {
mShadow[i].release(); mShadow[i].release();
} }
mSampleBuffer.release();
} }