SL-17967 Fix for confounding program and shader objects when fetching logs and fix for gl errors on AMD windows

master
Dave Parks 2022-09-02 21:05:53 -05:00
parent 4c2b80fd00
commit 60cc58fbfc
4 changed files with 54 additions and 13 deletions

View File

@ -86,13 +86,13 @@ void APIENTRY gl_debug_callback(GLenum source,
const GLchar* message,
GLvoid* userParam)
{
if (severity != GL_DEBUG_SEVERITY_HIGH_ARB // &&
//severity != GL_DEBUG_SEVERITY_MEDIUM_ARB &&
//severity != GL_DEBUG_SEVERITY_LOW_ARB
/*if (severity != GL_DEBUG_SEVERITY_HIGH_ARB // &&
severity != GL_DEBUG_SEVERITY_MEDIUM_ARB &&
severity != GL_DEBUG_SEVERITY_LOW_ARB
)
{ //suppress out-of-spec messages sent by nvidia driver (mostly vertexbuffer hints)
return;
}
}*/
if (severity == GL_DEBUG_SEVERITY_HIGH_ARB)
{
@ -1628,7 +1628,7 @@ void LLGLManager::initExtensions()
mHasMipMapGeneration = mHasFramebufferObject || mGLVersion >= 1.4f;
mHasBlendFuncSeparate = ExtensionExists("GL_EXT_blend_func_separate", gGLHExts.mSysExts);
mHasDebugOutput = ExtensionExists("GL_ARB_debug_output", gGLHExts.mSysExts);
mHasDebugOutput = mGLVersion >= 4.3f ? TRUE : FALSE;
mHasTransformFeedback = mGLVersion >= 4.f ? TRUE : FALSE;
#endif

View File

@ -348,13 +348,20 @@ void LLGLSLShader::unloadInternal()
if (mProgramObject)
{
GLuint obj[1024];
GLsizei count;
GLsizei count = 0;
glGetAttachedShaders(mProgramObject, 1024, &count, obj);
for (GLsizei i = 0; i < count; i++)
{
glDetachShader(mProgramObject, obj[i]);
glDeleteShader(obj[i]);
}
for (GLsizei i = 0; i < count; i++)
{
if (glIsShader(obj[i]))
{
glDeleteShader(obj[i]);
}
}
glDeleteProgram(mProgramObject);

View File

@ -876,8 +876,8 @@ void LLRender::init()
if (gGLManager.mHasDebugOutput && gDebugGL)
{ //setup debug output callback
//glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_LOW_ARB, 0, NULL, GL_TRUE);
glDebugMessageCallback((GLDEBUGPROCARB) gl_debug_callback, NULL);
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB);
glDebugMessageCallback((GLDEBUGPROC) gl_debug_callback, NULL);
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
}
#endif

View File

@ -558,7 +558,7 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
//============================================================================
// Load Shader
static std::string get_object_log(GLuint ret)
static std::string get_shader_log(GLuint ret)
{
std::string res;
@ -569,13 +569,46 @@ static std::string get_object_log(GLuint ret)
{
//the log could be any size, so allocate appropriately
GLchar* log = new GLchar[length];
glGetProgramInfoLog(ret, length, &length, log);
glGetShaderInfoLog(ret, length, &length, log);
res = std::string((char *)log);
delete[] log;
}
return res;
}
static std::string get_program_log(GLuint ret)
{
std::string res;
//get log length
GLint length;
glGetProgramiv(ret, GL_INFO_LOG_LENGTH, &length);
if (length > 0)
{
//the log could be any size, so allocate appropriately
GLchar* log = new GLchar[length];
glGetProgramInfoLog(ret, length, &length, log);
res = std::string((char*)log);
delete[] log;
}
return res;
}
// get the info log for the given object, be it a shader or program object
// NOTE: ret MUST be a shader OR a program object
static std::string get_object_log(GLuint ret)
{
if (glIsProgram(ret))
{
return get_program_log(ret);
}
else
{
llassert(glIsShader(ret));
return get_shader_log(ret);
}
}
//dump shader source for debugging
void LLShaderMgr::dumpShaderSource(U32 shader_code_count, GLchar** shader_code_text)
{
@ -594,7 +627,8 @@ void LLShaderMgr::dumpShaderSource(U32 shader_code_count, GLchar** shader_code_t
void LLShaderMgr::dumpObjectLog(GLuint ret, BOOL warns, const std::string& filename)
{
std::string log = get_object_log(ret);
std::string log;
log = get_object_log(ret);
std::string fname = filename;
if (filename.empty())
{
@ -1078,7 +1112,7 @@ BOOL LLShaderMgr::linkProgramObject(GLuint obj, BOOL suppress_errors)
return success;
}
std::string log = get_object_log(obj);
std::string log = get_program_log(obj);
LLStringUtil::toLower(log);
if (log.find("software") != std::string::npos)
{