В настоящее время моя функция для преобразования результата 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()
, что избавляет нас от необходимости вручную вести список ошибок.
Есть ли что-то вроде gluErrorString()
для EGL?
Определенно не как часть самого EGL. И я не думаю, что это должно быть там. EGL — это интерфейс оконной системы низкого уровня. Создание читаемых пользователем строк на самом деле не является его задачей.
Вы можете подумать, что наличие функции, которая создает несколько строк, тривиально и безвредно. Но так как это будут читаемые пользователем строки, вам придется подумать об интернационализации. Это означает, что вы можете получить строки на разных языках, включая те, которые используют разные наборы символов. То, что выглядело просто, вдруг становится намного сложнее И, по крайней мере, на мой взгляд, поддержка только английских строк будет очень произвольной.
Еще важнее то, что перевод кодов ошибок в строки концептуально не является частью API, который обеспечивает интерфейс для оконной системы. ИМХО, эти виды API должны быть минимальными. В этом случае это должно обеспечить именно так функциональность, необходимая для взаимодействия с оконной системой, и ничего более.
Конечно, никто не мешает вам (или кому-либо еще) реализовать библиотеку более высокого уровня, которая обеспечивает такую функциональность. Это именно то, что GLU (где gluErrorString()
пришел) был для OpenGL. Он предоставил некоторые часто используемые функциональные возможности поверх OpenGL.
Использование прошедшего времени при разговоре о GLU в предыдущем абзаце было преднамеренным. Он построен на основе функциональности OpenGL предыдущего тысячелетия.
Макро-магия может сэкономить вам время при наборе текста:
#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