Use namespaces for context owned objects.

Bug 19219444

Change-Id: I9606dfb30693a15a06896d83888022ccbaa8db2e
Reviewed-on: https://swiftshader-review.googlesource.com/5010
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/common/NameSpace.hpp b/src/OpenGL/common/NameSpace.hpp
index 2d72dc7..c4ffcd1 100644
--- a/src/OpenGL/common/NameSpace.hpp
+++ b/src/OpenGL/common/NameSpace.hpp
@@ -46,7 +46,7 @@
 		return map.begin()->first;

 	}

 

-    GLuint allocate()

+    GLuint allocate(ObjectType *object = nullptr)

 	{

 		GLuint name = freeName;

 

@@ -55,13 +55,13 @@
 			name++;

 		}

 

-		map.insert({name, nullptr});

+		map.insert({name, object});

 		freeName = name + 1;

 

 		return name;

 	}

 

-	bool isReserved(GLuint name)

+	bool isReserved(GLuint name) const

 	{

 		return map.find(name) != map.end();

 	}

@@ -96,13 +96,8 @@
 		return nullptr;

 	}

 

-	ObjectType *find(GLuint name)

+	ObjectType *find(GLuint name) const

 	{

-		if(name < baseName)

-		{

-			return nullptr;

-		}

-

 		auto element = map.find(name);

 

 		if(element == map.end())

diff --git a/src/OpenGL/libGL/Context.cpp b/src/OpenGL/libGL/Context.cpp
index f541db8..0da8157 100644
--- a/src/OpenGL/libGL/Context.cpp
+++ b/src/OpenGL/libGL/Context.cpp
@@ -116,7 +116,7 @@
     mState.colorMaskAlpha = true;

     mState.depthMask = true;

 

-    if(shareContext != NULL)

+    if(shareContext)

     {

         mResourceManager = shareContext->mResourceManager;

         mResourceManager->addRef();

@@ -149,8 +149,8 @@
     mState.packAlignment = 4;

     mState.unpackAlignment = 4;

 

-    mVertexDataManager = NULL;

-    mIndexDataManager = NULL;

+    mVertexDataManager = nullptr;

+    mIndexDataManager = nullptr;

 

     mInvalidEnum = false;

     mInvalidValue = false;

@@ -210,46 +210,46 @@
         mState.currentProgram = 0;

     }

 

-    while(!mFramebufferMap.empty())

+    while(!mFramebufferNameSpace.empty())

     {

-        deleteFramebuffer(mFramebufferMap.begin()->first);

+        deleteFramebuffer(mFramebufferNameSpace.firstName());

     }

 

-    while(!mFenceMap.empty())

+    while(!mFenceNameSpace.empty())

     {

-        deleteFence(mFenceMap.begin()->first);

+        deleteFence(mFenceNameSpace.firstName());

     }

 

-	while(!mQueryMap.empty())

+	while(!mQueryNameSpace.empty())

     {

-        deleteQuery(mQueryMap.begin()->first);

+        deleteQuery(mQueryNameSpace.firstName());

     }

 

     for(int type = 0; type < TEXTURE_TYPE_COUNT; type++)

     {

         for(int sampler = 0; sampler < MAX_COMBINED_TEXTURE_IMAGE_UNITS; sampler++)

         {

-            mState.samplerTexture[type][sampler] = NULL;

+            mState.samplerTexture[type][sampler] = nullptr;

         }

     }

 

     for(int i = 0; i < MAX_VERTEX_ATTRIBS; i++)

     {

-        mState.vertexAttribute[i].mBoundBuffer = NULL;

+        mState.vertexAttribute[i].mBoundBuffer = nullptr;

     }

 

 	for(int i = 0; i < QUERY_TYPE_COUNT; i++)

     {

-        mState.activeQuery[i] = NULL;

+        mState.activeQuery[i] = nullptr;

     }

 

-    mState.arrayBuffer = NULL;

-    mState.elementArrayBuffer = NULL;

-    mState.renderbuffer = NULL;

+    mState.arrayBuffer = nullptr;

+    mState.elementArrayBuffer = nullptr;

+    mState.renderbuffer = nullptr;

 

-    mTexture2DZero = NULL;

-	mProxyTexture2DZero = NULL;

-    mTextureCubeMapZero = NULL;

+    mTexture2DZero = nullptr;

+	mProxyTexture2DZero = nullptr;

+    mTextureCubeMapZero = nullptr;

 

     delete mVertexDataManager;

     delete mIndexDataManager;

@@ -297,7 +297,7 @@
     {

         depthStencil->release();

     }

-    

+

     markAllStateDirty();

 }

 

@@ -699,8 +699,8 @@
 

 GLuint Context::getActiveQuery(GLenum target) const

 {

-    Query *queryObject = NULL;

-    

+    Query *queryObject = nullptr;

+

     switch(target)

     {

     case GL_ANY_SAMPLES_PASSED:

@@ -717,7 +717,7 @@
     {

         return queryObject->name;

     }

-    

+

 	return 0;

 }

 

@@ -800,48 +800,18 @@
 // Returns an unused framebuffer name

 GLuint Context::createFramebuffer()

 {

-    //GLuint handle = mFramebufferNameSpace.allocate();

-    unsigned int handle = 1;

-

-    while(mFramebufferMap.find(handle) != mFramebufferMap.end())

-    {

-        handle++;

-    }

-

-    mFramebufferMap[handle] = NULL;

-

-    return handle;

+	return mFramebufferNameSpace.allocate();

 }

 

 GLuint Context::createFence()

 {

-    //GLuint handle = mFenceNameSpace.allocate();

-    unsigned int handle = 1;

-

-    while (mFenceMap.find(handle) != mFenceMap.end())

-    {

-        handle++;

-    }

-

-    mFenceMap[handle] = new Fence;

-

-    return handle;

+	return mFenceNameSpace.allocate(new Fence());

 }

 

 // Returns an unused query name

 GLuint Context::createQuery()

 {

-    //GLuint handle = mQueryNameSpace.allocate();

-    unsigned int handle = 1;

-

-    while (mQueryMap.find(handle) != mQueryMap.end())

-    {

-        handle++;

-    }

-

-    mQueryMap[handle] = NULL;

-

-    return handle;

+	return mQueryNameSpace.allocate();

 }

 

 void Context::deleteBuffer(GLuint buffer)

@@ -850,7 +820,7 @@
     {

         detachBuffer(buffer);

     }

-    

+

     mResourceManager->deleteBuffer(buffer);

 }

 

@@ -880,51 +850,40 @@
     {

         detachRenderbuffer(renderbuffer);

     }

-    

+

     mResourceManager->deleteRenderbuffer(renderbuffer);

 }

 

 void Context::deleteFramebuffer(GLuint framebuffer)

 {

-    FramebufferMap::iterator framebufferObject = mFramebufferMap.find(framebuffer);

+    Framebuffer *framebufferObject = mFramebufferNameSpace.remove(framebuffer);

 

-    if(framebufferObject != mFramebufferMap.end())

+    if(framebufferObject)

     {

         detachFramebuffer(framebuffer);

 

-        //mFramebufferNameSpace.release(framebufferObject->first);

-        delete framebufferObject->second;

-        mFramebufferMap.erase(framebufferObject);

+        delete framebufferObject;

     }

 }

 

 void Context::deleteFence(GLuint fence)

 {

-    FenceMap::iterator fenceObject = mFenceMap.find(fence);

+    Fence *fenceObject = mFenceNameSpace.remove(fence);

 

-    if(fenceObject != mFenceMap.end())

+    if(fenceObject)

     {

-        //mFenceNameSpace.release(fenceObject->first);

-        delete fenceObject->second;

-        mFenceMap.erase(fenceObject);

+        delete fenceObject;

     }

 }

 

 void Context::deleteQuery(GLuint query)

 {

-    QueryMap::iterator queryObject = mQueryMap.find(query);

-    

-	if(queryObject != mQueryMap.end())

+    Query *queryObject = mQueryNameSpace.remove(query);

+

+	if(queryObject)

     {

-        //mQueryNameSpace.release(queryObject->first);

-        

-		if(queryObject->second)

-        {

-            queryObject->second->release();

-        }

-        

-		mQueryMap.erase(queryObject);

-    }

+		queryObject->release();

+	}

 }

 

 Buffer *Context::getBuffer(GLuint handle)

@@ -994,7 +953,7 @@
 {

     if(!getFramebuffer(framebuffer))

     {

-        mFramebufferMap[framebuffer] = new Framebuffer();

+        mFramebufferNameSpace.insert(framebuffer, new Framebuffer());

     }

 

     mState.readFramebuffer = framebuffer;

@@ -1004,7 +963,7 @@
 {

     if(!getFramebuffer(framebuffer))

     {

-        mFramebufferMap[framebuffer] = new Framebuffer();

+        mFramebufferNameSpace.insert(framebuffer, new Framebuffer());

     }

 

     mState.drawFramebuffer = framebuffer;

@@ -1031,7 +990,7 @@
         {

             newProgram->addRef();

         }

-        

+

         if(oldProgram)

         {

             oldProgram->release();

@@ -1041,10 +1000,10 @@
 

 void Context::beginQuery(GLenum target, GLuint query)

 {

-    // From EXT_occlusion_query_boolean: If BeginQueryEXT is called with an <id>  

-    // of zero, if the active query object name for <target> is non-zero (for the  

-    // targets ANY_SAMPLES_PASSED_EXT and ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, if  

-    // the active query for either target is non-zero), if <id> is the name of an 

+    // From EXT_occlusion_query_boolean: If BeginQueryEXT is called with an <id>

+    // of zero, if the active query object name for <target> is non-zero (for the

+    // targets ANY_SAMPLES_PASSED_EXT and ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, if

+    // the active query for either target is non-zero), if <id> is the name of an

     // existing query object whose type does not match <target>, or if <id> is the

     // active query object name for any query type, the error INVALID_OPERATION is

     // generated.

@@ -1058,7 +1017,7 @@
     //       no query may be active for either if glBeginQuery targets either.

     for(int i = 0; i < QUERY_TYPE_COUNT; i++)

     {

-        if(mState.activeQuery[i] != NULL)

+        if(mState.activeQuery[i])

         {

             return error(GL_INVALID_OPERATION);

         }

@@ -1067,13 +1026,13 @@
     QueryType qType;

     switch(target)

     {

-    case GL_ANY_SAMPLES_PASSED: 

-        qType = QUERY_ANY_SAMPLES_PASSED; 

+    case GL_ANY_SAMPLES_PASSED:

+        qType = QUERY_ANY_SAMPLES_PASSED;

         break;

-    case GL_ANY_SAMPLES_PASSED_CONSERVATIVE: 

-        qType = QUERY_ANY_SAMPLES_PASSED_CONSERVATIVE; 

+    case GL_ANY_SAMPLES_PASSED_CONSERVATIVE:

+        qType = QUERY_ANY_SAMPLES_PASSED_CONSERVATIVE;

         break;

-    default: 

+    default:

         ASSERT(false);

     }

 

@@ -1105,31 +1064,31 @@
     switch(target)

     {

     case GL_ANY_SAMPLES_PASSED:

-        qType = QUERY_ANY_SAMPLES_PASSED; 

+        qType = QUERY_ANY_SAMPLES_PASSED;

         break;

     case GL_ANY_SAMPLES_PASSED_CONSERVATIVE:

-        qType = QUERY_ANY_SAMPLES_PASSED_CONSERVATIVE; 

+        qType = QUERY_ANY_SAMPLES_PASSED_CONSERVATIVE;

         break;

-    default: 

+    default:

         ASSERT(false);

     }

 

     Query *queryObject = mState.activeQuery[qType];

 

-    if(queryObject == NULL)

+    if(!queryObject)

     {

         return error(GL_INVALID_OPERATION);

     }

 

     queryObject->end();

 

-    mState.activeQuery[qType] = NULL;

+    mState.activeQuery[qType] = nullptr;

 }

 

 void Context::setFramebufferZero(Framebuffer *buffer)

 {

-    delete mFramebufferMap[0];

-    mFramebufferMap[0] = buffer;

+    delete mFramebufferNameSpace.remove(0);

+    mFramebufferNameSpace.insert(0, buffer);

 }

 

 void Context::setRenderbufferStorage(RenderbufferStorage *renderbuffer)

@@ -1140,49 +1099,31 @@
 

 Framebuffer *Context::getFramebuffer(unsigned int handle)

 {

-    FramebufferMap::iterator framebuffer = mFramebufferMap.find(handle);

-

-    if(framebuffer == mFramebufferMap.end())

-    {

-        return NULL;

-    }

-    else

-    {

-        return framebuffer->second;

-    }

+    return mFramebufferNameSpace.find(handle);

 }

 

 Fence *Context::getFence(unsigned int handle)

 {

-    FenceMap::iterator fence = mFenceMap.find(handle);

-

-    if(fence == mFenceMap.end())

-    {

-        return NULL;

-    }

-    else

-    {

-        return fence->second;

-    }

+    return mFenceNameSpace.find(handle);

 }

 

 Query *Context::getQuery(unsigned int handle, bool create, GLenum type)

 {

-    QueryMap::iterator query = mQueryMap.find(handle);

-

-    if(query == mQueryMap.end())

+    if(!mQueryNameSpace.isReserved(handle))

     {

-        return NULL;

+        return nullptr;

     }

     else

     {

-        if(!query->second && create)

+		Query *query = mQueryNameSpace.find(handle);

+        if(!query && create)

         {

-            query->second = new Query(handle, type);

-            query->second->addRef();

+            query = new Query(handle, type);

+            query->addRef();

+			mQueryNameSpace.insert(handle, query);

         }

 

-        return query->second;

+        return query;

     }

 }

 

@@ -1332,7 +1273,7 @@
     // Please note: DEPTH_CLEAR_VALUE is not included in our internal getIntegerv implementation

     // because it is stored as a float, despite the fact that the GL ES 2.0 spec names

     // GetIntegerv as its native query function. As it would require conversion in any

-    // case, this should make no difference to the calling application. You may find it in 

+    // case, this should make no difference to the calling application. You may find it in

     // Context::getFloatv.

     switch (pname)

     {

@@ -1388,7 +1329,7 @@
     case GL_MAX_ARRAY_TEXTURE_LAYERS:         *params = 0;                                    break;

 	case GL_NUM_COMPRESSED_TEXTURE_FORMATS:   *params = NUM_COMPRESSED_TEXTURE_FORMATS;       break;

 	case GL_MAX_SAMPLES:                      *params = IMPLEMENTATION_MAX_SAMPLES;           break;

-    case GL_SAMPLE_BUFFERS:                   

+    case GL_SAMPLE_BUFFERS:

     case GL_SAMPLES:

         {

             Framebuffer *framebuffer = getDrawFramebuffer();

@@ -1538,7 +1479,7 @@
     // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation

     // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due

     // to the fact that it is stored internally as a float, and so would require conversion

-    // if returned from Context::getIntegerv. Since this conversion is already implemented 

+    // if returned from Context::getIntegerv. Since this conversion is already implemented

     // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we

     // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling

     // application.

@@ -1737,7 +1678,7 @@
     {

 		sw::Rect scissor = {mState.scissorX, mState.scissorY, mState.scissorX + mState.scissorWidth, mState.scissorY + mState.scissorHeight};

 		scissor.clip(0, 0, width, height);

-        

+

 		device->setScissorRect(scissor);

         device->setScissorEnable(true);

     }

@@ -1835,8 +1776,8 @@
 			device->setStencilEnable(true);

 			device->setTwoSidedStencil(true);

 

-            if(mState.stencilWritemask != mState.stencilBackWritemask || 

-               mState.stencilRef != mState.stencilBackRef || 

+            if(mState.stencilWritemask != mState.stencilBackWritemask ||

+               mState.stencilRef != mState.stencilBackRef ||

                mState.stencilMask != mState.stencilBackMask)

             {

 				ERR("Separate front/back stencil writemasks, reference values, or stencil mask values are invalid under WebGL.");

@@ -1962,7 +1903,7 @@
                     }

                 }

             }

-            

+

             if(mState.sampleCoverageInvert)

             {

                 mask = ~mask;

@@ -2009,7 +1950,7 @@
 

 		sw::Resource *resource = attributes[i].vertexBuffer;

 		const void *buffer = (char*)resource->data() + attributes[i].offset;

-			

+

 		int stride = attributes[i].stride;

 

 		buffer = (char*)buffer + stride * base;

@@ -2162,7 +2103,7 @@
 	}

 

 	device->setTextureResource(sampler, resource);

-			

+

 	if(baseTexture && textureUsed)

 	{

 		int levelCount = baseTexture->getLevelCount();

@@ -2237,7 +2178,7 @@
     }

 

 	GLsizei outputPitch = ComputePitch(width, format, type, mState.packAlignment);

-    

+

 	// Sized query sanity check

     if(bufSize)

     {

@@ -2412,7 +2353,7 @@
 					switch(type)

 					{

 					case GL_UNSIGNED_SHORT_5_6_5:   // IMPLEMENTATION_COLOR_READ_TYPE

-						dest16[i + j * outputPitch / sizeof(unsigned short)] = 

+						dest16[i + j * outputPitch / sizeof(unsigned short)] =

 							((unsigned short)(31 * b + 0.5f) << 0) |

 							((unsigned short)(63 * g + 0.5f) << 5) |

 							((unsigned short)(31 * r + 0.5f) << 11);

@@ -2450,7 +2391,7 @@
 	if(mask & GL_COLOR_BUFFER_BIT)

 	{

 		unsigned int rgbaMask = (mState.colorMaskRed ? 0x1 : 0) |

-		                        (mState.colorMaskGreen ? 0x2 : 0) | 

+		                        (mState.colorMaskGreen ? 0x2 : 0) |

 		                        (mState.colorMaskBlue ? 0x4 : 0) |

 		                        (mState.colorMaskAlpha ? 0x8 : 0);

 

@@ -2694,19 +2635,19 @@
 

     if(mState.arrayBuffer.name() == buffer)

     {

-        mState.arrayBuffer = NULL;

+        mState.arrayBuffer = nullptr;

     }

 

     if(mState.elementArrayBuffer.name() == buffer)

     {

-        mState.elementArrayBuffer = NULL;

+        mState.elementArrayBuffer = nullptr;

     }

 

     for(int attribute = 0; attribute < MAX_VERTEX_ATTRIBS; attribute++)

     {

         if(mState.vertexAttribute[attribute].mBoundBuffer.name() == buffer)

         {

-            mState.vertexAttribute[attribute].mBoundBuffer = NULL;

+            mState.vertexAttribute[attribute].mBoundBuffer = nullptr;

         }

     }

 }

@@ -2722,7 +2663,7 @@
         {

             if(mState.samplerTexture[type][sampler].name() == texture)

             {

-                mState.samplerTexture[type][sampler] = NULL;

+                mState.samplerTexture[type][sampler] = nullptr;

             }

         }

     }

@@ -2825,7 +2766,7 @@
     mVertexDataManager->dirtyCurrentValue(index);

 }

 

-void Context::blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, 

+void Context::blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,

                               GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,

                               GLbitfield mask)

 {

@@ -2916,7 +2857,7 @@
     sw::Rect sourceTrimmedRect = sourceScissoredRect;

     sw::Rect destTrimmedRect = destScissoredRect;

 

-    // The source & destination rectangles also may need to be trimmed if they fall out of the bounds of 

+    // The source & destination rectangles also may need to be trimmed if they fall out of the bounds of

     // the actual draw and read surfaces.

     if(sourceTrimmedRect.x0 < 0)

     {

@@ -2977,7 +2918,7 @@
     bool partialBufferCopy = false;

 

     if(sourceTrimmedRect.y1 - sourceTrimmedRect.y0 < readBufferHeight ||

-       sourceTrimmedRect.x1 - sourceTrimmedRect.x0 < readBufferWidth || 

+       sourceTrimmedRect.x1 - sourceTrimmedRect.x0 < readBufferWidth ||

        destTrimmedRect.y1 - destTrimmedRect.y0 < drawBufferHeight ||

        destTrimmedRect.x1 - destTrimmedRect.x0 < drawBufferWidth ||

        sourceTrimmedRect.y0 != 0 || destTrimmedRect.y0 != 0 || sourceTrimmedRect.x0 != 0 || destTrimmedRect.x0 != 0)

@@ -3000,7 +2941,7 @@
             ERR("Color buffer format conversion in BlitFramebufferANGLE not supported by this implementation");

             return error(GL_INVALID_OPERATION);

         }

-        

+

         if(partialBufferCopy && readBufferSamples > 1)

         {

             return error(GL_INVALID_OPERATION);

@@ -3011,8 +2952,8 @@
 

     if(mask & (GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT))

     {

-        Renderbuffer *readDSBuffer = NULL;

-        Renderbuffer *drawDSBuffer = NULL;

+        Renderbuffer *readDSBuffer = nullptr;

+        Renderbuffer *drawDSBuffer = nullptr;

 

         // We support OES_packed_depth_stencil, and do not support a separately attached depth and stencil buffer, so if we have

         // both a depth and stencil buffer, it will be the same buffer.

@@ -3055,7 +2996,7 @@
             return error(GL_INVALID_OPERATION);   // Only whole-buffer copies are permitted

         }

 

-        if((drawDSBuffer && drawDSBuffer->getSamples() > 1) || 

+        if((drawDSBuffer && drawDSBuffer->getSamples() > 1) ||

            (readDSBuffer && readDSBuffer->getSamples() > 1))

         {

             return error(GL_INVALID_OPERATION);

@@ -3068,7 +3009,7 @@
         {

             Image *readRenderTarget = readFramebuffer->getRenderTarget();

             Image *drawRenderTarget = drawFramebuffer->getRenderTarget();

- 

+

             bool success = device->stretchRect(readRenderTarget, &sourceRect, drawRenderTarget, &destRect, false);

 

             readRenderTarget->release();

@@ -3083,7 +3024,7 @@
 

         if(blitDepthStencil)

         {

-            bool success = device->stretchRect(readFramebuffer->getDepthStencil(), NULL, drawFramebuffer->getDepthStencil(), NULL, false);

+            bool success = device->stretchRect(readFramebuffer->getDepthStencil(), nullptr, drawFramebuffer->getDepthStencil(), nullptr, false);

 

             if(!success)

             {

@@ -3163,7 +3104,7 @@
         return error(GL_INVALID_OPERATION);

     }

 

-    currentMatrixStack().translate(x, y, z);  

+    currentMatrixStack().translate(x, y, z);

 }

 

 void Context::scale(GLfloat x, GLfloat y, GLfloat z)

@@ -3252,7 +3193,7 @@
     {

         return error(GL_INVALID_OPERATION);

     }

-	

+

 	switch(func)

 	{

 	case GL_NEVER:    device->setAlphaCompare(sw::ALPHA_NEVER);        break;

@@ -3560,7 +3501,7 @@
     }

 

 	applyTextures();

-	

+

     switch(drawMode)

     {

     case GL_POINTS:

diff --git a/src/OpenGL/libGL/Context.h b/src/OpenGL/libGL/Context.h
index 6b12f0f..943eca5 100644
--- a/src/OpenGL/libGL/Context.h
+++ b/src/OpenGL/libGL/Context.h
@@ -523,7 +523,7 @@
     bool isDepthTestEnabled() const;

     void setDepthFunc(GLenum depthFunc);

     void setDepthRange(float zNear, float zFar);

-    

+

     void setBlendEnabled(bool enabled);

     bool isBlendEnabled() const;

     void setBlendFactors(GLenum sourceRGB, GLenum destRGB, GLenum sourceAlpha, GLenum destAlpha);

@@ -590,7 +590,7 @@
     void setPackAlignment(GLint alignment);

     GLint getPackAlignment() const;

 

-    // These create  and destroy methods are merely pass-throughs to 

+    // These create  and destroy methods are merely pass-throughs to

     // ResourceManager, which owns these object types

     GLuint createBuffer();

     GLuint createShader(GLenum type);

@@ -674,8 +674,8 @@
     GLenum getError();

 

     static int getSupportedMultisampleCount(int requested);

-    

-    void blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, 

+

+    void blitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,

                          GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,

                          GLbitfield mask);

 

@@ -753,17 +753,9 @@
     BindingPointer<Texture2D> mProxyTexture2DZero;

     BindingPointer<TextureCubeMap> mTextureCubeMapZero;

 

-    typedef std::map<GLint, Framebuffer*> FramebufferMap;

-    FramebufferMap mFramebufferMap;

-    //NameSpace mFramebufferNameSpace;

-

-    typedef std::map<GLint, Fence*> FenceMap;

-    FenceMap mFenceMap;

-    //NameSpace mFenceNameSpace;

-

-	typedef std::map<GLint, Query*> QueryMap;

-    QueryMap mQueryMap;

-    //NameSpace mQueryNameSpace;

+	gl::NameSpace<Framebuffer> mFramebufferNameSpace;

+	gl::NameSpace<Fence, 0> mFenceNameSpace;

+	gl::NameSpace<Query> mQueryNameSpace;

 

     VertexDataManager *mVertexDataManager;

     IndexDataManager *mIndexDataManager;

@@ -778,7 +770,7 @@
     bool mHasBeenCurrent;

 

     unsigned int mAppliedProgramSerial;

-    

+

     // state caching flags

     bool mDepthStateDirty;

     bool mMaskStateDirty;

diff --git a/src/OpenGL/libGLES_CM/Context.cpp b/src/OpenGL/libGLES_CM/Context.cpp
index a6db78c..5cc63be 100644
--- a/src/OpenGL/libGLES_CM/Context.cpp
+++ b/src/OpenGL/libGLES_CM/Context.cpp
@@ -245,9 +245,9 @@
 

 Context::~Context()

 {

-    while(!mFramebufferMap.empty())

+    while(!mFramebufferNameSpace.empty())

     {

-        deleteFramebuffer(mFramebufferMap.begin()->first);

+        deleteFramebuffer(mFramebufferNameSpace.firstName());

     }

 

     for(int type = 0; type < TEXTURE_TYPE_COUNT; type++)

@@ -933,54 +933,39 @@
 // Returns an unused framebuffer name

 GLuint Context::createFramebuffer()

 {

-    GLuint handle = mFramebufferNameSpace.allocate();

-

-    mFramebufferMap[handle] = nullptr;

-

-    return handle;

+	return mFramebufferNameSpace.allocate();

 }

 

 void Context::deleteBuffer(GLuint buffer)

 {

-    if(mResourceManager->getBuffer(buffer))

-    {

-        detachBuffer(buffer);

-    }

+	detachBuffer(buffer);

 

     mResourceManager->deleteBuffer(buffer);

 }

 

 void Context::deleteTexture(GLuint texture)

 {

-    if(mResourceManager->getTexture(texture))

-    {

-        detachTexture(texture);

-    }

+	detachTexture(texture);

 

     mResourceManager->deleteTexture(texture);

 }

 

 void Context::deleteRenderbuffer(GLuint renderbuffer)

 {

-    if(mResourceManager->getRenderbuffer(renderbuffer))

-    {

-        detachRenderbuffer(renderbuffer);

-    }

+	detachRenderbuffer(renderbuffer);

 

     mResourceManager->deleteRenderbuffer(renderbuffer);

 }

 

 void Context::deleteFramebuffer(GLuint framebuffer)

 {

-    FramebufferMap::iterator framebufferObject = mFramebufferMap.find(framebuffer);

+	detachFramebuffer(framebuffer);

 

-    if(framebufferObject != mFramebufferMap.end())

+    Framebuffer *framebufferObject = mFramebufferNameSpace.remove(framebuffer);

+

+    if(framebufferObject)

     {

-        detachFramebuffer(framebuffer);

-

-		delete framebufferObject->second;

-        mFramebufferNameSpace.remove(framebufferObject->first);

-        mFramebufferMap.erase(framebufferObject);

+		delete framebufferObject;

     }

 }

 

@@ -1036,7 +1021,7 @@
 {

     if(!getFramebuffer(framebuffer))

     {

-        mFramebufferMap[framebuffer] = new Framebuffer();

+		mFramebufferNameSpace.insert(framebuffer, new Framebuffer());

     }

 

     mState.framebuffer = framebuffer;

@@ -1051,8 +1036,8 @@
 

 void Context::setFramebufferZero(Framebuffer *buffer)

 {

-    delete mFramebufferMap[0];

-    mFramebufferMap[0] = buffer;

+	delete mFramebufferNameSpace.remove(0);

+    mFramebufferNameSpace.insert(0, buffer);

 }

 

 void Context::setRenderbufferStorage(RenderbufferStorage *renderbuffer)

@@ -1063,16 +1048,7 @@
 

 Framebuffer *Context::getFramebuffer(unsigned int handle)

 {

-    FramebufferMap::iterator framebuffer = mFramebufferMap.find(handle);

-

-    if(framebuffer == mFramebufferMap.end())

-    {

-        return nullptr;

-    }

-    else

-    {

-        return framebuffer->second;

-    }

+	return mFramebufferNameSpace.find(handle);

 }

 

 Buffer *Context::getArrayBuffer()

diff --git a/src/OpenGL/libGLES_CM/Context.h b/src/OpenGL/libGLES_CM/Context.h
index d42cab1..4e86885 100644
--- a/src/OpenGL/libGLES_CM/Context.h
+++ b/src/OpenGL/libGLES_CM/Context.h
@@ -594,9 +594,7 @@
     gl::BindingPointer<Texture2D> mTexture2DZero;

     gl::BindingPointer<TextureExternal> mTextureExternalZero;

 

-    typedef std::map<GLint, Framebuffer*> FramebufferMap;

-    FramebufferMap mFramebufferMap;

-    gl::NameSpace<Framebuffer> mFramebufferNameSpace;

+	gl::NameSpace<Framebuffer> mFramebufferNameSpace;

 

     VertexDataManager *mVertexDataManager;

     IndexDataManager *mIndexDataManager;

diff --git a/src/OpenGL/libGLES_CM/ResourceManager.cpp b/src/OpenGL/libGLES_CM/ResourceManager.cpp
index 62545c2..54d71b9 100644
--- a/src/OpenGL/libGLES_CM/ResourceManager.cpp
+++ b/src/OpenGL/libGLES_CM/ResourceManager.cpp
@@ -86,7 +86,7 @@
 
 void ResourceManager::deleteTexture(GLuint texture)
 {
-    Texture *textureObject = mTextureNameSpace.find(texture);
+    Texture *textureObject = mTextureNameSpace.remove(texture);
 
     if(textureObject)
     {
@@ -96,7 +96,7 @@
 
 void ResourceManager::deleteRenderbuffer(GLuint renderbuffer)
 {
-    Renderbuffer *renderbufferObject = mRenderbufferNameSpace.find(renderbuffer);
+    Renderbuffer *renderbufferObject = mRenderbufferNameSpace.remove(renderbuffer);
 
     if(renderbufferObject)
     {
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index 8fd484d..2c6b068 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -115,7 +115,7 @@
     mState.colorMaskAlpha = true;

     mState.depthMask = true;

 

-    if(shareContext != NULL)

+    if(shareContext)

     {

         mResourceManager = shareContext->mResourceManager;

         mResourceManager->addRef();

@@ -164,8 +164,8 @@
 	mState.unpackInfo.skipRows = 0;

 	mState.unpackInfo.skipImages = 0;

 

-    mVertexDataManager = NULL;

-    mIndexDataManager = NULL;

+    mVertexDataManager = nullptr;

+    mIndexDataManager = nullptr;

 

     mInvalidEnum = false;

     mInvalidValue = false;

@@ -190,67 +190,67 @@
 		mState.currentProgram = 0;

 	}

 

-	while(!mFramebufferMap.empty())

+	while(!mFramebufferNameSpace.empty())

 	{

-		deleteFramebuffer(mFramebufferMap.begin()->first);

+		deleteFramebuffer(mFramebufferNameSpace.firstName());

 	}

 

-	while(!mFenceMap.empty())

+	while(!mFenceNameSpace.empty())

 	{

-		deleteFence(mFenceMap.begin()->first);

+		deleteFence(mFenceNameSpace.firstName());

 	}

 

-	while(!mQueryMap.empty())

+	while(!mQueryNameSpace.empty())

 	{

-		deleteQuery(mQueryMap.begin()->first);

+		deleteQuery(mQueryNameSpace.firstName());

 	}

 

-	while(!mVertexArrayMap.empty())

+	while(!mVertexArrayNameSpace.empty())

 	{

-		deleteVertexArray(mVertexArrayMap.begin()->first);

+		deleteVertexArray(mVertexArrayNameSpace.firstName());

 	}

 

-	while(!mTransformFeedbackMap.empty())

+	while(!mTransformFeedbackNameSpace.empty())

 	{

-		deleteTransformFeedback(mTransformFeedbackMap.begin()->first);

+		deleteTransformFeedback(mTransformFeedbackNameSpace.firstName());

 	}

 

 	for(int type = 0; type < TEXTURE_TYPE_COUNT; type++)

 	{

 		for(int sampler = 0; sampler < MAX_COMBINED_TEXTURE_IMAGE_UNITS; sampler++)

 		{

-			mState.samplerTexture[type][sampler] = NULL;

+			mState.samplerTexture[type][sampler] = nullptr;

 		}

 	}

 

 	for(int i = 0; i < MAX_VERTEX_ATTRIBS; i++)

 	{

-		mState.vertexAttribute[i].mBoundBuffer = NULL;

+		mState.vertexAttribute[i].mBoundBuffer = nullptr;

 	}

 

 	for(int i = 0; i < QUERY_TYPE_COUNT; i++)

 	{

-		mState.activeQuery[i] = NULL;

+		mState.activeQuery[i] = nullptr;

 	}

 

-	mState.arrayBuffer = NULL;

-	mState.copyReadBuffer = NULL;

-	mState.copyWriteBuffer = NULL;

-	mState.pixelPackBuffer = NULL;

-	mState.pixelUnpackBuffer = NULL;

-	mState.genericUniformBuffer = NULL;

-	mState.renderbuffer = NULL;

+	mState.arrayBuffer = nullptr;

+	mState.copyReadBuffer = nullptr;

+	mState.copyWriteBuffer = nullptr;

+	mState.pixelPackBuffer = nullptr;

+	mState.pixelUnpackBuffer = nullptr;

+	mState.genericUniformBuffer = nullptr;

+	mState.renderbuffer = nullptr;

 

 	for(int i = 0; i < MAX_COMBINED_TEXTURE_IMAGE_UNITS; ++i)

 	{

-		mState.sampler[i] = NULL;

+		mState.sampler[i] = nullptr;

 	}

 

-    mTexture2DZero = NULL;

-	mTexture3DZero = NULL;

-	mTexture2DArrayZero = NULL;

-    mTextureCubeMapZero = NULL;

-    mTextureExternalZero = NULL;

+    mTexture2DZero = nullptr;

+	mTexture3DZero = nullptr;

+	mTexture2DArrayZero = nullptr;

+    mTextureCubeMapZero = nullptr;

+    mTextureExternalZero = nullptr;

 

     delete mVertexDataManager;

     delete mIndexDataManager;

@@ -767,7 +767,7 @@
 

 GLuint Context::getActiveQuery(GLenum target) const

 {

-    Query *queryObject = NULL;

+    Query *queryObject = nullptr;

 

     switch(target)

     {

@@ -921,40 +921,24 @@
 // Returns an unused framebuffer name

 GLuint Context::createFramebuffer()

 {

-    GLuint handle = mFramebufferNameSpace.allocate();

-

-    mFramebufferMap[handle] = NULL;

-

-    return handle;

+    return mFramebufferNameSpace.allocate();

 }

 

 GLuint Context::createFence()

 {

-    GLuint handle = mFenceNameSpace.allocate();

-

-    mFenceMap[handle] = new Fence;

-

-    return handle;

+	return mFenceNameSpace.allocate(new Fence());

 }

 

 // Returns an unused query name

 GLuint Context::createQuery()

 {

-    GLuint handle = mQueryNameSpace.allocate();

-

-    mQueryMap[handle] = NULL;

-

-    return handle;

+	return mQueryNameSpace.allocate();

 }

 

 // Returns an unused vertex array name

 GLuint Context::createVertexArray()

 {

-	GLuint handle = mVertexArrayNameSpace.allocate();

-

-	mVertexArrayMap[handle] = nullptr;

-

-	return handle;

+	return mVertexArrayNameSpace.allocate();

 }

 

 GLsync Context::createFenceSync(GLenum condition, GLbitfield flags)

@@ -967,11 +951,7 @@
 // Returns an unused transform feedback name

 GLuint Context::createTransformFeedback()

 {

-	GLuint handle = mTransformFeedbackNameSpace.allocate();

-

-	mTransformFeedbackMap[handle] = NULL;

-

-	return handle;

+	return mTransformFeedbackNameSpace.allocate();

 }

 

 // Returns an unused sampler name

@@ -982,10 +962,7 @@
 

 void Context::deleteBuffer(GLuint buffer)

 {

-    if(mResourceManager->getBuffer(buffer))

-    {

-        detachBuffer(buffer);

-    }

+	detachBuffer(buffer);

 

     mResourceManager->deleteBuffer(buffer);

 }

@@ -1002,87 +979,65 @@
 

 void Context::deleteTexture(GLuint texture)

 {

-    if(mResourceManager->getTexture(texture))

-    {

-        detachTexture(texture);

-    }

+	detachTexture(texture);

 

     mResourceManager->deleteTexture(texture);

 }

 

 void Context::deleteRenderbuffer(GLuint renderbuffer)

 {

-    if(mResourceManager->getRenderbuffer(renderbuffer))

-    {

-        detachRenderbuffer(renderbuffer);

-    }

+	detachRenderbuffer(renderbuffer);

 

     mResourceManager->deleteRenderbuffer(renderbuffer);

 }

 

 void Context::deleteFramebuffer(GLuint framebuffer)

 {

-    FramebufferMap::iterator framebufferObject = mFramebufferMap.find(framebuffer);

+	detachFramebuffer(framebuffer);

 

-    if(framebufferObject != mFramebufferMap.end())

+    Framebuffer *framebufferObject = mFramebufferNameSpace.remove(framebuffer);

+

+    if(framebufferObject)

     {

-        detachFramebuffer(framebuffer);

-

-		delete framebufferObject->second;

-		mFramebufferNameSpace.remove(framebufferObject->first);

-        mFramebufferMap.erase(framebufferObject);

+		delete framebufferObject;

     }

 }

 

 void Context::deleteFence(GLuint fence)

 {

-    FenceMap::iterator fenceObject = mFenceMap.find(fence);

+    Fence *fenceObject = mFenceNameSpace.remove(fence);

 

-    if(fenceObject != mFenceMap.end())

+    if(fenceObject)

     {

-		delete fenceObject->second;

-		mFenceNameSpace.remove(fenceObject->first);

-        mFenceMap.erase(fenceObject);

+		delete fenceObject;

     }

 }

 

 void Context::deleteQuery(GLuint query)

 {

-    QueryMap::iterator queryObject = mQueryMap.find(query);

+    Query *queryObject = mQueryNameSpace.remove(query);

 

-	if(queryObject != mQueryMap.end())

+	if(queryObject)

     {

-		if(queryObject->second)

-        {

-            queryObject->second->release();

-        }

-

-        mQueryNameSpace.remove(queryObject->first);

-		mQueryMap.erase(queryObject);

+		queryObject->release();

     }

 }

 

 void Context::deleteVertexArray(GLuint vertexArray)

 {

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

-

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

+	// [OpenGL ES 3.0.2] section 2.10 page 43:

+	// If a vertex array object that is currently bound is deleted, the binding

+	// for that object reverts to zero and the default vertex array becomes current.

+	if(getCurrentVertexArray()->name == vertexArray)

 	{

-		// Vertex array detachment is handled by Context, because 0 is a valid

-		// VAO, and a pointer to it must be passed from Context to State at

-		// binding time.

+		bindVertexArray(0);

+	}

 

-		// [OpenGL ES 3.0.2] section 2.10 page 43:

-		// If a vertex array object that is currently bound is deleted, the binding

-		// for that object reverts to zero and the default vertex array becomes current.

-		if(getCurrentVertexArray()->name == vertexArray)

-		{

-			bindVertexArray(0);

-		}

+	VertexArray *vertexArrayObject = mVertexArrayNameSpace.remove(vertexArray);

 

-		delete vertexArrayObject->second;

-		mVertexArrayNameSpace.remove(vertexArrayObject->first);

-		mVertexArrayMap.erase(vertexArrayObject);

+	if(vertexArrayObject)

+	{

+		delete vertexArrayObject;

 	}

 }

 

@@ -1097,22 +1052,17 @@
 

 void Context::deleteTransformFeedback(GLuint transformFeedback)

 {

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

+	TransformFeedback *transformFeedbackObject = mTransformFeedbackNameSpace.remove(transformFeedback);

 

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

+	if(transformFeedbackObject)

 	{

-		delete transformFeedbackObject->second;

-		mTransformFeedbackNameSpace.remove(transformFeedbackObject->first);

-		mTransformFeedbackMap.erase(transformFeedbackObject);

+		delete transformFeedbackObject;

 	}

 }

 

 void Context::deleteSampler(GLuint sampler)

 {

-	if(mResourceManager->getSampler(sampler))

-	{

-		detachSampler(sampler);

-	}

+	detachSampler(sampler);

 

 	mResourceManager->deleteSampler(sampler);

 }

@@ -1245,7 +1195,7 @@
 {

     if(!getFramebuffer(framebuffer))

     {

-        mFramebufferMap[framebuffer] = new Framebuffer();

+        mFramebufferNameSpace.insert(framebuffer, new Framebuffer());

     }

 

     mState.readFramebuffer = framebuffer;

@@ -1255,7 +1205,7 @@
 {

     if(!getFramebuffer(framebuffer))

     {

-        mFramebufferMap[framebuffer] = new Framebuffer();

+        mFramebufferNameSpace.insert(framebuffer, new Framebuffer());

     }

 

     mState.drawFramebuffer = framebuffer;

@@ -1275,7 +1225,7 @@
 	if(!vertexArray)

 	{

 		vertexArray = new VertexArray(array);

-		mVertexArrayMap[array] = vertexArray;

+		mVertexArrayNameSpace.insert(array, vertexArray);

 	}

 

 	mState.vertexArray = array;

@@ -1311,16 +1261,14 @@
 	getTransformFeedback()->setBuffer(index, bufferObject, offset, size);

 }

 

-bool Context::bindTransformFeedback(GLuint id)

+void Context::bindTransformFeedback(GLuint id)

 {

 	if(!getTransformFeedback(id))

 	{

-		mTransformFeedbackMap[id] = new TransformFeedback(id);

+		mTransformFeedbackNameSpace.insert(id, new TransformFeedback(id));

 	}

 

 	mState.transformFeedback = id;

-

-	return true;

 }

 

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

@@ -1378,7 +1326,7 @@
     //       no query may be active for either if glBeginQuery targets either.

     for(int i = 0; i < QUERY_TYPE_COUNT; i++)

     {

-        if(mState.activeQuery[i] != NULL)

+        if(mState.activeQuery[i])

         {

             return error(GL_INVALID_OPERATION);

         }

@@ -1435,20 +1383,20 @@
 

     Query *queryObject = mState.activeQuery[qType];

 

-    if(queryObject == NULL)

+    if(!queryObject)

     {

         return error(GL_INVALID_OPERATION);

     }

 

     queryObject->end();

 

-    mState.activeQuery[qType] = NULL;

+    mState.activeQuery[qType] = nullptr;

 }

 

 void Context::setFramebufferZero(Framebuffer *buffer)

 {

-    delete mFramebufferMap[0];

-    mFramebufferMap[0] = buffer;

+    delete mFramebufferNameSpace.remove(0);

+    mFramebufferNameSpace.insert(0, buffer);

 }

 

 void Context::setRenderbufferStorage(RenderbufferStorage *renderbuffer)

@@ -1459,30 +1407,12 @@
 

 Framebuffer *Context::getFramebuffer(unsigned int handle) const

 {

-    FramebufferMap::const_iterator framebuffer = mFramebufferMap.find(handle);

-

-    if(framebuffer == mFramebufferMap.end())

-    {

-        return NULL;

-    }

-    else

-    {

-        return framebuffer->second;

-    }

+	return mFramebufferNameSpace.find(handle);

 }

 

 Fence *Context::getFence(unsigned int handle) const

 {

-    FenceMap::const_iterator fence = mFenceMap.find(handle);

-

-    if(fence == mFenceMap.end())

-    {

-        return NULL;

-    }

-    else

-    {

-        return fence->second;

-    }

+	return mFenceNameSpace.find(handle);

 }

 

 FenceSync *Context::getFenceSync(GLsync handle) const

@@ -1492,43 +1422,32 @@
 

 Query *Context::getQuery(unsigned int handle) const

 {

-	QueryMap::const_iterator query = mQueryMap.find(handle);

-

-	if(query == mQueryMap.end())

-	{

-		return NULL;

-	}

-	else

-	{

-		return query->second;

-	}

+	return mQueryNameSpace.find(handle);

 }

 

 Query *Context::createQuery(unsigned int handle, GLenum type)

 {

-	QueryMap::iterator query = mQueryMap.find(handle);

-

-	if(query == mQueryMap.end())

+	if(!mQueryNameSpace.isReserved(handle))

 	{

-		return NULL;

+		return nullptr;

 	}

 	else

 	{

-		if(!query->second)

+		Query *query = mQueryNameSpace.find(handle);

+		if(!query)

 		{

-			query->second = new Query(handle, type);

-			query->second->addRef();

+			query = new Query(handle, type);

+			query->addRef();

+			mQueryNameSpace.insert(handle, query);

 		}

 

-		return query->second;

+		return query;

 	}

 }

 

 VertexArray *Context::getVertexArray(GLuint array) const

 {

-	VertexArrayMap::const_iterator vertexArray = mVertexArrayMap.find(array);

-

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

+	return mVertexArrayNameSpace.find(array);

 }

 

 VertexArray *Context::getCurrentVertexArray() const

@@ -1538,9 +1457,7 @@
 

 bool Context::isVertexArray(GLuint array) const

 {

-	VertexArrayMap::const_iterator vertexArray = mVertexArrayMap.find(array);

-

-	return vertexArray != mVertexArrayMap.end();

+	return mVertexArrayNameSpace.isReserved(array);

 }

 

 bool Context::hasZeroDivisor() const

@@ -1561,9 +1478,7 @@
 

 TransformFeedback *Context::getTransformFeedback(GLuint transformFeedback) const

 {

-	TransformFeedbackMap::const_iterator transformFeedbackObject = mTransformFeedbackMap.find(transformFeedback);

-

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

+	return mTransformFeedbackNameSpace.find(transformFeedback);

 }

 

 Sampler *Context::getSampler(GLuint sampler) const

@@ -3740,7 +3655,7 @@
 	{

 		if(mState.vertexAttribute[attribute].mBoundBuffer.name() == buffer)

 		{

-			mState.vertexAttribute[attribute].mBoundBuffer = NULL;

+			mState.vertexAttribute[attribute].mBoundBuffer = nullptr;

 		}

 	}

 }

@@ -3757,7 +3672,7 @@
         {

             if(mState.samplerTexture[type][sampler].name() == texture)

             {

-                mState.samplerTexture[type][sampler] = NULL;

+                mState.samplerTexture[type][sampler] = nullptr;

             }

         }

     }

@@ -3839,7 +3754,7 @@
 		gl::BindingPointer<Sampler> &samplerBinding = mState.sampler[textureUnit];

 		if(samplerBinding.name() == sampler)

 		{

-			samplerBinding = NULL;

+			samplerBinding = nullptr;

 		}

 	}

 }

@@ -4095,8 +4010,8 @@
 

     if(mask & (GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT))

     {

-        Renderbuffer *readDSBuffer = NULL;

-        Renderbuffer *drawDSBuffer = NULL;

+        Renderbuffer *readDSBuffer = nullptr;

+        Renderbuffer *drawDSBuffer = nullptr;

 

         if(mask & GL_DEPTH_BUFFER_BIT)

         {

@@ -4357,7 +4272,7 @@
 	if(index == GL_INVALID_INDEX)

 	{

 		static GLubyte* extensionsCat = nullptr;

-		if((extensionsCat == nullptr) && (numExtensions > 0))

+		if(!extensionsCat && (numExtensions > 0))

 		{

 			int totalLength = numExtensions; // 1 space between each extension name + terminating null

 			for(unsigned int i = 0; i < numExtensions; i++)

diff --git a/src/OpenGL/libGLESv2/Context.h b/src/OpenGL/libGLESv2/Context.h
index 4d260e3..6eb82e4 100644
--- a/src/OpenGL/libGLESv2/Context.h
+++ b/src/OpenGL/libGLESv2/Context.h
@@ -575,7 +575,7 @@
 	void bindIndexedUniformBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size);

 	void bindGenericTransformFeedbackBuffer(GLuint buffer);

 	void bindIndexedTransformFeedbackBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size);

-	bool bindTransformFeedback(GLuint transformFeedback);

+	void bindTransformFeedback(GLuint transformFeedback);

 	bool bindSampler(GLuint unit, GLuint sampler);

     void useProgram(GLuint program);

 

@@ -709,24 +709,10 @@
 	gl::BindingPointer<TextureCubeMap> mTextureCubeMapZero;

     gl::BindingPointer<TextureExternal> mTextureExternalZero;

 

-    typedef std::map<GLint, Framebuffer*> FramebufferMap;

-    FramebufferMap mFramebufferMap;

-    gl::NameSpace<Framebuffer> mFramebufferNameSpace;

-

-    typedef std::map<GLint, Fence*> FenceMap;

-    FenceMap mFenceMap;

-    gl::NameSpace<Fence, 0> mFenceNameSpace;

-

-	typedef std::map<GLint, Query*> QueryMap;

-    QueryMap mQueryMap;

-    gl::NameSpace<Query> mQueryNameSpace;

-

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

-	VertexArrayMap mVertexArrayMap;

+	gl::NameSpace<Framebuffer> mFramebufferNameSpace;

+	gl::NameSpace<Fence, 0> mFenceNameSpace;

+	gl::NameSpace<Query> mQueryNameSpace;

 	gl::NameSpace<VertexArray> mVertexArrayNameSpace;

-

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

-	TransformFeedbackMap mTransformFeedbackMap;

 	gl::NameSpace<TransformFeedback> mTransformFeedbackNameSpace;

 

     VertexDataManager *mVertexDataManager;

diff --git a/src/OpenGL/libGLESv2/libGLESv3.cpp b/src/OpenGL/libGLESv2/libGLESv3.cpp
index f8c58ab..a83533a 100644
--- a/src/OpenGL/libGLESv2/libGLESv3.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv3.cpp
@@ -3576,10 +3576,7 @@
 			return error(GL_INVALID_OPERATION);

 		}

 

-		if(!context->bindTransformFeedback(id))

-		{

-			return error(GL_INVALID_OPERATION);

-		}

+		context->bindTransformFeedback(id);

 	}

 }