[emulator] Delete VAOs starting from highest
If VAOs are deleted starting from 0, then the
following happens when an app's context has
genned two VAO's that are both != 0,
and the first of the two nonzero VAOs
is the current one:
VAO 0
VAO 1 <- current
VAO 2
in context dtor loop over vao map:
delete vao 0 (done)
delete vao 1:
is current, so bind 0:
in bind 0, we create a new map entry since 0 was deleted
next loop iter deletes vao 0 again (done)
*** at this point, vao 0 pointer refers to freed memory ***
next loop iter wants to delete vao 2,
but the current vao is 0 and refers to freed memory.
then, in Context::deleteVertexArray:
if (getCurrentVertexArray()->name...) <- Segmentation fault (core dumped)
This CL deletes VAO 0 last.
Change-Id: Ifa606ad7517cd213f21606577d3bdd8d810b640d
Reviewed-on: https://swiftshader-review.googlesource.com/8350
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Lingfeng Yang <lfy@google.com>
diff --git a/src/OpenGL/common/NameSpace.hpp b/src/OpenGL/common/NameSpace.hpp
index d701219..ce55b5b 100644
--- a/src/OpenGL/common/NameSpace.hpp
+++ b/src/OpenGL/common/NameSpace.hpp
@@ -49,6 +49,11 @@
return map.begin()->first;
}
+ GLuint lastName()
+ {
+ return map.rbegin()->first;
+ }
+
GLuint allocate(ObjectType *object = nullptr)
{
GLuint name = freeName;
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index 2421359..4ff6a35 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -210,7 +210,7 @@
while(!mVertexArrayNameSpace.empty())
{
- deleteVertexArray(mVertexArrayNameSpace.firstName());
+ deleteVertexArray(mVertexArrayNameSpace.lastName());
}
while(!mTransformFeedbackNameSpace.empty())