Implement OES_vertex_array_object.

This extension works the same as OpenGL ES 3.0 vertex arrays, but requires
entry points with the OES suffix.

Change-Id: I82b92bbcec078f88becee6f3b37eb7e8256a1233
Reviewed-on: https://swiftshader-review.googlesource.com/18808
Tested-by: Krzysztof Kosiński <krzysio@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Common/Version.h b/src/Common/Version.h
index b9288d1..ea9a476 100644
--- a/src/Common/Version.h
+++ b/src/Common/Version.h
@@ -15,7 +15,7 @@
 #define MAJOR_VERSION 4
 #define MINOR_VERSION 0
 #define BUILD_VERSION 0
-#define BUILD_REVISION 4
+#define BUILD_REVISION 5
 
 #define STRINGIFY(x) #x
 #define MACRO_STRINGIFY(x) STRINGIFY(x)
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index 5148e6b..0fe4f9c 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -4443,6 +4443,7 @@
 		"GL_OES_texture_half_float_linear",
 		"GL_OES_texture_npot",
 		"GL_OES_texture_3D",
+		"GL_OES_vertex_array_object",
 		"GL_OES_vertex_half_float",
 		"GL_EXT_blend_minmax",
 		"GL_EXT_color_buffer_half_float",
diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp
index 3ba2a3a..b0c0836 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -6869,6 +6869,7 @@
 		FUNCTION(glBindTexture),
 		FUNCTION(glBindTransformFeedback),
 		FUNCTION(glBindVertexArray),
+		FUNCTION(glBindVertexArrayOES),
 		FUNCTION(glBlendColor),
 		FUNCTION(glBlendEquation),
 		FUNCTION(glBlendEquationSeparate),
@@ -6917,6 +6918,7 @@
 		FUNCTION(glDeleteTextures),
 		FUNCTION(glDeleteTransformFeedbacks),
 		FUNCTION(glDeleteVertexArrays),
+		FUNCTION(glDeleteVertexArraysOES),
 		FUNCTION(glDepthFunc),
 		FUNCTION(glDepthMask),
 		FUNCTION(glDepthRangef),
@@ -6960,6 +6962,7 @@
 		FUNCTION(glGenTextures),
 		FUNCTION(glGenTransformFeedbacks),
 		FUNCTION(glGenVertexArrays),
+		FUNCTION(glGenVertexArraysOES),
 		FUNCTION(glGenerateMipmap),
 		FUNCTION(glGenerateMipmapOES),
 		FUNCTION(glGetActiveAttrib),
@@ -7038,6 +7041,7 @@
 		FUNCTION(glIsTexture),
 		FUNCTION(glIsTransformFeedback),
 		FUNCTION(glIsVertexArray),
+		FUNCTION(glIsVertexArrayOES),
 		FUNCTION(glLineWidth),
 		FUNCTION(glLinkProgram),
 		FUNCTION(glMapBufferRange),
diff --git a/src/OpenGL/libGLESv2/libGLESv2.def b/src/OpenGL/libGLESv2/libGLESv2.def
index d6e59b4..8d07c32 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.def
+++ b/src/OpenGL/libGLESv2/libGLESv2.def
@@ -183,6 +183,10 @@
 	glGetFramebufferAttachmentParameterivOES
 	glGenerateMipmapOES
 	glDrawBuffersEXT
+    glBindVertexArrayOES
+    glDeleteVertexArraysOES
+    glGenVertexArraysOES
+    glIsVertexArrayOES
 
     ; GLES 3.0 Functions
     glReadBuffer                    @211
@@ -292,4 +296,4 @@
 
     libGLESv2_swiftshader
 
-	Register
\ No newline at end of file
+	Register
diff --git a/src/OpenGL/libGLESv2/libGLESv2.lds b/src/OpenGL/libGLESv2/libGLESv2.lds
index 483efc2..86da3a1 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.lds
+++ b/src/OpenGL/libGLESv2/libGLESv2.lds
@@ -290,6 +290,10 @@
 	glGetFramebufferAttachmentParameterivOES;
 	glGenerateMipmapOES;
 	glDrawBuffersEXT;
+	glBindVertexArrayOES;
+	glDeleteVertexArraysOES;
+	glGenVertexArraysOES;
+	glIsVertexArrayOES;
 
 	# Table of function pointers to disambiguate between libraries
 	libGLESv2_swiftshader;
@@ -302,4 +306,4 @@
 
 local:
 	*;
-};
\ No newline at end of file
+};
diff --git a/src/OpenGL/libGLESv2/libGLESv3.cpp b/src/OpenGL/libGLESv2/libGLESv3.cpp
index e048749..381a3aa 100644
--- a/src/OpenGL/libGLESv2/libGLESv3.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv3.cpp
@@ -1469,6 +1469,11 @@
 	}
 }
 
+GL_APICALL void GL_APIENTRY glBindVertexArrayOES(GLuint array)
+{
+	glBindVertexArray(array);
+}
+
 GL_APICALL void GL_APIENTRY glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
 {
 	TRACE("(GLsizei n = %d, const GLuint *arrays = %p)", n, arrays);
@@ -1489,6 +1494,11 @@
 	}
 }
 
+GL_APICALL void GL_APIENTRY glDeleteVertexArraysOES(GLsizei n, const GLuint *arrays)
+{
+	glDeleteVertexArrays(n, arrays);
+}
+
 GL_APICALL void GL_APIENTRY glGenVertexArrays(GLsizei n, GLuint *arrays)
 {
 	TRACE("(GLsizei n = %d, const GLuint *arrays = %p)", n, arrays);
@@ -1509,6 +1519,11 @@
 	}
 }
 
+GL_APICALL void GL_APIENTRY glGenVertexArraysOES(GLsizei n, GLuint *arrays)
+{
+	glGenVertexArrays(n, arrays);
+}
+
 GL_APICALL GLboolean GL_APIENTRY glIsVertexArray(GLuint array)
 {
 	TRACE("(GLuint array = %d)", array);
@@ -1533,6 +1548,11 @@
 	return GL_FALSE;
 }
 
+GL_APICALL GLboolean GL_APIENTRY glIsVertexArrayOES(GLuint array)
+{
+	return glIsVertexArray(array);
+}
+
 GL_APICALL void GL_APIENTRY glGetIntegeri_v(GLenum target, GLuint index, GLint *data)
 {
 	TRACE("(GLenum target = 0x%X, GLuint index = %d, GLint* data = %p)",