Adding new object types for OpenGL ES 3.0

New objects:
- Sampler
- Transform feedback
- Vertex Array

Change-Id: I701ea5fea75b81196290c3bdb3230cd471cc537b
Reviewed-on: https://swiftshader-review.googlesource.com/2796
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Main/Config.hpp b/src/Main/Config.hpp
index a5bc115..f94e447 100644
--- a/src/Main/Config.hpp
+++ b/src/Main/Config.hpp
@@ -76,6 +76,7 @@
 	MAX_UNIFORM_BLOCKS_COMPONENTS = 49152,

 	MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = MAX_UNIFORM_BLOCKS_COMPONENTS + 4 * FRAGMENT_UNIFORM_VECTORS,

 	MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = MAX_UNIFORM_BLOCKS_COMPONENTS + 4 * VERTEX_UNIFORM_VECTORS,

+	MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 4,

 };

 

 #endif   // sw_Config_hpp

diff --git a/src/OpenGL/libGLESv2/Android.mk b/src/OpenGL/libGLESv2/Android.mk
index f2ce744..22c43e1 100644
--- a/src/OpenGL/libGLESv2/Android.mk
+++ b/src/OpenGL/libGLESv2/Android.mk
@@ -121,6 +121,7 @@
 	ResourceManager.cpp \
 	Shader.cpp \
 	Texture.cpp \
+	TransformFeedback.cpp \
 	utilities.cpp \
 	VertexDataManager.cpp \
 
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index 34e5ee3..a82b12f 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -24,8 +24,11 @@
 #include "Program.h"

 #include "Query.h"

 #include "Renderbuffer.h"

+#include "Sampler.h"

 #include "Shader.h"

 #include "Texture.h"

+#include "TransformFeedback.h"

+#include "VertexArray.h"

 #include "VertexDataManager.h"

 #include "IndexDataManager.h"

 #include "libEGL/Display.h"

@@ -138,6 +141,9 @@
     mTextureCubeMapZero = new TextureCubeMap(0);

     mTextureExternalZero = new TextureExternal(0);

 

+	mState.transformFeedback = new TransformFeedback(0);

+	mTransformFeedbackMap[0] = mState.transformFeedback;

+

     mState.activeSampler = 0;

     bindArrayBuffer(0);

     bindElementArrayBuffer(0);

@@ -826,6 +832,36 @@
     return handle;

 }

 

+// Returns an unused vertex array name

+GLuint Context::createVertexArray()

+{

+	GLuint handle = mVertexArrayNameSpace.allocate();

+

+	mVertexArrayMap[handle] = NULL;

+

+	return handle;

+}

+

+// Returns an unused transform feedback name

+GLuint Context::createTransformFeedback()

+{

+	GLuint handle = mTransformFeedbackNameSpace.allocate();

+

+	mTransformFeedbackMap[handle] = NULL;

+

+	return handle;

+}

+

+// Returns an unused sampler name

+GLuint Context::createSampler()

+{

+	GLuint handle = mSamplerNameSpace.allocate();

+

+	mSamplerMap[handle] = NULL;

+

+	return handle;

+}

+

 void Context::deleteBuffer(GLuint buffer)

 {

     if(mResourceManager->getBuffer(buffer))

@@ -909,6 +945,57 @@
     }

 }

 

+void Context::deleteVertexArray(GLuint vertexArray)

+{

+	VertexArrayMap::iterator vertexArrayObject = mVertexArrayMap.find(vertexArray);

+

+	if(vertexArrayObject != mVertexArrayMap.end())

+	{

+		mVertexArrayNameSpace.release(vertexArrayObject->first);

+

+		if(vertexArrayObject->second)

+		{

+			vertexArrayObject->second->release();

+		}

+

+		mVertexArrayMap.erase(vertexArrayObject);

+	}

+}

+

+void Context::deleteTransformFeedback(GLuint transformFeedback)

+{

+	TransformFeedbackMap::iterator transformFeedbackObject = mTransformFeedbackMap.find(transformFeedback);

+

+	if(transformFeedbackObject != mTransformFeedbackMap.end())

+	{

+		mTransformFeedbackNameSpace.release(transformFeedbackObject->first);

+

+		if(transformFeedbackObject->second)

+		{

+			transformFeedbackObject->second->release();

+		}

+

+		mTransformFeedbackMap.erase(transformFeedbackObject);

+	}

+}

+

+void Context::deleteSampler(GLuint sampler)

+{

+	SamplerMap::iterator samplerObject = mSamplerMap.find(sampler);

+

+	if(samplerObject != mSamplerMap.end())

+	{

+		mSamplerNameSpace.release(samplerObject->first);

+

+		if(samplerObject->second)

+		{

+			samplerObject->second->release();

+		}

+

+		mSamplerMap.erase(samplerObject);

+	}

+}

+

 Buffer *Context::getBuffer(GLuint handle)

 {

     return mResourceManager->getBuffer(handle);

@@ -1011,6 +1098,43 @@
     mState.renderbuffer = getRenderbuffer(renderbuffer);

 }

 

+bool Context::bindVertexArray(GLuint array)

+{

+	VertexArray* vertexArray = getVertexArray(array);

+

+	if(vertexArray)

+	{

+		mState.vertexArray = vertexArray;

+	}

+

+	return !!vertexArray;

+}

+

+bool Context::bindTransformFeedback(GLuint id)

+{

+	TransformFeedback* transformFeedback = getTransformFeedback(id);

+

+	if(transformFeedback)

+	{

+		mState.transformFeedback = transformFeedback;

+		return true;

+	}

+

+	return false;

+}

+

+bool Context::bindSampler(GLuint unit, GLuint sampler)

+{

+	Sampler* samplerObject = getSampler(sampler);

+

+	if(sampler)

+	{

+		mState.sampler[unit] = samplerObject;

+	}

+

+	return !!samplerObject;

+}

+

 void Context::useProgram(GLuint program)

 {

     GLuint priorProgram = mState.currentProgram;

@@ -1180,6 +1304,27 @@
     }

 }

 

+VertexArray *Context::getVertexArray(GLuint array)

+{

+	VertexArrayMap::iterator vertexArray = mVertexArrayMap.find(array);

+

+	return (vertexArray == mVertexArrayMap.end()) ? NULL : vertexArray->second;

+}

+

+TransformFeedback *Context::getTransformFeedback(GLuint transformFeedback)

+{

+	TransformFeedbackMap::iterator transformFeedbackObject = mTransformFeedbackMap.find(transformFeedback);

+

+	return (transformFeedbackObject == mTransformFeedbackMap.end()) ? NULL : transformFeedbackObject->second;

+}

+

+Sampler *Context::getSampler(GLuint sampler)

+{

+	SamplerMap::iterator samplerObject = mSamplerMap.find(sampler);

+

+	return (samplerObject == mSamplerMap.end()) ? NULL : samplerObject->second;

+}

+

 Buffer *Context::getArrayBuffer()

 {

     return mState.arrayBuffer;

@@ -1258,6 +1403,20 @@
       case GL_DITHER:                   *params = mState.dither;                    break;

       case GL_PRIMITIVE_RESTART_FIXED_INDEX: *params = mState.primitiveRestartFixedIndex; break;

       case GL_RASTERIZER_DISCARD:       *params = mState.rasterizerDiscard;         break;

+      case GL_TRANSFORM_FEEDBACK_ACTIVE:

+		  if(mState.transformFeedback)

+		  {

+			  *params = mState.transformFeedback->isActive();

+			  break;

+		  }

+		  else return false;

+      case GL_TRANSFORM_FEEDBACK_PAUSED:

+		  if(mState.transformFeedback)

+		  {

+			  *params = mState.transformFeedback->isPaused();

+			  break;

+		  }

+		  else return false;

       default:

         return false;

     }

@@ -1780,17 +1939,33 @@
 		*param = 0;

 		break;

 	case GL_TRANSFORM_FEEDBACK_ACTIVE: // boolean, initially GL_FALSE

-		*param = GL_FALSE;

-		break;

+		if(mState.transformFeedback)

+		{

+			*param = mState.transformFeedback->isActive();

+			break;

+		}

+		else return false;

 	case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: // name, initially 0

-		*param = 0;

-		break;

+		if(mState.transformFeedback && mState.transformFeedback->getGenericBuffer())

+		{

+			*param = mState.transformFeedback->getGenericBuffer()->name;

+			break;

+		}

+		else return false;

 	case GL_TRANSFORM_FEEDBACK_PAUSED: // boolean, initially GL_FALSE

-		*param = GL_FALSE;

-		break;

+		if(mState.transformFeedback)

+		{

+			*param = mState.transformFeedback->isPaused();

+			break;

+		}

+		else return false;

 	case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE: // indexed[n] 64-bit integer, initially 0

-		*param = 0;

-		break;

+		if(mState.transformFeedback && mState.transformFeedback->getGenericBuffer())

+		{

+			*param = mState.transformFeedback->getGenericBuffer()->size();

+			break;

+		}

+		else return false;

 	case GL_TRANSFORM_FEEDBACK_BUFFER_START: // indexed[n] 64-bit integer, initially 0

 		*param = 0;

 		break;

diff --git a/src/OpenGL/libGLESv2/Context.h b/src/OpenGL/libGLESv2/Context.h
index e6cefb1..833315a 100644
--- a/src/OpenGL/libGLESv2/Context.h
+++ b/src/OpenGL/libGLESv2/Context.h
@@ -21,6 +21,7 @@
 #include "common/Object.hpp"

 #include "Image.hpp"

 #include "Renderer/Sampler.hpp"

+#include "TransformFeedback.h"

 

 #define GL_APICALL

 #include <GLES2/gl2.h>

@@ -65,6 +66,8 @@
 class IndexDataManager;

 class Fence;

 class Query;

+class Sampler;

+class VertexArray;

 

 enum

 {

@@ -254,6 +257,9 @@
     GLuint drawFramebuffer;

     gl::BindingPointer<Renderbuffer> renderbuffer;

     GLuint currentProgram;

+    gl::BindingPointer<VertexArray> vertexArray;

+	gl::BindingPointer<TransformFeedback> transformFeedback;

+	gl::BindingPointer<Sampler> sampler[MAX_COMBINED_TEXTURE_IMAGE_UNITS];

 

     VertexAttribute vertexAttribute[MAX_VERTEX_ATTRIBS];

     gl::BindingPointer<Texture> samplerTexture[TEXTURE_TYPE_COUNT][MAX_COMBINED_TEXTURE_IMAGE_UNITS];

@@ -387,6 +393,18 @@
     GLuint createQuery();

     void deleteQuery(GLuint query);

 

+	// Vertex arrays are owned by the Context

+	GLuint createVertexArray();

+	void deleteVertexArray(GLuint array);

+

+	// Transform feedbacks are owned by the Context

+	GLuint createTransformFeedback();

+	void deleteTransformFeedback(GLuint transformFeedback);

+

+	// Samplers are owned by the Context

+	GLuint createSampler();

+	void deleteSampler(GLuint sampler);

+

     void bindArrayBuffer(GLuint buffer);

     void bindElementArrayBuffer(GLuint buffer);

     void bindTexture2D(GLuint texture);

@@ -396,6 +414,9 @@
     void bindReadFramebuffer(GLuint framebuffer);

     void bindDrawFramebuffer(GLuint framebuffer);

     void bindRenderbuffer(GLuint renderbuffer);

+	bool bindVertexArray(GLuint array);

+	bool bindTransformFeedback(GLuint transformFeedback);

+	bool bindSampler(GLuint unit, GLuint sampler);

     void useProgram(GLuint program);

 

 	void beginQuery(GLenum target, GLuint query);

@@ -415,6 +436,10 @@
     Framebuffer *getFramebuffer(GLuint handle);

     virtual Renderbuffer *getRenderbuffer(GLuint handle);

 	Query *getQuery(GLuint handle, bool create, GLenum type);

+	VertexArray *getVertexArray(GLuint array);

+	TransformFeedback *getTransformFeedback(GLuint transformFeedback);

+	TransformFeedback *getTransformFeedback();

+	Sampler *getSampler(GLuint sampler);

 

     Buffer *getArrayBuffer();

     Buffer *getElementArrayBuffer();

@@ -503,6 +528,18 @@
     QueryMap mQueryMap;

     gl::NameSpace mQueryNameSpace;

 

+	typedef std::map<GLint, VertexArray*> VertexArrayMap;

+	VertexArrayMap mVertexArrayMap;

+	gl::NameSpace mVertexArrayNameSpace;

+

+	typedef std::map<GLint, TransformFeedback*> TransformFeedbackMap;

+	TransformFeedbackMap mTransformFeedbackMap;

+	gl::NameSpace mTransformFeedbackNameSpace;

+

+	typedef std::map<GLint, Sampler*> SamplerMap;

+	SamplerMap mSamplerMap;

+	gl::NameSpace mSamplerNameSpace;

+

     VertexDataManager *mVertexDataManager;

     IndexDataManager *mIndexDataManager;

 

diff --git a/src/OpenGL/libGLESv2/Sampler.h b/src/OpenGL/libGLESv2/Sampler.h
new file mode 100644
index 0000000..e0b9502
--- /dev/null
+++ b/src/OpenGL/libGLESv2/Sampler.h
@@ -0,0 +1,59 @@
+// SwiftShader Software Renderer

+//

+// Copyright(c) 2015 Google Inc.

+//

+// All rights reserved. No part of this software may be copied, distributed, transmitted,

+// transcribed, stored in a retrieval system, translated into any human or computer

+// language by any means, or disclosed to third parties without the explicit written

+// agreement of Google Inc. Without such an agreement, no rights or licenses, express

+// or implied, including but not limited to any patent rights, are granted to you.

+//

+

+// Sampler.h: Defines the es2::Sampler class

+

+#ifndef LIBGLESV2_SAMPLER_H_

+#define LIBGLESV2_SAMPLER_H_

+

+#include "common/Object.hpp"

+#include "Renderer/Renderer.hpp"

+

+#define GL_APICALL

+#include <GLES2/gl2.h>

+

+namespace es2

+{

+

+class Sampler : public gl::Object

+{

+public:

+	Sampler(GLuint name) : Object(name)

+	{

+		mMinFilter = GL_NEAREST_MIPMAP_LINEAR;

+		mMagFilter = GL_LINEAR;

+

+		mWrapModeS = GL_REPEAT;

+		mWrapModeT = GL_REPEAT;

+		mWrapModeR = GL_REPEAT;

+

+		mMinLod = -1000.0f;

+		mMaxLod = 1000.0f;

+		mCompareMode = GL_NONE;

+		mCompareFunc = GL_LEQUAL;

+	}

+

+	GLenum mMinFilter;

+	GLenum mMagFilter;

+

+	GLenum mWrapModeS;

+	GLenum mWrapModeT;

+	GLenum mWrapModeR;

+

+	GLfloat mMinLod;

+	GLfloat mMaxLod;

+	GLenum mCompareMode;

+	GLenum mCompareFunc;

+};

+

+}

+

+#endif // LIBGLESV2_SAMPLER_H_

diff --git a/src/OpenGL/libGLESv2/Texture.h b/src/OpenGL/libGLESv2/Texture.h
index bb6b6b7..7a9a3b4 100644
--- a/src/OpenGL/libGLESv2/Texture.h
+++ b/src/OpenGL/libGLESv2/Texture.h
@@ -46,7 +46,7 @@
 	IMPLEMENTATION_MAX_SAMPLES = 4,

 	IMPLEMENTATION_MAX_COLOR_ATTACHMENTS = 8,

 	IMPLEMENTATION_MAX_DRAW_BUFFERS = 8,

-	IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 4,

+	IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS,

 	IMPLEMENTATION_MAX_UNIFORM_BUFFER_BINDINGS = 36,

 	IMPLEMENTATION_UNIFORM_BUFFER_OFFSET_ALIGNMENT = 1,

 };

diff --git a/src/OpenGL/libGLESv2/TransformFeedback.cpp b/src/OpenGL/libGLESv2/TransformFeedback.cpp
new file mode 100644
index 0000000..8c403dc
--- /dev/null
+++ b/src/OpenGL/libGLESv2/TransformFeedback.cpp
@@ -0,0 +1,85 @@
+// SwiftShader Software Renderer

+//

+// Copyright(c) 2015 Google Inc.

+//

+// All rights reserved. No part of this software may be copied, distributed, transmitted,

+// transcribed, stored in a retrieval system, translated into any human or computer

+// language by any means, or disclosed to third parties without the explicit written

+// agreement of Google Inc. Without such an agreement, no rights or licenses, express

+// or implied, including but not limited to any patent rights, are granted to you.

+//

+

+// TransformFeedback.cpp: Implements the es2::TransformFeedback class

+

+#include "TransformFeedback.h"

+

+#include "Buffer.h"

+

+namespace es2

+{

+

+TransformFeedback::TransformFeedback(GLuint name) : Object(name), mActive(false), mPaused(false)

+{

+	mGenericBuffer = NULL;

+}

+

+Buffer* TransformFeedback::getGenericBuffer() const

+{

+	return mGenericBuffer;

+}

+

+Buffer* TransformFeedback::getBuffer(GLuint index) const

+{

+	return mBuffer[index];

+}

+

+bool TransformFeedback::isActive() const

+{

+	return mActive;

+}

+

+bool TransformFeedback::isPaused() const

+{

+	return mPaused;

+}

+

+GLenum TransformFeedback::primitiveMode() const

+{

+	return mPrimitiveMode;

+}

+

+void TransformFeedback::begin(GLenum primitiveMode)

+{

+	mActive = true; mPrimitiveMode = primitiveMode;

+}

+

+void TransformFeedback::end()

+{

+	mActive = false;

+}

+

+void TransformFeedback::setPaused(bool paused)

+{

+	mPaused = paused;

+}

+

+void TransformFeedback::setGenericBuffer(Buffer* buffer)

+{

+	mGenericBuffer = buffer;

+}

+

+void TransformFeedback::setBuffer(GLuint index, Buffer* buffer)

+{

+	mBuffer[index] = buffer;

+}

+

+void TransformFeedback::setBuffer(GLuint index, Buffer* buffer, GLintptr offset, GLsizeiptr size)

+{

+	mBuffer[index] = buffer;

+	if(buffer)

+	{

+		buffer->mapRange(offset, size, buffer->access());

+	}

+}

+

+}

diff --git a/src/OpenGL/libGLESv2/TransformFeedback.h b/src/OpenGL/libGLESv2/TransformFeedback.h
new file mode 100644
index 0000000..52a1bfe
--- /dev/null
+++ b/src/OpenGL/libGLESv2/TransformFeedback.h
@@ -0,0 +1,57 @@
+// SwiftShader Software Renderer

+//

+// Copyright(c) 2015 Google Inc.

+//

+// All rights reserved. No part of this software may be copied, distributed, transmitted,

+// transcribed, stored in a retrieval system, translated into any human or computer

+// language by any means, or disclosed to third parties without the explicit written

+// agreement of Google Inc. Without such an agreement, no rights or licenses, express

+// or implied, including but not limited to any patent rights, are granted to you.

+//

+

+// TransformFeedback.h: Defines the es2::TransformFeedback class

+

+#ifndef LIBGLESV2_TRANSFORM_FEEDBACK_H_

+#define LIBGLESV2_TRANSFORM_FEEDBACK_H_

+

+#include "common/Object.hpp"

+#include "Renderer/Renderer.hpp"

+

+#define GL_APICALL

+#include <GLES2/gl2.h>

+

+namespace es2

+{

+class Buffer;

+

+class TransformFeedback : public gl::Object

+{

+public:

+	// FIXME: Change this when implementing transform feedback

+	TransformFeedback(GLuint name);

+

+	Buffer* getGenericBuffer() const;

+	Buffer* getBuffer(GLuint index) const;

+	bool isActive() const;

+	bool isPaused() const;

+	GLenum primitiveMode() const;

+

+	void setGenericBuffer(Buffer* buffer);

+	void setBuffer(GLuint index, Buffer* buffer);

+	void setBuffer(GLuint index, Buffer* buffer, GLintptr offset, GLsizeiptr size);

+	void begin(GLenum primitiveMode);

+	void end();

+	void setPaused(bool paused);

+

+private:

+	gl::BindingPointer<Buffer> mGenericBuffer;

+	gl::BindingPointer<Buffer> mBuffer[MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS];

+

+	bool mActive;

+	bool mPaused;

+	GLenum mPrimitiveMode;

+};

+

+}

+

+#endif // LIBGLESV2_TRANSFORM_FEEDBACK_H_

diff --git a/src/OpenGL/libGLESv2/VertexArray.h b/src/OpenGL/libGLESv2/VertexArray.h
new file mode 100644
index 0000000..c3c2b87
--- /dev/null
+++ b/src/OpenGL/libGLESv2/VertexArray.h
@@ -0,0 +1,32 @@
+// SwiftShader Software Renderer

+//

+// Copyright(c) 2015 Google Inc.

+//

+// All rights reserved. No part of this software may be copied, distributed, transmitted,

+// transcribed, stored in a retrieval system, translated into any human or computer

+// language by any means, or disclosed to third parties without the explicit written

+// agreement of Google Inc. Without such an agreement, no rights or licenses, express

+// or implied, including but not limited to any patent rights, are granted to you.

+//

+

+// VertexArray.h: Defines the es2::VertexArray class

+

+#ifndef LIBGLESV2_VERTEX_ARRAY_H_

+#define LIBGLESV2_VERTEX_ARRAY_H_

+

+#include "common/Object.hpp"

+#include "Renderer/Renderer.hpp"

+

+#define GL_APICALL

+#include <GLES2/gl2.h>

+

+namespace es2

+{

+

+class VertexArray : public gl::Object

+{

+};

+

+}

+

+#endif // LIBGLESV2_VERTEX_ARRAY_H_

diff --git a/src/OpenGL/libGLESv2/libGLESv2.cbp b/src/OpenGL/libGLESv2/libGLESv2.cbp
index 83585ab..6f08551 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cbp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cbp
@@ -358,10 +358,14 @@
 		<Unit filename="Renderbuffer.h" />
 		<Unit filename="ResourceManager.cpp" />
 		<Unit filename="ResourceManager.h" />
+		<Unit filename="Sampler.h" />
 		<Unit filename="Shader.cpp" />
 		<Unit filename="Shader.h" />
 		<Unit filename="Texture.cpp" />
 		<Unit filename="Texture.h" />
+		<Unit filename="TransformFeedback.cpp" />
+		<Unit filename="TransformFeedback.h" />
+		<Unit filename="VertexArray.h" />
 		<Unit filename="VertexDataManager.cpp" />
 		<Unit filename="VertexDataManager.h" />
 		<Unit filename="exports.map" />
diff --git a/src/OpenGL/libGLESv2/libGLESv2.vcxproj b/src/OpenGL/libGLESv2/libGLESv2.vcxproj
index 63eb632..f47b891 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.vcxproj
+++ b/src/OpenGL/libGLESv2/libGLESv2.vcxproj
@@ -337,6 +337,7 @@
     <ClCompile Include="ResourceManager.cpp" />

     <ClCompile Include="Shader.cpp" />

     <ClCompile Include="Texture.cpp" />

+    <ClCompile Include="TransformFeedback.cpp" />

     <ClCompile Include="utilities.cpp" />

     <ClCompile Include="VertexDataManager.cpp" />

   </ItemGroup>

@@ -361,9 +362,12 @@
     <ClInclude Include="Renderbuffer.h" />

     <ClInclude Include="resource.h" />

     <ClInclude Include="ResourceManager.h" />

+    <ClInclude Include="Sampler.h" />

     <ClInclude Include="Shader.h" />

     <ClInclude Include="Texture.h" />

+    <ClInclude Include="TransformFeedback.h" />

     <ClInclude Include="utilities.h" />

+    <ClInclude Include="VertexArray.h" />

     <ClInclude Include="VertexDataManager.h" />

   </ItemGroup>

   <ItemGroup>

diff --git a/src/OpenGL/libGLESv2/libGLESv2.vcxproj.filters b/src/OpenGL/libGLESv2/libGLESv2.vcxproj.filters
index ea77fb1..683b67a 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.vcxproj.filters
+++ b/src/OpenGL/libGLESv2/libGLESv2.vcxproj.filters
@@ -74,6 +74,9 @@
     <ClCompile Include="libGLESv3.cpp">

       <Filter>Source Files</Filter>

     </ClCompile>

+    <ClCompile Include="TransformFeedback.cpp">

+      <Filter>Source Files</Filter>

+    </ClCompile>

   </ItemGroup>

   <ItemGroup>

     <ClInclude Include="Buffer.h">

@@ -148,6 +151,15 @@
     <ClInclude Include="..\common\NameSpace.hpp">

       <Filter>Header Files</Filter>

     </ClInclude>

+    <ClInclude Include="Sampler.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="TransformFeedback.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

+    <ClInclude Include="VertexArray.h">

+      <Filter>Header Files</Filter>

+    </ClInclude>

   </ItemGroup>

   <ItemGroup>

     <ResourceCompile Include="libGLESv2.rc" />