Jak to jest z tym glGetError


#1

Witam,
Mam pytanie dotyczące funkcji glGetError().
Dokumentacja mówi, że gdy wystąpi błąd to odpowiednia flaga jest ustawiana na kod błędu i dopóki nie zostanie wywołana funkcja glGetError to inne błędy nie są zapisywane. Po zwróceniu przez funkcję glGetError kodu błędu, kod błędu znowu się resetuje na wartość GL_NO_ERROR i jakaś funkcja może znowu zapisać kolejny kod błędu.
Potwierdzałaby tą wersję implementacja Mesa3d:
/**

  • Record an error.

  • \param ctx GL context.

  • \param error error code.

  • Records the given error code and call the driver’s dd_function_table::Error

  • function if defined.

  • \sa

  • This is called via _mesa_error().
    */
    void
    _mesa_record_error(struct gl_context *ctx, GLenum error)
    {
    if (!ctx)
    return;

    if (ctx->ErrorValue == GL_NO_ERROR) {
    ctx->ErrorValue = error;
    }
    }

/**

  • Returns the current GL error code, or GL_NO_ERROR.

  • \return current error code

  • Returns __struct gl_contextRec::ErrorValue.
    */
    GLenum GLAPIENTRY
    _mesa_GetError( void )
    {
    GET_CURRENT_CONTEXT(ctx);
    GLenum e = ctx->ErrorValue;
    ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, 0);

    if (MESA_VERBOSE & VERBOSE_API)
    _mesa_debug(ctx, “glGetError <-- %s\n”, _mesa_enum_to_string(e));

    ctx->ErrorValue = (GLenum) GL_NO_ERROR;
    ctx->ErrorDebugCount = 0;
    return e;
    }

To pokazuje, że jest tylko jedna flaga która jest ustawiana przez funkcję powodującą błąd, i ta flaga jest później zwracana przez funkcję glGetError() a następnie jest spowrotem ustawiana na GL_NO_ERROR.

Nie rozumiem zatem dlaczego zaleca się wywoływać funkcję glGetError() w pętli dopóki ta funkcja nie zwróci kodu GL_NO_ERROR.

W dokumentacji jest napisane:
To allow for distributed implementations, there may be several error flags. If any single error flag has recorded an error, the value of that flag is returned and that flag is reset to GL_NO_ERROR when glGetError is called. If more than one flag has recorded an error, glGetError returns and clears an arbitrary error flag value. Thus, glGetError should always be called in a loop, until it returns GL_NO_ERROR, if all error flags are to be reset.

Czyli o co w tym wszystkim chodzi i co to jest distributed implementations ?

pozdrawiam.


#3

glGetError sie juz nie uzywa, bo nie daje ci callstacka do erroru.

Zobacz
https://www.khronos.org/registry/OpenGL/extensions/KHR/KHR_debug.txt