Как мне использовать GLADcallback?
Я использую рад для создания привязок OpenGL, и сгенерировал сборку отладки, которая включает в себя следующее:
// this symbol only exists if generated with the c-debug generator
#define GLAD_DEBUG
typedef void (* GLADcallback)(const char *name, void *funcptr, int len_args, ...);
/*
* Sets a callback which will be called before every function call
* to a function loaded by glad.
*
*/
GLAPI void glad_set_pre_callback(GLADcallback cb);
/*
* Sets a callback which will be called after every function call
* to a function loaded by glad.
*
*/
GLAPI void glad_set_post_callback(GLADcallback cb);
В документации приведен пример определения этого обратного вызова, который выглядит следующим образом:
void _post_call_callback_default(const char *name, void *funcptr, int len_args, ...) {
GLenum error_code;
error_code = glad_glGetError();
if (error_code != GL_NO_ERROR) {
fprintf(stderr, "ERROR %d in %s\n", error_code, name);
}
}
Чего я не понимаю, так это как я должен получить доступ к варагам. Я предполагаю, что они являются значениями, которые передаются в функцию OpenGL, и, следовательно, могут быть любого типа. Тем не менее, я должен указать тип va_arg для доступа к значениям.
Я чувствую, что параметр len_args
намекает на то, что есть какой-то способ перебора varargs, но я не понимаю, как его использовать, не зная типов. Как они предназначены для использования?
1 ответ
У вас есть исходный код glad.c всякий раз, когда вызывается функция glad_set_post_callback. Там вы можете видеть, что параметры зависят от того, какая функция была вызвана. Поэтому я думаю, что вам нужно проверить параметр name/funcptr. Например, если был вызван glEnable, то у вас есть:
void APIENTRY glad_debug_impl_glEnable(GLenum arg0) {
_pre_call_callback("glEnable", (void*)glEnable, 1, arg0);
glad_glEnable(arg0);
_post_call_callback("glEnable", (void*)glEnable, 1, arg0);
}
Это означает, что первым параметром является GLenum. Посмотрите этот вопрос и пример использования varargs-in-c о том, как использовать переменные аргументы:
Было бы что-то вроде этого (не проверено):
void _post_call_callback_default(const char *name, void *funcptr, int len_args, ...) {
GLenum error_code;
error_code = glad_glGetError();
if (error_code != GL_NO_ERROR && funcptr == (void*)glEnable /* or strcmp(name,"glError") == 0*/) {
va_list ap;
va_start(ap, len_args);
GLenum arg0 = va_arg(ap, GLenum);
va_end(ap);
printf("Called glError(%d) with Error %d\n", arg0, error_code);
}
}
Вы можете решить, для каких функций вы хотите лучший журнал отладки. Я не знаю, есть ли уже некоторый бесплатный код, который дает лучший результат отладки.
Может быть, лучше сравнить funcptr с указателем на glEnable, а не сравнивать имя строки с "glError". Я не проверял это. Приведенный выше код является лишь примером, я бы написал по-другому.