OpenGL における開発効率を上げる目的で導入された OpenGL 拡張に KHR_debug と EXT_debug_marker/EXT_debug_label がある。その微妙な違いを比較してみる。後者は OSX 10.9 で導入されている。
いずれの拡張もドライバ側が実装していなくてもオープンソースである apitrace で実行すればエミュレートしてくれる。
上記の拡張があるので、glGetError を使ったやり方は非常に原始的であり、コードにいちいち埋め込むより apitrace を使えば視覚的に捕捉してくれる。ドライバが上記の拡張を持っているあるいは apitrace が利用可能な環境において glGetError を使うのは極力避けるべきである。
KHR_debug
ARB_debug_output の後継として実装された OpenGL 拡張。先の拡張に加えてEXT_debug_marker と EXT_debug_label の持つ機能を包括している。
EXT_debug_marker
元々 GREMEDY_string_marker というベンダ拡張からグルーピング可能にして使い勝手を上げて汎用的になった OpenGL 拡張。元々は Apple の拡張だった。
EXT_debug_label
数値のハンドルで取り扱う OpenGL のオブジェクトに名前を付加する OpenGL 拡張。EXT_debug_marker と同様元々 Apple の拡張だった。
本題はここからで、KHR_debug と EXT_debug_(marker|label) は関数名が違う上に場合によっては与えるべき引数も異なる。まず関数名を見てみよう。
KHR_debug | EXT_debug_marker | EXT_debug_label |
---|---|---|
glDebugMessageInsert | glInsertEventMarkerEXT | N/A |
glPushDebugGroup | glPushGroupMarkerEXT | N/A |
glPopDebugGroup | glPopGroupMarkerEXT | N/A |
glObjectLabel | N/A | glLabelObject |
glGetObjectLabel | N/A | glGetLabelObject |
見ての通りだが、名前が異なることがわかる。さらに仕様書にある関数のプロトタイプを見てみよう。
// KHR_debug
void DebugMessageInsert(enum source, enum type, uint id, enum severity, sizei length, const char* buf);
// EXT_debug_marker
void InsertEventMarkerEXT(sizei length, const char *marker);
// KHR_debug
void PushDebugGroup(enum source, uint id, sizei length, const char * message);
// EXT_debug_marker
void PushGroupMarkerEXT(sizei length, const char *marker);
// KHR_debug
void PopGroupMarkerEXT();
// EXT_debug_marker
void PopDebugGroup(void);
// KHR_debug
void ObjectLabel(enum identifier, uint name, sizei length, const char *label);
// EXT_debug_label
void LabelObjectEXT(enum type, uint object, sizei length, const char *label);
// KHR_debug
void GetObjectLabel(enum identifier, uint name, sizei bufSize, sizei *length, char *label);
// EXT_debug_label
void GetObjectLabelEXT(enum type, uint object, sizei bufSize, sizei *length, char *label);
関数の引数も Pop* 以外は全部異なる。しかも、NULl 文字終端の文字列渡すとき EXT_debug_(marker|label) は 0 で渡す必要があるが KHR_debug は -1 を渡す必要があるという罠にも注意が必要。
EXT_debug_(marker|label) よりも引数が多くより柔軟な設定が可能な KHR_debug について本当はまだ書かなければいけないことがたくさんあるように見えるが一旦ここまでにします...。