diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp
index 913f49eb48ba60b65945da18ad6097b6d8187df4..f8fbad3dcf363238d5bdccb1c3cf6fb1626e9eac 100644
--- a/indra/llrender/llvertexbuffer.cpp
+++ b/indra/llrender/llvertexbuffer.cpp
@@ -94,7 +94,7 @@ U64 LLVBOPool::sBytesPooled = 0;
 U64 LLVBOPool::sIndexBytesPooled = 0;
 std::vector<U32> LLVBOPool::sPendingDeletions;
 
-std::list<U32> LLVertexBuffer::sAvailableVAOName;
+std::vector<U32> LLVertexBuffer::sAvailableVAOName;
 U32 LLVertexBuffer::sCurVAOName = 1;
 
 U64 LLVertexBuffer::sAllocatedIndexBytes = 0;
@@ -509,8 +509,8 @@ U32 LLVertexBuffer::getVAOName()
 
 	if (!sAvailableVAOName.empty())
 	{
-		ret = sAvailableVAOName.front();
-		sAvailableVAOName.pop_front();
+		ret = sAvailableVAOName.back();
+		sAvailableVAOName.pop_back();
 	}
 	else
 	{
@@ -1058,12 +1058,12 @@ void LLVertexBuffer::cleanupClass()
 	sDynamicVBOPool.cleanup();
 	clean_validate_buffers();
 
-	while (!sAvailableVAOName.empty())
+	if (!sAvailableVAOName.empty())
 	{
 #if GL_ARB_vertex_array_object
-		glDeleteVertexArrays(1, &sAvailableVAOName.front());
+		glDeleteVertexArrays(sAvailableVAOName.size(), sAvailableVAOName.data());
 #endif
-		sAvailableVAOName.pop_front();
+		sAvailableVAOName.clear();
 	}
 	sLastMask = 0;
 
diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h
index 511aaaae96291c75be8ddf56ccb3462cf8f1d2c2..e9103c7271db688b7ff91e4068d7e823aa52d542 100644
--- a/indra/llrender/llvertexbuffer.h
+++ b/indra/llrender/llvertexbuffer.h
@@ -121,8 +121,8 @@ class LLVertexBuffer final : public LLRefCount, public LLTrace::MemTrackable<LLV
 	static LLVBOPool sDynamicVBOPool;
 	static LLVBOPool sStreamIBOPool;
 	static LLVBOPool sDynamicIBOPool;
-	
-	static std::list<U32> sAvailableVAOName;
+
+	static std::vector<U32> sAvailableVAOName;
 	static U32 sCurVAOName;
 
 	static bool	sUseStreamDraw;