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 <o.lauffenburger@topsolid.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=101464 Reviewed-by: Brian Paul <brianp@vmware.com> Reviewed-by: Charmaine Lee <charmainel@vmware.com>
This commit is contained in:
parent
1d0bdfb56d
commit
f5c8bb1e00
|
@ -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;
|
||||
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;
|
||||
|
||||
_save_End();
|
||||
_save_Begin(curPrim);
|
||||
/* restart primitive */
|
||||
CALL_End(GET_DISPATCH(), ());
|
||||
vbo_save_NotifyBegin(ctx, curPrim);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue