[Android] Qualcomm glGetShaderInfoLog returns a max of 1024 bytes(tested) for the log, and glGetShaderiv with GL_INFO_LOG_LENGTH /always/ returns 0 on compile failure.

This commit is contained in:
Ryan Houdek 2013-06-18 10:24:36 -05:00
parent fbb82ccab3
commit 6143594db6
3 changed files with 15 additions and 6 deletions

View File

@ -28,6 +28,7 @@ namespace DriverDetails
BugInfo m_qualcommbugs[] = { BugInfo m_qualcommbugs[] = {
{BUG_NODYNUBOACCESS, 300, 14.0, -1.0}, {BUG_NODYNUBOACCESS, 300, 14.0, -1.0},
{BUG_BROKENCENTROID, 300, 14.0, -1.0}, {BUG_BROKENCENTROID, 300, 14.0, -1.0},
{BUG_BROKENINFOLOG, 300, -1.0, -1.0},
}; };
std::map<std::pair<Vendor, Bug>, BugInfo> m_bugs; std::map<std::pair<Vendor, Bug>, BugInfo> m_bugs;

View File

@ -42,6 +42,16 @@ namespace DriverDetails
// When MSAA is disabled, it acts like a regular in/out // When MSAA is disabled, it acts like a regular in/out
// Tends to cause the driver to render full white or black // Tends to cause the driver to render full white or black
BUG_BROKENCENTROID, BUG_BROKENCENTROID,
// Bug: INFO_LOG_LENGTH broken
// Affected devices: Qualcomm/Adreno
// Started Version: ? (Noticed on v14)
// Ended Version: -1
// When compiling a shader, it is important that when it fails,
// you first get the length of the information log prior to grabbing it.
// This allows you to allocate an array to store all of the log
// Adreno devices /always/ return 0 when querying GL_INFO_LOG_LENGTH
// They also max out at 1024 bytes(1023 characters + null terminator) for the log
BUG_BROKENINFOLOG,
}; };
// Initializes our internal vendor, device family, and driver version // Initializes our internal vendor, device family, and driver version

View File

@ -335,15 +335,13 @@ GLuint ProgramShaderCache::CompileSingleShader (GLuint type, const char* code )
glGetShaderiv(result, GL_COMPILE_STATUS, &compileStatus); glGetShaderiv(result, GL_COMPILE_STATUS, &compileStatus);
GLsizei length = 0; GLsizei length = 0;
glGetShaderiv(result, GL_INFO_LOG_LENGTH, &length); glGetShaderiv(result, GL_INFO_LOG_LENGTH, &length);
if (DriverDetails::HasBug(DriverDetails::BUG_BROKENINFOLOG))
length = 1024;
if (compileStatus != GL_TRUE || (length > 1 && DEBUG_GLSL)) if (compileStatus != GL_TRUE || (length > 1 && DEBUG_GLSL))
{ {
GLsizei charsWritten; GLsizei charsWritten;
#ifdef USE_GLES3
// This is a bug in the Qualcomm OpenGL Driver
// The length returned is garbage length so we need to set a default max
// XXX: Check if qualcomm driver here
length = 1024; // Qualcomm driver maxes out at 512 bytes returned from glGetShaderInfoLog anyway
#endif
GLchar* infoLog = new GLchar[length]; GLchar* infoLog = new GLchar[length];
glGetShaderInfoLog(result, length, &charsWritten, infoLog); glGetShaderInfoLog(result, length, &charsWritten, infoLog);
ERROR_LOG(VIDEO, "PS Shader info log:\n%s", infoLog); ERROR_LOG(VIDEO, "PS Shader info log:\n%s", infoLog);