Beispiel #1
0
void
_glGetIntegerv_override(GLenum pname, GLint *params)
{
    _glGetIntegerv(pname, params);

    if (params) {
        const Context *ctx;
        switch (pname) {
        case GL_NUM_EXTENSIONS:
            ctx = getContext();
            if (ctx->profile.major >= 3) {
                const ExtensionsDesc *desc = getExtraExtensions(ctx);
                *params += desc->numStrings;
            }
            break;
        case GL_MAX_LABEL_LENGTH:
            /* We provide our default implementation of KHR_debug when the
             * driver does not.  So return something sensible here.
             */
            if (params[0] == 0) {
                params[0] = 256;
            }
            break;
        default:
            break;
        }
    }
}
Beispiel #2
0
/**
 * Translate the GL extensions string, adding new extensions.
 */
static const char *
overrideExtensionsString(const char *extensions)
{
    const Context *ctx = getContext();
    const ExtensionsDesc *desc = getExtraExtensions(ctx);
    size_t i;

    ExtensionsMap::const_iterator it = extensionsMap.find(extensions);
    if (it != extensionsMap.end()) {
        return it->second;
    }

    size_t extensionsLen = strlen(extensions);

    size_t extraExtensionsLen = 0;
    for (i = 0; i < desc->numStrings; ++i) {
        const char * extraExtension = desc->strings[i];
        size_t extraExtensionLen = strlen(extraExtension);
        extraExtensionsLen += extraExtensionLen + 1;
    }

    // We use malloc memory instead of a std::string because we need to ensure
    // that extensions strings will not move in memory as the extensionsMap is
    // updated.
    size_t newExtensionsLen = extensionsLen + 1 + extraExtensionsLen + 1;
    char *newExtensions = (char *)malloc(newExtensionsLen);
    if (!newExtensions) {
        return extensions;
    }

    if (extensionsLen) {
        memcpy(newExtensions, extensions, extensionsLen);

        // Add space separator if necessary
        if (newExtensions[extensionsLen - 1] != ' ') {
            newExtensions[extensionsLen++] = ' ';
        }
    }

    for (i = 0; i < desc->numStrings; ++i) {
        const char * extraExtension = desc->strings[i];
        size_t extraExtensionLen = strlen(extraExtension);
        memcpy(newExtensions + extensionsLen, extraExtension, extraExtensionLen);
        extensionsLen += extraExtensionLen;
        newExtensions[extensionsLen++] = ' ';
    }
    newExtensions[extensionsLen++] = '\0';
    assert(extensionsLen <= newExtensionsLen);

    extensionsMap[extensions] = newExtensions;

    return newExtensions;
}
Beispiel #3
0
void
_glGetIntegerv_override(GLenum pname, GLint *params)
{
    _glGetIntegerv(pname, params);

    if (params) {
        switch (pname) {
        case GL_NUM_EXTENSIONS:
            {
                const ExtensionsDesc *desc = getExtraExtensions();
                *params += desc->numStrings;
            }
            break;
        default:
            break;
        }
    }
}
Beispiel #4
0
const GLubyte *
_glGetStringi_override(GLenum name, GLuint index)
{
    switch (name) {
    case GL_EXTENSIONS:
        {
            const ExtensionsDesc *desc = getExtraExtensions();
            GLint numExtensions = 0;
            _glGetIntegerv(GL_NUM_EXTENSIONS, &numExtensions);
            if ((GLuint)numExtensions <= index && index < (GLuint)numExtensions + desc->numStrings) {
                return (const GLubyte *)desc->strings[index - (GLuint)numExtensions];
            }
        }
        break;
    default:
        break;
    }

    return _glGetStringi(name, index);
}