[Mesa-dev] [PATCH] mesa: fix display list corner case assertion
Brian Paul
brianp at vmware.com
Mon Feb 25 22:03:30 UTC 2019
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
---
src/mesa/main/dlist.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/mesa/main/dlist.c b/src/mesa/main/dlist.c
index 97461ce..8dcf8bd 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;
}
--
1.8.5.6
More information about the mesa-dev
mailing list