Как мне использовать GLADcallback? - PullRequest
0 голосов
/ 01 февраля 2019

Я использую рад для генерации привязок 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 Ответ

0 голосов
/ 01 февраля 2019

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

...