Как мне использовать 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". Я не проверял это. Приведенный выше код является лишь примером, я бы написал по-другому.

Другие вопросы по тегам