diff options
author | Olivier Lauffenburger <[email protected]> | 2017-07-06 09:45:00 -0600 |
---|---|---|
committer | Brian Paul <[email protected]> | 2017-07-07 12:22:34 -0600 |
commit | f5c8bb1e00f358e05ed21f8ed69c9fc3803bf95f (patch) | |
tree | fbee0141a92e05c7da1c3e69271a9257122f5ebe /src/mesa/vbo/vbo_save_api.c | |
parent | 1d0bdfb56d77e50f2c3d822220fc906cffd5ebb9 (diff) |
vbo: fix glPrimitiveRestartNV crash inside a display list
glPrimitiveRestartNV crashes when it is called during the compilation
of a display list.
There are two reasons:
- ctx->Driver.CurrentSavePrimitive is not set to the current primitive
- save_PrimitiveRestartNV() calls _save_Begin() which only sets an
OpenGL error, instead of calling vbo_save_NotifyBegin().
This patch correctly calls vbo_save_NotifyBegin() but it detects
the current primitive mode by looking at the latest saved primitive.
Additional work by Brian Paul
Signed-off-by: Olivier Lauffenburger <[email protected]>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=101464
Reviewed-by: Brian Paul <[email protected]>
Reviewed-by: Charmaine Lee <[email protected]>
Diffstat (limited to 'src/mesa/vbo/vbo_save_api.c')
-rw-r--r-- | src/mesa/vbo/vbo_save_api.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/src/mesa/vbo/vbo_save_api.c b/src/mesa/vbo/vbo_save_api.c index a42a3c3db7d..aab5f549d72 100644 --- a/src/mesa/vbo/vbo_save_api.c +++ b/src/mesa/vbo/vbo_save_api.c @@ -1108,13 +1108,23 @@ _save_Begin(GLenum mode) static void GLAPIENTRY _save_PrimitiveRestartNV(void) { - GLenum curPrim; GET_CURRENT_CONTEXT(ctx); + struct vbo_save_context *save = &vbo_context(ctx)->save; - curPrim = ctx->Driver.CurrentSavePrimitive; - - _save_End(); - _save_Begin(curPrim); + if (save->prim_count == 0) { + /* We're not inside a glBegin/End pair, so calling glPrimitiverRestartNV + * is an error. + */ + _mesa_compile_error(ctx, GL_INVALID_OPERATION, + "glPrimitiveRestartNV called outside glBegin/End"); + } else { + /* get current primitive mode */ + GLenum curPrim = save->prim[save->prim_count - 1].mode; + + /* restart primitive */ + CALL_End(GET_DISPATCH(), ()); + vbo_save_NotifyBegin(ctx, curPrim); + } } |