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; }
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; } } }
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); }