Improve eglGetString processing to exclude certain not support extensions

This commit is contained in:
Simon Fels 2016-09-29 13:17:24 +02:00
commit dd48136721

View file

@ -66,54 +66,52 @@ static EGLint rcQueryEGLString(EGLenum name, void* buffer, EGLint bufferSize)
static EGLint rcGetGLString(EGLenum name, void* buffer, EGLint bufferSize) static EGLint rcGetGLString(EGLenum name, void* buffer, EGLint bufferSize)
{ {
RenderThreadInfo *tInfo = RenderThreadInfo::get(); RenderThreadInfo *tInfo = RenderThreadInfo::get();
const char *str = NULL; std::string result;
int len = 0;
if (tInfo && tInfo->currContext.Ptr()) { if (tInfo && tInfo->currContext) {
if (tInfo->currContext->isGL2()) { const char *str = nullptr;
str = (const char *)s_gles2.glGetString(name); if (tInfo->currContext->isGL2())
} str = reinterpret_cast<const char*>(s_gles2.glGetString(name));
else { else
str = (const char *)s_gles1.glGetString(name); str = reinterpret_cast<const char*>(s_gles1.glGetString(name));
}
if (str) { if (str)
len = strlen(str) + 1; result += str;
}
} }
// We add the maximum supported GL protocol number into GL_EXTENSIONS
const char* glProtocolStr = NULL;
if (name == GL_EXTENSIONS) {
glProtocolStr = ChecksumCalculatorThreadInfo::getMaxVersionString();
if (len==0) len = 1; // the last byte
len += strlen(glProtocolStr) + 1;
}
if (name == GL_VERSION) {
// We're forcing version 2.0 no matter what the host provides as // We're forcing version 2.0 no matter what the host provides as
// our emulation layer isn't prepared for anything newer (yet). // our emulation layer isn't prepared for anything newer (yet).
// This goes in parallel with filtering the extension set for // This goes in parallel with filtering the extension set for
// any unwanted extensions. If we don't force the right version // any unwanted extensions. If we don't force the right version
// here certain parts of the system will assume API conditions // here certain parts of the system will assume API conditions
// which aren't met. // which aren't met.
static const char *version = "OpenGL ES 2.0"; if (name == GL_VERSION)
str = version; result = "OpenGL ES 2.0";
len = strlen(str) + 1; else if (name == GL_EXTENSIONS) {
} std::string approved_extensions = result;
if (!buffer || len > bufferSize) { std::vector<std::string> unsupported_extensions = {
return -len; // Leaving this enabled gives crippeled text rendering when
// using the host mesa GLES drivers.
"GL_EXT_unpack_subimage",
};
for (const auto &extension : unsupported_extensions) {
size_t start_pos = approved_extensions.find(extension);
if(start_pos == std::string::npos)
continue;
approved_extensions.replace(start_pos, extension.length(), "");
} }
if (name == GL_EXTENSIONS) { result = approved_extensions;
snprintf((char *)buffer, bufferSize, "%s%s ", str ? str : "", glProtocolStr);
} else if (str) {
strcpy((char *)buffer, str);
} else {
if (bufferSize >= 1) {
((char*)buffer)[0] = '\0';
} }
len = 0;
} int nextBufferSize = result.size() + 1;
return len;
if (!buffer || nextBufferSize > bufferSize)
return -nextBufferSize;
snprintf(static_cast<char*>(buffer), nextBufferSize, "%s", result.c_str());
return nextBufferSize;
} }
static EGLint rcGetNumConfigs(uint32_t* p_numAttribs) static EGLint rcGetNumConfigs(uint32_t* p_numAttribs)