среда, 21 августа 2013 г.

Дополнительная проверка типов в OpenGL

В ноябре прошлого года Дмитрий Грибенко, разработчик компилятора clang из Киева, представил новое расширение clang: проверка типов в функциях, интерпретирующих тип аргумента A, переданного по указателю на void*, различными способами в зависимости от значения аргумента B.
Запутанная фраза, так что приведу пример. Вот объявления двух функций, способных принять массив вершин в разных форматах путём различной интерпретации указателя на void:

void glVertexPointer (GLint size, GLenum type, GLsizei stride,
                      const GLvoid *pointer);
void glNormalPointer (GLenum type, GLsizei stride,
                      const GLvoid *pointer);

А вот как они используются:
glVertexPointer(3, GL_DOUBLE, 0, m_verticies.front());
glNormalPointer(GL_DOUBLE, 0, m_normales.front());

Видеодрайвер смотрит на аргумент type и в зависимости от него интерпретирует аргумент pointer как указатель на массив float, double, unsigned int, unsigned byte или на что-то ещё.

Clang, начиная с версии clang 3.2, может проверять типы таких аргументов, причём для этого будет достаточно внести изменения в заголовочный файл gl.h либо в любое другое место между gl.h и вашим кодом. Изменения небольшие (в сравнении с шаблонными классами) и безопасные для остальных компиляторов.

Подробное описание есть в документации [1], а для демонстрации я добавил набольшой заголовочный файл на гитхаб: https://github.com/sergey-shambir/clang_opegl_typesafety.


[1] http://clang.llvm.org/docs/LanguageExtensions.html#type-safety-checking

Комментариев нет:

Отправить комментарий