是否有查询 EGL 错误字符串的标准方法?
Is there a standard way to query EGL error string?
目前我转换 eglGetError()
结果的函数如下所示:
std::string eglErrorString(EGLint error)
{
switch(error)
{
case EGL_SUCCESS: return "No error";
case EGL_NOT_INITIALIZED: return "EGL not initialized or failed to initialize";
case EGL_BAD_ACCESS: return "Resource inaccessible";
case EGL_BAD_ALLOC: return "Cannot allocate resources";
case EGL_BAD_ATTRIBUTE: return "Unrecognized attribute or attribute value";
case EGL_BAD_CONTEXT: return "Invalid EGL context";
case EGL_BAD_CONFIG: return "Invalid EGL frame buffer configuration";
case EGL_BAD_CURRENT_SURFACE: return "Current surface is no longer valid";
case EGL_BAD_DISPLAY: return "Invalid EGL display";
case EGL_BAD_SURFACE: return "Invalid surface";
case EGL_BAD_MATCH: return "Inconsistent arguments";
case EGL_BAD_PARAMETER: return "Invalid argument";
case EGL_BAD_NATIVE_PIXMAP: return "Invalid native pixmap";
case EGL_BAD_NATIVE_WINDOW: return "Invalid native window";
case EGL_CONTEXT_LOST: return "Context lost";
}
return "Unknown error "+to_hex_string(int(error));
}
但是例如OpenGL 本身就有gluErrorString()
,这使我们不必手动维护错误列表。
EGL 有类似 gluErrorString()
的东西吗?
绝对不是 EGL 本身的一部分。而且我认为它不应该在那里。 EGL 是低级 window 系统接口。生成用户可读的字符串真的不是它的工作。
您可能认为拥有一个生成几个字符串的函数是微不足道且无害的。但由于这是用户可读的字符串,您几乎不得不考虑国际化。这意味着您可以获得各种语言的字符串,包括使用不同字符集的字符串。所以看起来简单的事情突然变得复杂得多。至少在我看来,仅支持英文字符串是非常随意的。
更重要的是,将错误代码转换为字符串在概念上不是 API 的一部分,它提供了 window 系统的接口。恕我直言,这些类型的 API 应该是最少的。在这种情况下,它应该完全提供与window系统交互所需的功能,仅此而已。
当然,没有人会阻止您(或其他任何人)实施提供此类功能的更高级别的库。这正是 GLU(gluErrorString()
的来源)用于 OpenGL 的原因。它提供了一些基于 OpenGL 的常用功能。
上一段中谈到 GLU 时故意使用过去时。它建立在上个千年的 OpenGL 功能之上。
宏 stringification 可以节省您的输入时间:
#define CASE_STR( value ) case value: return #value;
const char* eglGetErrorString( EGLint error )
{
switch( error )
{
CASE_STR( EGL_SUCCESS )
CASE_STR( EGL_NOT_INITIALIZED )
CASE_STR( EGL_BAD_ACCESS )
CASE_STR( EGL_BAD_ALLOC )
CASE_STR( EGL_BAD_ATTRIBUTE )
CASE_STR( EGL_BAD_CONTEXT )
CASE_STR( EGL_BAD_CONFIG )
CASE_STR( EGL_BAD_CURRENT_SURFACE )
CASE_STR( EGL_BAD_DISPLAY )
CASE_STR( EGL_BAD_SURFACE )
CASE_STR( EGL_BAD_MATCH )
CASE_STR( EGL_BAD_PARAMETER )
CASE_STR( EGL_BAD_NATIVE_PIXMAP )
CASE_STR( EGL_BAD_NATIVE_WINDOW )
CASE_STR( EGL_CONTEXT_LOST )
default: return "Unknown";
}
}
#undef CASE_STR
目前我转换 eglGetError()
结果的函数如下所示:
std::string eglErrorString(EGLint error)
{
switch(error)
{
case EGL_SUCCESS: return "No error";
case EGL_NOT_INITIALIZED: return "EGL not initialized or failed to initialize";
case EGL_BAD_ACCESS: return "Resource inaccessible";
case EGL_BAD_ALLOC: return "Cannot allocate resources";
case EGL_BAD_ATTRIBUTE: return "Unrecognized attribute or attribute value";
case EGL_BAD_CONTEXT: return "Invalid EGL context";
case EGL_BAD_CONFIG: return "Invalid EGL frame buffer configuration";
case EGL_BAD_CURRENT_SURFACE: return "Current surface is no longer valid";
case EGL_BAD_DISPLAY: return "Invalid EGL display";
case EGL_BAD_SURFACE: return "Invalid surface";
case EGL_BAD_MATCH: return "Inconsistent arguments";
case EGL_BAD_PARAMETER: return "Invalid argument";
case EGL_BAD_NATIVE_PIXMAP: return "Invalid native pixmap";
case EGL_BAD_NATIVE_WINDOW: return "Invalid native window";
case EGL_CONTEXT_LOST: return "Context lost";
}
return "Unknown error "+to_hex_string(int(error));
}
但是例如OpenGL 本身就有gluErrorString()
,这使我们不必手动维护错误列表。
EGL 有类似 gluErrorString()
的东西吗?
绝对不是 EGL 本身的一部分。而且我认为它不应该在那里。 EGL 是低级 window 系统接口。生成用户可读的字符串真的不是它的工作。
您可能认为拥有一个生成几个字符串的函数是微不足道且无害的。但由于这是用户可读的字符串,您几乎不得不考虑国际化。这意味着您可以获得各种语言的字符串,包括使用不同字符集的字符串。所以看起来简单的事情突然变得复杂得多。至少在我看来,仅支持英文字符串是非常随意的。
更重要的是,将错误代码转换为字符串在概念上不是 API 的一部分,它提供了 window 系统的接口。恕我直言,这些类型的 API 应该是最少的。在这种情况下,它应该完全提供与window系统交互所需的功能,仅此而已。
当然,没有人会阻止您(或其他任何人)实施提供此类功能的更高级别的库。这正是 GLU(gluErrorString()
的来源)用于 OpenGL 的原因。它提供了一些基于 OpenGL 的常用功能。
上一段中谈到 GLU 时故意使用过去时。它建立在上个千年的 OpenGL 功能之上。
宏 stringification 可以节省您的输入时间:
#define CASE_STR( value ) case value: return #value;
const char* eglGetErrorString( EGLint error )
{
switch( error )
{
CASE_STR( EGL_SUCCESS )
CASE_STR( EGL_NOT_INITIALIZED )
CASE_STR( EGL_BAD_ACCESS )
CASE_STR( EGL_BAD_ALLOC )
CASE_STR( EGL_BAD_ATTRIBUTE )
CASE_STR( EGL_BAD_CONTEXT )
CASE_STR( EGL_BAD_CONFIG )
CASE_STR( EGL_BAD_CURRENT_SURFACE )
CASE_STR( EGL_BAD_DISPLAY )
CASE_STR( EGL_BAD_SURFACE )
CASE_STR( EGL_BAD_MATCH )
CASE_STR( EGL_BAD_PARAMETER )
CASE_STR( EGL_BAD_NATIVE_PIXMAP )
CASE_STR( EGL_BAD_NATIVE_WINDOW )
CASE_STR( EGL_CONTEXT_LOST )
default: return "Unknown";
}
}
#undef CASE_STR