有没有标准的方法来查询 EGL 错误字符串?

7

目前我的函数用于转换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()的函数呢?


如果您正在使用GLU,则可以使用“gluErrorString”。但它对于现代代码并不是非常相关。实际上,它无法处理一些较新的错误,例如无效的帧缓冲区或丢失的上下文,这些错误可以由“glGetError”返回。因此最好手动维护错误。 - Nicol Bolas
@NicolBolas 如果你对自己的话很有把握,为什么不将它们写成答案呢? - Ruslan
你的问题是关于是否有类似于EGL的gluErrorString函数。我的评论是说你不应该费心,而是自己维护。虽然这解决了你的问题,但并没有真正回答你所问的问题。我不知道是否存在某些标准的egluErrorString函数,如果有的话,那就是对你问题的回答。 - Nicol Bolas
2个回答

2

这绝对不是EGL本身的一部分。我认为它也不应该在那里。EGL是一个低级窗口系统接口。生成可读字符串真的不是它的工作。

您可能认为,拥有一个生成几个字符串的函数是微不足道且无害的。但由于这将是用户可读的字符串,您几乎必须考虑国际化。这意味着您可以获得各种语言的字符串,包括使用不同字符集的语言。因此,看起来简单的事情突然变得更加复杂。至少在我看来,仅支持英文字符串非常武断。

更重要的是,将错误代码转换为字符串在概念上不属于提供窗口系统接口的API的一部分。依我之见,这些类型的API应尽可能地简洁。在这种情况下,它应该提供与窗口系统交互所需的功能,而不多余。

当然,没有人阻止您(或其他任何人)实现一个提供此类功能的更高级别库。这正是GLU(其中包括gluErrorString())用于OpenGL的目的。它在OpenGL之上提供了一些常用功能。

在上一段中谈论GLU时使用过去式是有意的。它建立在上个世纪的OpenGL功能之上。


实际上,我通常不指望API返回本地化的字符串。对于用户来说,它们大多数都是无用的——如果用户知道发生了"EGL_BAD_ATTRIBUTE",他能做什么呢?相反,我将它们用于日志输出,而在那里我并不需要本地化。对于使用这种枚举值的API(自从C++被发明以来已经减少了一些),出于同样的原因,我通常会添加一个函数将它们转换为字符串——这样可以更容易地让(API的)用户将这些值放入日志中,而无需自己维护字符串表。 - Christian Stieber

2
字符串化可以帮助你节省一些打字:
#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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接