diff options
author | Brian Paul <[email protected]> | 2019-02-25 14:51:37 -0700 |
---|---|---|
committer | Brian Paul <[email protected]> | 2019-02-26 09:56:45 -0700 |
commit | 6dabcb5bcfd5dc4c62dbdb1cfd1ea95e45a47f8a (patch) | |
tree | b03db1f97b72f9906b9bfe11b2d43071ece98332 /src/mesa | |
parent | cb52d4482de9d6f4f8c2c74637e8df9deb2e0d7d (diff) |
mesa: fix display list corner case assertion
This fixes a failed assertion in glDeleteLists() for the following
case:
list = glGenLists(1);
glDeleteLists(list, 1);
when those are the first display list commands issued by the
application.
When we generate display lists, we plug in empty lists created with
the make_list() helper. This function uses the OPCODE_END_OF_LIST
opcode but does not call dlist_alloc() which would set the
InstSize[OPCODE_END_OF_LIST] element to non-zero.
When the empty list was deleted, we failed the InstSize[opcode] > 0
assertion.
Typically, display lists are created with glNewList/glEndList so we
set InstSize[OPCODE_END_OF_LIST] = 1 in dlist_alloc(). That's why
this bug wasn't found before.
To fix this failure, simply initialize the InstSize[OPCODE_END_OF_LIST]
element in make_list().
The game oolite was hitting this.
Fixes: https://github.com/OoliteProject/oolite/issues/325
Reviewed-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/main/dlist.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/src/mesa/main/dlist.c b/src/mesa/main/dlist.c index 97461cede34..8dcf8bd252c 100644 --- a/src/mesa/main/dlist.c +++ b/src/mesa/main/dlist.c @@ -962,6 +962,8 @@ make_list(GLuint name, GLuint count) dlist->Name = name; dlist->Head = malloc(sizeof(Node) * count); dlist->Head[0].opcode = OPCODE_END_OF_LIST; + /* All InstSize[] entries must be non-zero */ + InstSize[OPCODE_END_OF_LIST] = 1; return dlist; } |