mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Update gpu_features.cpp
Add additional check for valid parsing GL ES version by driver for work on some bad drivers. See #9688
This commit is contained in:
parent
ad84058d3a
commit
f7deda22ae
1 changed files with 21 additions and 9 deletions
|
@ -139,15 +139,15 @@ void CheckGLExtensions() {
|
||||||
strncpy(gl_extensions.model, renderer, sizeof(gl_extensions.model));
|
strncpy(gl_extensions.model, renderer, sizeof(gl_extensions.model));
|
||||||
gl_extensions.model[sizeof(gl_extensions.model) - 1] = 0;
|
gl_extensions.model[sizeof(gl_extensions.model) - 1] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!gl_extensions.IsGLES) {
|
// Start by assuming we're at 2.0.
|
||||||
// For desktop GL, grab the version and attempt to parse.
|
int parsed[2] = {2, 0};
|
||||||
|
{ // Grab the version and attempt to parse.
|
||||||
char buffer[64] = { 0 };
|
char buffer[64] = { 0 };
|
||||||
if (versionStr) {
|
if (versionStr) {
|
||||||
strncpy(buffer, versionStr, 63);
|
strncpy(buffer, versionStr, 63);
|
||||||
}
|
}
|
||||||
// Start by assuming we're at 2.0.
|
|
||||||
gl_extensions.ver[0] = 2;
|
|
||||||
int len = (int)strlen(buffer);
|
int len = (int)strlen(buffer);
|
||||||
bool beforeDot = true;
|
bool beforeDot = true;
|
||||||
int lastDigit = 0;
|
int lastDigit = 0;
|
||||||
|
@ -155,18 +155,23 @@ void CheckGLExtensions() {
|
||||||
if (buffer[i] >= '0' && buffer[i] <= '9') {
|
if (buffer[i] >= '0' && buffer[i] <= '9') {
|
||||||
lastDigit = buffer[i] - '0';
|
lastDigit = buffer[i] - '0';
|
||||||
if (!beforeDot) {
|
if (!beforeDot) {
|
||||||
gl_extensions.ver[1] = lastDigit;
|
parsed[1] = lastDigit;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (beforeDot && buffer[i] == '.' && lastDigit) {
|
if (beforeDot && buffer[i] == '.' && lastDigit) {
|
||||||
gl_extensions.ver[0] = lastDigit;
|
parsed[0] = lastDigit;
|
||||||
beforeDot = false;
|
beforeDot = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (beforeDot && lastDigit) {
|
if (beforeDot && lastDigit) {
|
||||||
gl_extensions.ver[0] = lastDigit;
|
parsed[0] = lastDigit;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!gl_extensions.IsGLES) { // For desktop GL
|
||||||
|
gl_extensions.ver[0] = parsed[0];
|
||||||
|
gl_extensions.ver[1] = parsed[1];
|
||||||
|
|
||||||
// If the GL version >= 4.3, we know it's a true superset of OpenGL ES 3.0 and can thus enable
|
// If the GL version >= 4.3, we know it's a true superset of OpenGL ES 3.0 and can thus enable
|
||||||
// all the same modern paths.
|
// all the same modern paths.
|
||||||
|
@ -189,6 +194,13 @@ void CheckGLExtensions() {
|
||||||
// They weren't, reset to GLES 2.0.
|
// They weren't, reset to GLES 2.0.
|
||||||
gl_extensions.ver[0] = 2;
|
gl_extensions.ver[0] = 2;
|
||||||
gl_extensions.ver[1] = 0;
|
gl_extensions.ver[1] = 0;
|
||||||
|
} else if (parsed[0] && (gl_extensions.ver[0] != parsed[0] || gl_extensions.ver[1] != parsed[1])) {
|
||||||
|
// Something going wrong. Possible bug in GL ES drivers. See #9688
|
||||||
|
ILOG("GL ES version mismatch. Version string '%s' parsed as %d.%d but API return %d.%d. Fallback to GL ES 2.0.",
|
||||||
|
versionStr ? versionStr : "N/A", parsed[0], parsed[1], gl_extensions.ver[0], gl_extensions.ver[1]);
|
||||||
|
|
||||||
|
gl_extensions.ver[0] = 2;
|
||||||
|
gl_extensions.ver[1] = 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue