我如何使用 GLADcallback?
How do I use GLADcallback?
我正在使用 glad 生成 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
暗示有一些方法可以迭代可变参数,但我不明白在不知道类型的情况下应该如何使用它。它们应该如何使用?
只要 glad_set_post_callback 函数被调用,您就有了 glad.c 的源代码。在那里您可以看到参数取决于调用的函数。所以我认为你需要检查 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。关于如何使用可变参数,请参阅此问题an-example-of-use-of-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" 进行比较。我没有测试它。上面的代码只是一个例子,我会写成不同的。
我正在使用 glad 生成 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
暗示有一些方法可以迭代可变参数,但我不明白在不知道类型的情况下应该如何使用它。它们应该如何使用?
只要 glad_set_post_callback 函数被调用,您就有了 glad.c 的源代码。在那里您可以看到参数取决于调用的函数。所以我认为你需要检查 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。关于如何使用可变参数,请参阅此问题an-example-of-use-of-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" 进行比较。我没有测试它。上面的代码只是一个例子,我会写成不同的。