示例#1
0
static inline GLuint
__glDrawElements_maxindex(GLsizei count, GLenum type, const GLvoid *indices)
{
    GLvoid *temp = 0;
    GLint __element_array_buffer = 0;
    __glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &__element_array_buffer);
    if (__element_array_buffer) {
        // Read indices from index buffer object
        GLintptr offset = (GLintptr)indices;
        GLsizeiptr size = count*__gl_type_size(type);
        GLvoid *temp = malloc(size);
        if (!temp) {
            return 0;
        }
        memset(temp, 0, size);
        __glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, offset, size, temp);
        indices = temp;
    } else {
        if (!indices) {
            return 0;
        }
    }

    GLuint maxindex = 0;
    GLsizei i;
    if (type == GL_UNSIGNED_BYTE) {
        const GLubyte *p = (const GLubyte *)indices;
        for (i = 0; i < count; ++i) {
            if (p[i] > maxindex) {
                maxindex = p[i];
            }
        }
    } else if (type == GL_UNSIGNED_SHORT) {
        const GLushort *p = (const GLushort *)indices;
        for (i = 0; i < count; ++i) {
            if (p[i] > maxindex) {
                maxindex = p[i];
            }
        }
    } else if (type == GL_UNSIGNED_INT) {
        const GLuint *p = (const GLuint *)indices;
        for (i = 0; i < count; ++i) {
            if (p[i] > maxindex) {
                maxindex = p[i];
            }
        }
    } else {
        OS::DebugMessage("warning: %s: unknown GLenum 0x%04X\n", __FUNCTION__, type);
    }

    if (__element_array_buffer) {
        free(temp);
    }

    return maxindex;
}
示例#2
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;
        }
    }
}
示例#3
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);
}