Always create an OpenGL ES 3.0 context.

The EGL spec allows that on context creation, a newer, compatible
version is returned. OpenGL ES 3.0 is stated to be backward compatible
with OpenGL ES 2.0, so we can stop creating a context that is limited to
OpenGL ES 2.0 features, and always return an OpenGL ES 3.0 context.

This simplifies our code and maintenance a bit and reduces the risk of
incorrect validation.

Note that Appendix F of the OpenGL ES 3.0 specification lists changes
in behavior that aren't entirely backward compatible with OpenGL ES 2.0:
* OpenGL ES 3.0 requires that all cube map filtering be seamless. OpenGL
  ES 2.0 specified that a single cube map face be selected and used for
  filtering. See section 3.8.9.1.
* OpenGL ES 3.0 specifies a zero-preserving mapping when converting back
  and forth between signed normalized fixed-point values and floating-
  point values. OpenGL ES 2.0 specified a mapping by which zeros are not
  preserved. See section 2.1.6.
* OpenGL ES 3.0 requires that framebuffer objects not be shared between
  contexts. OpenGL ES 2.0 left it undefined whether framebuffer objects
  could be shared. See appendix D.

Additional differences can stem from new extensions being exposed (e.g.
GL_EXT_color_buffer_float), and framebuffer configurations that are
newly supported or no longer supported (in particular we allowed
separate depth and stencil attachments, which OpenGL ES 3.0 expressly
disallows).

See also https://gitlab.khronos.org/opengl/API/issues/82

Bug swiftshader:45

Change-Id: I90d72698d509b4f03263edcf7c67e44fcef0beb6
Reviewed-on: https://swiftshader-review.googlesource.com/19388
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Common/Version.h b/src/Common/Version.h
index 6b422ac..4dbc92f 100644
--- a/src/Common/Version.h
+++ b/src/Common/Version.h
@@ -13,9 +13,9 @@
 // limitations under the License.
 
 #define MAJOR_VERSION 4
-#define MINOR_VERSION 0
+#define MINOR_VERSION 1
 #define BUILD_VERSION 0
-#define BUILD_REVISION 7
+#define BUILD_REVISION 0
 
 #define STRINGIFY(x) #x
 #define MACRO_STRINGIFY(x) STRINGIFY(x)
diff --git a/src/OpenGL/libEGL/Display.cpp b/src/OpenGL/libEGL/Display.cpp
index 343e4ce..0b2c6dd 100644
--- a/src/OpenGL/libEGL/Display.cpp
+++ b/src/OpenGL/libEGL/Display.cpp
@@ -576,7 +576,7 @@
 	{
 		if(libGLESv2)
 		{
-			context = libGLESv2->es2CreateContext(this, shareContext, clientVersion, config);
+			context = libGLESv2->es2CreateContext(this, shareContext, config);
 		}
 	}
 	else
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index a479f18..57fa354 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -45,8 +45,8 @@
 
 namespace es2
 {
-Context::Context(egl::Display *display, const Context *shareContext, EGLint clientVersion, const egl::Config *config)
-	: egl::Context(display), clientVersion(clientVersion), config(config)
+Context::Context(egl::Display *display, const Context *shareContext, const egl::Config *config)
+	: egl::Context(display), config(config)
 {
 	sw::Context *context = new sw::Context();
 	device = new es2::Device(context);
@@ -316,7 +316,7 @@
 
 EGLint Context::getClientVersion() const
 {
-	return clientVersion;
+	return 3;
 }
 
 EGLint Context::getConfigID() const
@@ -1603,48 +1603,26 @@
 		*buffer = getElementArrayBuffer();
 		break;
 	case GL_COPY_READ_BUFFER:
-		if(clientVersion >= 3)
-		{
-			*buffer = getCopyReadBuffer();
-			break;
-		}
-		else return false;
+		*buffer = getCopyReadBuffer();
+		break;
 	case GL_COPY_WRITE_BUFFER:
-		if(clientVersion >= 3)
-		{
-			*buffer = getCopyWriteBuffer();
-			break;
-		}
-		else return false;
+		*buffer = getCopyWriteBuffer();
+		break;
 	case GL_PIXEL_PACK_BUFFER:
-		if(clientVersion >= 3)
-		{
-			*buffer = getPixelPackBuffer();
-			break;
-		}
-		else return false;
+		*buffer = getPixelPackBuffer();
+		break;
 	case GL_PIXEL_UNPACK_BUFFER:
-		if(clientVersion >= 3)
-		{
-			*buffer = getPixelUnpackBuffer();
-			break;
-		}
-		else return false;
+		*buffer = getPixelUnpackBuffer();
+		break;
 	case GL_TRANSFORM_FEEDBACK_BUFFER:
-		if(clientVersion >= 3)
 		{
 			TransformFeedback* transformFeedback = getTransformFeedback();
 			*buffer = transformFeedback ? static_cast<es2::Buffer*>(transformFeedback->getGenericBuffer()) : nullptr;
-			break;
 		}
-		else return false;
+		break;
 	case GL_UNIFORM_BUFFER:
-		if(clientVersion >= 3)
-		{
-			*buffer = getGenericUniformBuffer();
-			break;
-		}
-		else return false;
+		*buffer = getGenericUniformBuffer();
+		break;
 	default:
 		return false;
 	}
@@ -2195,214 +2173,205 @@
 	case GL_MAX_COLOR_ATTACHMENTS: // Note: MAX_COLOR_ATTACHMENTS_EXT added by GL_EXT_draw_buffers
 		*params = MAX_COLOR_ATTACHMENTS;
 		return true;
-	default:
-		break;
-	}
-
-	if(clientVersion >= 3)
-	{
-		switch(pname)
+	case GL_TEXTURE_BINDING_2D_ARRAY:
+		if(mState.activeSampler > MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1)
 		{
-		case GL_TEXTURE_BINDING_2D_ARRAY:
-			if(mState.activeSampler > MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1)
+			error(GL_INVALID_OPERATION);
+			return false;
+		}
+
+		*params = mState.samplerTexture[TEXTURE_2D_ARRAY][mState.activeSampler].name();
+		return true;
+	case GL_COPY_READ_BUFFER_BINDING:
+		*params = mState.copyReadBuffer.name();
+		return true;
+	case GL_COPY_WRITE_BUFFER_BINDING:
+		*params = mState.copyWriteBuffer.name();
+		return true;
+	case GL_MAJOR_VERSION:
+		*params = 3;
+		return true;
+	case GL_MINOR_VERSION:
+		*params = 0;
+		return true;
+	case GL_MAX_3D_TEXTURE_SIZE:
+		*params = IMPLEMENTATION_MAX_3D_TEXTURE_SIZE;
+		return true;
+	case GL_MAX_ARRAY_TEXTURE_LAYERS:
+		*params = IMPLEMENTATION_MAX_TEXTURE_SIZE;
+		return true;
+	case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
+		*params = MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS;
+		return true;
+	case GL_MAX_COMBINED_UNIFORM_BLOCKS:
+		*params = MAX_VERTEX_UNIFORM_BLOCKS + MAX_FRAGMENT_UNIFORM_BLOCKS;
+		return true;
+	case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
+		*params = MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS;
+		return true;
+	case GL_MAX_ELEMENT_INDEX:
+		*params = MAX_ELEMENT_INDEX;
+		return true;
+	case GL_MAX_ELEMENTS_INDICES:
+		*params = MAX_ELEMENTS_INDICES;
+		return true;
+	case GL_MAX_ELEMENTS_VERTICES:
+		*params = MAX_ELEMENTS_VERTICES;
+		return true;
+	case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
+		*params = MAX_FRAGMENT_INPUT_VECTORS * 4;
+		return true;
+	case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
+		*params = MAX_FRAGMENT_UNIFORM_BLOCKS;
+		return true;
+	case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
+		*params = MAX_FRAGMENT_UNIFORM_COMPONENTS;
+		return true;
+	case GL_MAX_PROGRAM_TEXEL_OFFSET:
+		// Note: SwiftShader has no actual texel offset limit, so this limit can be modified if required.
+		// In any case, any behavior outside the specified range is valid since the spec mentions:
+		// (see OpenGL ES 3.0.5, 3.8.10.1 Scale Factor and Level of Detail, p.153)
+		// "If any of the offset values are outside the range of the  implementation-defined values
+		//  MIN_PROGRAM_TEXEL_OFFSET and MAX_PROGRAM_TEXEL_OFFSET, results of the texture lookup are
+		//  undefined."
+		*params = MAX_PROGRAM_TEXEL_OFFSET;
+		return true;
+	case GL_MAX_SERVER_WAIT_TIMEOUT:
+		*params = 0;
+		return true;
+	case GL_MAX_TEXTURE_LOD_BIAS:
+		*params = MAX_TEXTURE_LOD_BIAS;
+		return true;
+	case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
+		*params = sw::MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS;
+		return true;
+	case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
+		*params = MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS;
+		return true;
+	case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
+		*params = sw::MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS;
+		return true;
+	case GL_MAX_UNIFORM_BLOCK_SIZE:
+		*params = MAX_UNIFORM_BLOCK_SIZE;
+		return true;
+	case GL_MAX_UNIFORM_BUFFER_BINDINGS:
+		*params = MAX_UNIFORM_BUFFER_BINDINGS;
+		return true;
+	case GL_MAX_VARYING_COMPONENTS:
+		*params = MAX_VARYING_VECTORS * 4;
+		return true;
+	case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
+		*params = MAX_VERTEX_OUTPUT_VECTORS * 4;
+		return true;
+	case GL_MAX_VERTEX_UNIFORM_BLOCKS:
+		*params = MAX_VERTEX_UNIFORM_BLOCKS;
+		return true;
+	case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
+		*params = MAX_VERTEX_UNIFORM_COMPONENTS;
+		return true;
+	case GL_MIN_PROGRAM_TEXEL_OFFSET:
+		// Note: SwiftShader has no actual texel offset limit, so this limit can be modified if required.
+		// In any case, any behavior outside the specified range is valid since the spec mentions:
+		// (see OpenGL ES 3.0.5, 3.8.10.1 Scale Factor and Level of Detail, p.153)
+		// "If any of the offset values are outside the range of the  implementation-defined values
+		//  MIN_PROGRAM_TEXEL_OFFSET and MAX_PROGRAM_TEXEL_OFFSET, results of the texture lookup are
+		//  undefined."
+		*params = MIN_PROGRAM_TEXEL_OFFSET;
+		return true;
+	case GL_NUM_EXTENSIONS:
+		GLuint numExtensions;
+		getExtensions(0, &numExtensions);
+		*params = numExtensions;
+		return true;
+	case GL_NUM_PROGRAM_BINARY_FORMATS:
+		*params = NUM_PROGRAM_BINARY_FORMATS;
+		return true;
+	case GL_PACK_ROW_LENGTH:
+		*params = mState.packParameters.rowLength;
+		return true;
+	case GL_PACK_SKIP_PIXELS:
+		*params = mState.packParameters.skipPixels;
+		return true;
+	case GL_PACK_SKIP_ROWS:
+		*params = mState.packParameters.skipRows;
+		return true;
+	case GL_PIXEL_PACK_BUFFER_BINDING:
+		*params = mState.pixelPackBuffer.name();
+		return true;
+	case GL_PIXEL_UNPACK_BUFFER_BINDING:
+		*params = mState.pixelUnpackBuffer.name();
+		return true;
+	case GL_PROGRAM_BINARY_FORMATS:
+		// Since NUM_PROGRAM_BINARY_FORMATS is 0, the input
+		// should be a 0 sized array, so don't write to params
+		return true;
+	case GL_READ_BUFFER:
+		{
+			Framebuffer* framebuffer = getReadFramebuffer();
+			*params = framebuffer ? framebuffer->getReadBuffer() : GL_NONE;
+		}
+		return true;
+	case GL_SAMPLER_BINDING:
+		*params = mState.sampler[mState.activeSampler].name();
+		return true;
+	case GL_UNIFORM_BUFFER_BINDING:
+		*params = mState.genericUniformBuffer.name();
+		return true;
+	case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
+		*params = UNIFORM_BUFFER_OFFSET_ALIGNMENT;
+		return true;
+	case GL_UNIFORM_BUFFER_SIZE:
+		*params = static_cast<T>(mState.genericUniformBuffer->size());
+		return true;
+	case GL_UNIFORM_BUFFER_START:
+		*params = static_cast<T>(mState.genericUniformBuffer->offset());
+		return true;
+	case GL_UNPACK_IMAGE_HEIGHT:
+		*params = mState.unpackParameters.imageHeight;
+		return true;
+	case GL_UNPACK_ROW_LENGTH:
+		*params = mState.unpackParameters.rowLength;
+		return true;
+	case GL_UNPACK_SKIP_IMAGES:
+		*params = mState.unpackParameters.skipImages;
+		return true;
+	case GL_UNPACK_SKIP_PIXELS:
+		*params = mState.unpackParameters.skipPixels;
+		return true;
+	case GL_UNPACK_SKIP_ROWS:
+		*params = mState.unpackParameters.skipRows;
+		return true;
+	case GL_VERTEX_ARRAY_BINDING:
+		*params = getCurrentVertexArray()->name;
+		return true;
+	case GL_TRANSFORM_FEEDBACK_BINDING:
+		{
+			TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback);
+			if(transformFeedback)
 			{
-				error(GL_INVALID_OPERATION);
+				*params = transformFeedback->name;
+			}
+			else
+			{
 				return false;
 			}
-
-			*params = mState.samplerTexture[TEXTURE_2D_ARRAY][mState.activeSampler].name();
-			return true;
-		case GL_COPY_READ_BUFFER_BINDING:
-			*params = mState.copyReadBuffer.name();
-			return true;
-		case GL_COPY_WRITE_BUFFER_BINDING:
-			*params = mState.copyWriteBuffer.name();
-			return true;
-		case GL_MAJOR_VERSION:
-			*params = clientVersion;
-			return true;
-		case GL_MAX_3D_TEXTURE_SIZE:
-			*params = IMPLEMENTATION_MAX_3D_TEXTURE_SIZE;
-			return true;
-		case GL_MAX_ARRAY_TEXTURE_LAYERS:
-			*params = IMPLEMENTATION_MAX_TEXTURE_SIZE;
-			return true;
-		case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
-			*params = MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS;
-			return true;
-		case GL_MAX_COMBINED_UNIFORM_BLOCKS:
-			*params = MAX_VERTEX_UNIFORM_BLOCKS + MAX_FRAGMENT_UNIFORM_BLOCKS;
-			return true;
-		case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
-			*params = MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS;
-			return true;
-		case GL_MAX_ELEMENT_INDEX:
-			*params = MAX_ELEMENT_INDEX;
-			return true;
-		case GL_MAX_ELEMENTS_INDICES:
-			*params = MAX_ELEMENTS_INDICES;
-			return true;
-		case GL_MAX_ELEMENTS_VERTICES:
-			*params = MAX_ELEMENTS_VERTICES;
-			return true;
-		case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
-			*params = MAX_FRAGMENT_INPUT_VECTORS * 4;
-			return true;
-		case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
-			*params = MAX_FRAGMENT_UNIFORM_BLOCKS;
-			return true;
-		case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
-			*params = MAX_FRAGMENT_UNIFORM_COMPONENTS;
-			return true;
-		case GL_MAX_PROGRAM_TEXEL_OFFSET:
-			// Note: SwiftShader has no actual texel offset limit, so this limit can be modified if required.
-			// In any case, any behavior outside the specified range is valid since the spec mentions:
-			// (see OpenGL ES 3.0.5, 3.8.10.1 Scale Factor and Level of Detail, p.153)
-			// "If any of the offset values are outside the range of the  implementation-defined values
-			//  MIN_PROGRAM_TEXEL_OFFSET and MAX_PROGRAM_TEXEL_OFFSET, results of the texture lookup are
-			//  undefined."
-			*params = MAX_PROGRAM_TEXEL_OFFSET;
-			return true;
-		case GL_MAX_SERVER_WAIT_TIMEOUT:
-			*params = 0;
-			return true;
-		case GL_MAX_TEXTURE_LOD_BIAS:
-			*params = MAX_TEXTURE_LOD_BIAS;
-			return true;
-		case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
-			*params = sw::MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS;
-			return true;
-		case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
-			*params = MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS;
-			return true;
-		case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
-			*params = sw::MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS;
-			return true;
-		case GL_MAX_UNIFORM_BLOCK_SIZE:
-			*params = MAX_UNIFORM_BLOCK_SIZE;
-			return true;
-		case GL_MAX_UNIFORM_BUFFER_BINDINGS:
-			*params = MAX_UNIFORM_BUFFER_BINDINGS;
-			return true;
-		case GL_MAX_VARYING_COMPONENTS:
-			*params = MAX_VARYING_VECTORS * 4;
-			return true;
-		case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
-			*params = MAX_VERTEX_OUTPUT_VECTORS * 4;
-			return true;
-		case GL_MAX_VERTEX_UNIFORM_BLOCKS:
-			*params = MAX_VERTEX_UNIFORM_BLOCKS;
-			return true;
-		case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
-			*params = MAX_VERTEX_UNIFORM_COMPONENTS;
-			return true;
-		case GL_MIN_PROGRAM_TEXEL_OFFSET:
-			// Note: SwiftShader has no actual texel offset limit, so this limit can be modified if required.
-			// In any case, any behavior outside the specified range is valid since the spec mentions:
-			// (see OpenGL ES 3.0.5, 3.8.10.1 Scale Factor and Level of Detail, p.153)
-			// "If any of the offset values are outside the range of the  implementation-defined values
-			//  MIN_PROGRAM_TEXEL_OFFSET and MAX_PROGRAM_TEXEL_OFFSET, results of the texture lookup are
-			//  undefined."
-			*params = MIN_PROGRAM_TEXEL_OFFSET;
-			return true;
-		case GL_MINOR_VERSION:
-			*params = 0;
-			return true;
-		case GL_NUM_EXTENSIONS:
-			GLuint numExtensions;
-			getExtensions(0, &numExtensions);
-			*params = numExtensions;
-			return true;
-		case GL_NUM_PROGRAM_BINARY_FORMATS:
-			*params = NUM_PROGRAM_BINARY_FORMATS;
-			return true;
-		case GL_PACK_ROW_LENGTH:
-			*params = mState.packParameters.rowLength;
-			return true;
-		case GL_PACK_SKIP_PIXELS:
-			*params = mState.packParameters.skipPixels;
-			return true;
-		case GL_PACK_SKIP_ROWS:
-			*params = mState.packParameters.skipRows;
-			return true;
-		case GL_PIXEL_PACK_BUFFER_BINDING:
-			*params = mState.pixelPackBuffer.name();
-			return true;
-		case GL_PIXEL_UNPACK_BUFFER_BINDING:
-			*params = mState.pixelUnpackBuffer.name();
-			return true;
-		case GL_PROGRAM_BINARY_FORMATS:
-			// Since NUM_PROGRAM_BINARY_FORMATS is 0, the input
-			// should be a 0 sized array, so don't write to params
-			return true;
-		case GL_READ_BUFFER:
-			{
-				Framebuffer* framebuffer = getReadFramebuffer();
-				*params = framebuffer ? framebuffer->getReadBuffer() : GL_NONE;
-			}
-			return true;
-		case GL_SAMPLER_BINDING:
-			*params = mState.sampler[mState.activeSampler].name();
-			return true;
-		case GL_UNIFORM_BUFFER_BINDING:
-			*params = mState.genericUniformBuffer.name();
-			return true;
-		case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
-			*params = UNIFORM_BUFFER_OFFSET_ALIGNMENT;
-			return true;
-		case GL_UNIFORM_BUFFER_SIZE:
-			*params = static_cast<T>(mState.genericUniformBuffer->size());
-			return true;
-		case GL_UNIFORM_BUFFER_START:
-			*params = static_cast<T>(mState.genericUniformBuffer->offset());
-			return true;
-		case GL_UNPACK_IMAGE_HEIGHT:
-			*params = mState.unpackParameters.imageHeight;
-			return true;
-		case GL_UNPACK_ROW_LENGTH:
-			*params = mState.unpackParameters.rowLength;
-			return true;
-		case GL_UNPACK_SKIP_IMAGES:
-			*params = mState.unpackParameters.skipImages;
-			return true;
-		case GL_UNPACK_SKIP_PIXELS:
-			*params = mState.unpackParameters.skipPixels;
-			return true;
-		case GL_UNPACK_SKIP_ROWS:
-			*params = mState.unpackParameters.skipRows;
-			return true;
-		case GL_VERTEX_ARRAY_BINDING:
-			*params = getCurrentVertexArray()->name;
-			return true;
-		case GL_TRANSFORM_FEEDBACK_BINDING:
-			{
-				TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback);
-				if(transformFeedback)
-				{
-					*params = transformFeedback->name;
-				}
-				else
-				{
-					return false;
-				}
-			}
-			return true;
-		case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
-			{
-				TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback);
-				if(transformFeedback)
-				{
-					*params = transformFeedback->getGenericBufferName();
-				}
-				else
-				{
-					return false;
-				}
-			}
-			return true;
-		default:
-			break;
 		}
+		return true;
+	case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
+		{
+			TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback);
+			if(transformFeedback)
+			{
+				*params = transformFeedback->getGenericBufferName();
+			}
+			else
+			{
+				return false;
+			}
+		}
+		return true;
+	default:
+		break;
 	}
 
 	return false;
@@ -3335,7 +3304,7 @@
 		return error(GL_INVALID_OPERATION);
 	}
 
-	if(!IsValidReadPixelsFormatType(framebuffer, format, type, clientVersion))
+	if(!IsValidReadPixelsFormatType(framebuffer, format, type))
 	{
 		return error(GL_INVALID_OPERATION);
 	}
@@ -4429,7 +4398,7 @@
 	// OES extensions
 	// EXT extensions
 	// Vendor extensions
-	static const char *es2extensions[] =
+	static const char *extensions[] =
 	{
 		"GL_OES_compressed_ETC1_RGB8_texture",
 		"GL_OES_depth24",
@@ -4454,6 +4423,7 @@
 		"GL_OES_vertex_array_object",
 		"GL_OES_vertex_half_float",
 		"GL_EXT_blend_minmax",
+		"GL_EXT_color_buffer_float",   // OpenGL ES 3.0 specific.
 		"GL_EXT_color_buffer_half_float",
 		"GL_EXT_draw_buffers",
 		"GL_EXT_instanced_arrays",
@@ -4481,19 +4451,7 @@
 		"GL_NV_read_depth",
 	};
 
-	// Extensions exclusive to OpenGL ES 3.0 and above.
-	static const char *es3extensions[] =
-	{
-		"GL_EXT_color_buffer_float",
-	};
-
-	GLuint numES2extensions = sizeof(es2extensions) / sizeof(es2extensions[0]);
-	GLuint numExtensions = numES2extensions;
-
-	if(clientVersion >= 3)
-	{
-		numExtensions += sizeof(es3extensions) / sizeof(es3extensions[0]);
-	}
+	GLuint numExtensions = sizeof(extensions) / sizeof(extensions[0]);
 
 	if(numExt)
 	{
@@ -4508,18 +4466,10 @@
 
 		if(extensionsCat.empty() && (numExtensions > 0))
 		{
-			for(const char *extension : es2extensions)
+			for(const char *extension : extensions)
 			{
 				extensionsCat += std::string(extension) + " ";
 			}
-
-			if(clientVersion >= 3)
-			{
-				for(const char *extension : es3extensions)
-				{
-					extensionsCat += std::string(extension) + " ";
-				}
-			}
 		}
 
 		return (const GLubyte*)extensionsCat.c_str();
@@ -4530,20 +4480,12 @@
 		return nullptr;
 	}
 
-	if(index < numES2extensions)
-	{
-		return (const GLubyte*)es2extensions[index];
-	}
-	else
-	{
-		return (const GLubyte*)es3extensions[index - numES2extensions];
-	}
+	return (const GLubyte*)extensions[index];
 }
 
 }
 
-NO_SANITIZE_FUNCTION egl::Context *es2CreateContext(egl::Display *display, const egl::Context *shareContext, int clientVersion, const egl::Config *config)
+NO_SANITIZE_FUNCTION egl::Context *es2CreateContext(egl::Display *display, const egl::Context *shareContext, const egl::Config *config)
 {
-	ASSERT(!shareContext || shareContext->getClientVersion() == clientVersion);   // Should be checked by eglCreateContext
-	return new es2::Context(display, static_cast<const es2::Context*>(shareContext), clientVersion, config);
+	return new es2::Context(display, static_cast<const es2::Context*>(shareContext), config);
 }
diff --git a/src/OpenGL/libGLESv2/Context.h b/src/OpenGL/libGLESv2/Context.h
index 458fa04..743ec73 100644
--- a/src/OpenGL/libGLESv2/Context.h
+++ b/src/OpenGL/libGLESv2/Context.h
@@ -430,7 +430,7 @@
 class [[clang::lto_visibility_public]] Context : public egl::Context
 {
 public:
-	Context(egl::Display *display, const Context *shareContext, EGLint clientVersion, const egl::Config *config);
+	Context(egl::Display *display, const Context *shareContext, const egl::Config *config);
 
 	void makeCurrent(gl::Surface *surface) override;
 	EGLint getClientVersion() const override;
@@ -725,7 +725,6 @@
 
 	Query *createQuery(GLuint handle, GLenum type);
 
-	const EGLint clientVersion;
 	const egl::Config *const config;
 
 	State mState;
diff --git a/src/OpenGL/libGLESv2/Framebuffer.cpp b/src/OpenGL/libGLESv2/Framebuffer.cpp
index eaa7615..f466de4 100644
--- a/src/OpenGL/libGLESv2/Framebuffer.cpp
+++ b/src/OpenGL/libGLESv2/Framebuffer.cpp
@@ -329,8 +329,6 @@
 	height = -1;
 	samples = -1;
 
-	GLint version = egl::getClientVersion();
-
 	for(int i = 0; i < MAX_COLOR_ATTACHMENTS; i++)
 	{
 		if(mColorbufferType[i] != GL_NONE)
@@ -349,7 +347,7 @@
 
 			if(IsRenderbuffer(mColorbufferType[i]))
 			{
-				if(!IsColorRenderable(colorbuffer->getFormat(), version))
+				if(!IsColorRenderable(colorbuffer->getFormat()))
 				{
 					return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
 				}
@@ -358,7 +356,7 @@
 			{
 				GLenum format = colorbuffer->getFormat();
 
-				if(!IsColorRenderable(format, version))
+				if(!IsColorRenderable(format))
 				{
 					return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
 				}
@@ -382,11 +380,6 @@
 			}
 			else
 			{
-				if(version < 3 && (width != colorbuffer->getWidth() || height != colorbuffer->getHeight()))
-				{
-					return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
-				}
-
 				if(samples != colorbuffer->getSamples())
 				{
 					return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
@@ -417,7 +410,7 @@
 
 		if(IsRenderbuffer(mDepthbufferType))
 		{
-			if(!es2::IsDepthRenderable(depthbuffer->getFormat(), version))
+			if(!es2::IsDepthRenderable(depthbuffer->getFormat()))
 			{
 				return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
 			}
@@ -443,11 +436,6 @@
 		}
 		else
 		{
-			if(version < 3 && (width != depthbuffer->getWidth() || height != depthbuffer->getHeight()))
-			{
-				return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
-			}
-
 			if(samples != depthbuffer->getSamples())
 			{
 				return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
@@ -474,7 +462,7 @@
 
 		if(IsRenderbuffer(mStencilbufferType))
 		{
-			if(!es2::IsStencilRenderable(stencilbuffer->getFormat(), version))
+			if(!es2::IsStencilRenderable(stencilbuffer->getFormat()))
 			{
 				return GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
 			}
@@ -502,11 +490,6 @@
 		}
 		else
 		{
-			if(version < 3 && (width != stencilbuffer->getWidth() || height != stencilbuffer->getHeight()))
-			{
-				return GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
-			}
-
 			if(samples != stencilbuffer->getSamples())
 			{
 				return GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE;
@@ -517,7 +500,7 @@
 		}
 	}
 
-	if((version >= 3) && depthbuffer && stencilbuffer && (depthbuffer != stencilbuffer))
+	if(depthbuffer && stencilbuffer && (depthbuffer != stencilbuffer))
 	{
 		// In the GLES 3.0 spec, section 4.4.4, Framebuffer Completeness:
 		// "The framebuffer object target is said to be framebuffer complete if all the following conditions are true:
@@ -716,7 +699,7 @@
 
 DefaultFramebuffer::DefaultFramebuffer(Colorbuffer *colorbuffer, DepthStencilbuffer *depthStencil)
 {
-	GLenum defaultRenderbufferType = egl::getClientVersion() < 3 ? GL_RENDERBUFFER : GL_FRAMEBUFFER_DEFAULT;
+	GLenum defaultRenderbufferType = GL_FRAMEBUFFER_DEFAULT;
 	mColorbufferPointer[0] = new Renderbuffer(0, colorbuffer);
 	mColorbufferType[0] = defaultRenderbufferType;
 
@@ -732,8 +715,8 @@
 	mDepthbufferPointer = depthStencilRenderbuffer;
 	mStencilbufferPointer = depthStencilRenderbuffer;
 
-	mDepthbufferType = (depthStencilRenderbuffer->getDepthSize() != 0) ? defaultRenderbufferType : GL_NONE;
-	mStencilbufferType = (depthStencilRenderbuffer->getStencilSize() != 0) ? defaultRenderbufferType : GL_NONE;
+	mDepthbufferType = (depthStencilRenderbuffer->getDepthSize() != 0) ? GL_FRAMEBUFFER_DEFAULT : GL_NONE;
+	mStencilbufferType = (depthStencilRenderbuffer->getStencilSize() != 0) ? GL_FRAMEBUFFER_DEFAULT : GL_NONE;
 }
 
 }
diff --git a/src/OpenGL/libGLESv2/Shader.cpp b/src/OpenGL/libGLESv2/Shader.cpp
index cbbb523..355e6cc 100644
--- a/src/OpenGL/libGLESv2/Shader.cpp
+++ b/src/OpenGL/libGLESv2/Shader.cpp
@@ -232,14 +232,6 @@
 	}
 
 	shaderVersion = compiler->getShaderVersion();
-	int clientVersion = es2::getContext()->getClientVersion();
-
-	if(shaderVersion >= 300 && clientVersion < 3)
-	{
-		infoLog = "GLSL ES 3.00 is not supported by OpenGL ES 2.0 contexts";
-		success = false;
-	}
-
 	infoLog += compiler->getInfoSink().info.c_str();
 
 	if(!success)
diff --git a/src/OpenGL/libGLESv2/Texture.cpp b/src/OpenGL/libGLESv2/Texture.cpp
index a218cd3..dae52ee 100644
--- a/src/OpenGL/libGLESv2/Texture.cpp
+++ b/src/OpenGL/libGLESv2/Texture.cpp
@@ -772,7 +772,7 @@
 
 bool Texture2D::isCompressed(GLenum target, GLint level) const
 {
-	return IsCompressed(getFormat(target, level), egl::getClientVersion());
+	return IsCompressed(getFormat(target, level));
 }
 
 bool Texture2D::isDepth(GLenum target, GLint level) const
@@ -1057,8 +1057,7 @@
 		image[face][level]->release();
 	}
 
-	int border = (egl::getClientVersion() >= 3) ? 1 : 0;
-	image[face][level] = egl::Image::create(this, width, height, 1, border, format);
+	image[face][level] = egl::Image::create(this, width, height, 1, 1, format);
 
 	if(!image[face][level])
 	{
@@ -1242,7 +1241,7 @@
 
 bool TextureCubeMap::isCompressed(GLenum target, GLint level) const
 {
-	return IsCompressed(getFormat(target, level), egl::getClientVersion());
+	return IsCompressed(getFormat(target, level));
 }
 
 bool TextureCubeMap::isDepth(GLenum target, GLint level) const
@@ -1264,8 +1263,7 @@
 		image[face][level]->release();
 	}
 
-	int border = (egl::getClientVersion() >= 3) ? 1 : 0;
-	image[face][level] = egl::Image::create(this, width, height, 1, border, internalformat);
+	image[face][level] = egl::Image::create(this, width, height, 1, 1, internalformat);
 
 	if(!image[face][level])
 	{
@@ -1284,8 +1282,7 @@
 		image[face][level]->release();
 	}
 
-	int border = (egl::getClientVersion() >= 3) ? 1 : 0;
-	image[face][level] = egl::Image::create(this, width, height, 1, border, internalformat);
+	image[face][level] = egl::Image::create(this, width, height, 1, 1, internalformat);
 
 	if(!image[face][level])
 	{
@@ -1377,8 +1374,7 @@
 				image[f][i]->release();
 			}
 
-			int border = (egl::getClientVersion() >= 3) ? 1 : 0;
-			image[f][i] = egl::Image::create(this, std::max(image[f][mBaseLevel]->getWidth() >> i, 1), std::max(image[f][mBaseLevel]->getHeight() >> i, 1), 1, border, image[f][mBaseLevel]->getFormat());
+			image[f][i] = egl::Image::create(this, std::max(image[f][mBaseLevel]->getWidth() >> i, 1), std::max(image[f][mBaseLevel]->getHeight() >> i, 1), 1, 1, image[f][mBaseLevel]->getFormat());
 
 			if(!image[f][i])
 			{
@@ -1782,7 +1778,7 @@
 
 bool Texture3D::isCompressed(GLenum target, GLint level) const
 {
-	return IsCompressed(getFormat(target, level), egl::getClientVersion());
+	return IsCompressed(getFormat(target, level));
 }
 
 bool Texture3D::isDepth(GLenum target, GLint level) const
diff --git a/src/OpenGL/libGLESv2/entry_points.cpp b/src/OpenGL/libGLESv2/entry_points.cpp
index 378f9fe..fa52a8b 100644
--- a/src/OpenGL/libGLESv2/entry_points.cpp
+++ b/src/OpenGL/libGLESv2/entry_points.cpp
@@ -1208,7 +1208,7 @@
 }
 }
 
-egl::Context *es2CreateContext(egl::Display *display, const egl::Context *shareContext, int clientVersion, const egl::Config *config);
+egl::Context *es2CreateContext(egl::Display *display, const egl::Context *shareContext, const egl::Config *config);
 extern "C" __eglMustCastToProperFunctionPointerType es2GetProcAddress(const char *procname);
 egl::Image *createBackBuffer(int width, int height, sw::Format format, int multiSampleDepth);
 egl::Image *createBackBufferFromClientBuffer(const egl::ClientBuffer& clientBuffer);
diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp
index e48d1fd..b6d4718 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -183,8 +183,6 @@
 
 	if(context)
 	{
-		GLint clientVersion = egl::getClientVersion();
-
 		switch(target)
 		{
 		case GL_ARRAY_BUFFER:
@@ -194,47 +192,23 @@
 			context->bindElementArrayBuffer(buffer);
 			return;
 		case GL_COPY_READ_BUFFER:
-			if(clientVersion >= 3)
-			{
-				context->bindCopyReadBuffer(buffer);
-				return;
-			}
-			else return error(GL_INVALID_ENUM);
+			context->bindCopyReadBuffer(buffer);
+			return;
 		case GL_COPY_WRITE_BUFFER:
-			if(clientVersion >= 3)
-			{
-				context->bindCopyWriteBuffer(buffer);
-				return;
-			}
-			else return error(GL_INVALID_ENUM);
+			context->bindCopyWriteBuffer(buffer);
+			return;
 		case GL_PIXEL_PACK_BUFFER:
-			if(clientVersion >= 3)
-			{
-				context->bindPixelPackBuffer(buffer);
-				return;
-			}
-			else return error(GL_INVALID_ENUM);
+			context->bindPixelPackBuffer(buffer);
+			return;
 		case GL_PIXEL_UNPACK_BUFFER:
-			if(clientVersion >= 3)
-			{
-				context->bindPixelUnpackBuffer(buffer);
-				return;
-			}
-			else return error(GL_INVALID_ENUM);
+			context->bindPixelUnpackBuffer(buffer);
+			return;
 		case GL_TRANSFORM_FEEDBACK_BUFFER:
-			if(clientVersion >= 3)
-			{
-				context->bindTransformFeedbackBuffer(buffer);
-				return;
-			}
-			else return error(GL_INVALID_ENUM);
+			context->bindTransformFeedbackBuffer(buffer);
+			return;
 		case GL_UNIFORM_BUFFER:
-			if(clientVersion >= 3)
-			{
-				context->bindGenericUniformBuffer(buffer);
-				return;
-			}
-			else return error(GL_INVALID_ENUM);
+			context->bindGenericUniformBuffer(buffer);
+			return;
 		default:
 			return error(GL_INVALID_ENUM);
 		}
@@ -302,8 +276,6 @@
 			return error(GL_INVALID_OPERATION);
 		}
 
-		GLint clientVersion = context->getClientVersion();
-
 		switch(target)
 		{
 		case GL_TEXTURE_2D:
@@ -316,10 +288,6 @@
 			context->bindTexture(TEXTURE_EXTERNAL, texture);
 			break;
 		case GL_TEXTURE_2D_ARRAY:
-			if(clientVersion < 3)
-			{
-				return error(GL_INVALID_ENUM);
-			}
 			context->bindTexture(TEXTURE_2D_ARRAY, texture);
 			break;
 		case GL_TEXTURE_3D:
@@ -398,8 +366,6 @@
 	TRACE("(GLenum srcRGB = 0x%X, GLenum dstRGB = 0x%X, GLenum srcAlpha = 0x%X, GLenum dstAlpha = 0x%X)",
 	      srcRGB, dstRGB, srcAlpha, dstAlpha);
 
-	GLint clientVersion = egl::getClientVersion();
-
 	switch(srcRGB)
 	{
 	case GL_ZERO:
@@ -440,10 +406,6 @@
 	case GL_ONE_MINUS_CONSTANT_ALPHA:
 		break;
 	case GL_SRC_ALPHA_SATURATE:
-		if(clientVersion < 3)
-		{
-			return error(GL_INVALID_ENUM);
-		}
 		break;
 	default:
 		return error(GL_INVALID_ENUM);
@@ -489,10 +451,6 @@
 	case GL_ONE_MINUS_CONSTANT_ALPHA:
 		break;
 	case GL_SRC_ALPHA_SATURATE:
-		if(clientVersion < 3)
-		{
-			return error(GL_INVALID_ENUM);
-		}
 		break;
 	default:
 		return error(GL_INVALID_ENUM);
@@ -518,8 +476,6 @@
 		return error(GL_INVALID_VALUE);
 	}
 
-	GLint clientVersion = egl::getClientVersion();
-
 	switch(usage)
 	{
 	case GL_STREAM_DRAW:
@@ -532,10 +488,6 @@
 	case GL_STATIC_COPY:
 	case GL_DYNAMIC_READ:
 	case GL_DYNAMIC_COPY:
-		if(clientVersion < 3)
-		{
-			return error(GL_INVALID_ENUM);
-		}
 		break;
 	default:
 		return error(GL_INVALID_ENUM);
@@ -744,7 +696,7 @@
 		return error(GL_INVALID_VALUE);
 	}
 
-	if(!IsCompressed(internalformat, egl::getClientVersion()))
+	if(!IsCompressed(internalformat))
 	{
 		return error(GL_INVALID_ENUM);
 	}
@@ -879,7 +831,7 @@
 		{
 			es2::Texture2D *texture = context->getTexture2D(target);
 
-			GLenum validationError = ValidateSubImageParams(true, false, target, level, xoffset, yoffset, width, height, format, GL_NONE, texture, context->getClientVersion());
+			GLenum validationError = ValidateSubImageParams(true, false, target, level, xoffset, yoffset, width, height, format, GL_NONE, texture);
 			if(validationError != GL_NO_ERROR)
 			{
 				return error(validationError);
@@ -891,7 +843,7 @@
 		{
 			es2::TextureCubeMap *texture = context->getTextureCubeMap();
 
-			GLenum validationError = ValidateSubImageParams(true, false, target, level, xoffset, yoffset, width, height, format, GL_NONE, texture, context->getClientVersion());
+			GLenum validationError = ValidateSubImageParams(true, false, target, level, xoffset, yoffset, width, height, format, GL_NONE, texture);
 			if(validationError != GL_NO_ERROR)
 			{
 				return error(validationError);
@@ -1096,7 +1048,7 @@
 		}
 		else UNREACHABLE(target);
 
-		GLenum validationError = ValidateSubImageParams(false, true, target, level, xoffset, yoffset, width, height, GL_NONE, GL_NONE, texture, context->getClientVersion());
+		GLenum validationError = ValidateSubImageParams(false, true, target, level, xoffset, yoffset, width, height, GL_NONE, GL_NONE, texture);
 		if(validationError != GL_NO_ERROR)
 		{
 			return error(validationError);
@@ -1943,48 +1895,8 @@
 			}
 		}
 
-		GLint clientVersion = context->getClientVersion();
-
 		switch(attachment)
 		{
-		case GL_COLOR_ATTACHMENT0:
-		case GL_COLOR_ATTACHMENT1:
-		case GL_COLOR_ATTACHMENT2:
-		case GL_COLOR_ATTACHMENT3:
-		case GL_COLOR_ATTACHMENT4:
-		case GL_COLOR_ATTACHMENT5:
-		case GL_COLOR_ATTACHMENT6:
-		case GL_COLOR_ATTACHMENT7:
-		case GL_COLOR_ATTACHMENT8:
-		case GL_COLOR_ATTACHMENT9:
-		case GL_COLOR_ATTACHMENT10:
-		case GL_COLOR_ATTACHMENT11:
-		case GL_COLOR_ATTACHMENT12:
-		case GL_COLOR_ATTACHMENT13:
-		case GL_COLOR_ATTACHMENT14:
-		case GL_COLOR_ATTACHMENT15:
-		case GL_COLOR_ATTACHMENT16:
-		case GL_COLOR_ATTACHMENT17:
-		case GL_COLOR_ATTACHMENT18:
-		case GL_COLOR_ATTACHMENT19:
-		case GL_COLOR_ATTACHMENT20:
-		case GL_COLOR_ATTACHMENT21:
-		case GL_COLOR_ATTACHMENT22:
-		case GL_COLOR_ATTACHMENT23:
-		case GL_COLOR_ATTACHMENT24:
-		case GL_COLOR_ATTACHMENT25:
-		case GL_COLOR_ATTACHMENT26:
-		case GL_COLOR_ATTACHMENT27:
-		case GL_COLOR_ATTACHMENT28:
-		case GL_COLOR_ATTACHMENT29:
-		case GL_COLOR_ATTACHMENT30:
-		case GL_COLOR_ATTACHMENT31:
-			if((attachment - GL_COLOR_ATTACHMENT0) >= MAX_COLOR_ATTACHMENTS)
-			{
-				return error(GL_INVALID_ENUM);
-			}
-			framebuffer->setColorbuffer(GL_RENDERBUFFER, renderbuffer, attachment - GL_COLOR_ATTACHMENT0);
-			break;
 		case GL_DEPTH_ATTACHMENT:
 			framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
 			break;
@@ -1992,15 +1904,16 @@
 			framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
 			break;
 		case GL_DEPTH_STENCIL_ATTACHMENT:
-			if(clientVersion >= 3)
-			{
-				framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
-				framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
+			framebuffer->setDepthbuffer(GL_RENDERBUFFER, renderbuffer);
+			framebuffer->setStencilbuffer(GL_RENDERBUFFER, renderbuffer);
+			break;
 		default:
-			return error(GL_INVALID_ENUM);
+			if((attachment - GL_COLOR_ATTACHMENT0) >= MAX_COLOR_ATTACHMENTS)
+			{
+				return error(GL_INVALID_ENUM);
+			}
+			framebuffer->setColorbuffer(GL_RENDERBUFFER, renderbuffer, attachment - GL_COLOR_ATTACHMENT0);
+			break;
 		}
 	}
 }
@@ -2019,8 +1932,6 @@
 
 	if(context)
 	{
-		GLint clientVersion = context->getClientVersion();
-
 		if(texture == 0)
 		{
 			textarget = GL_NONE;
@@ -2063,7 +1974,7 @@
 				return error(GL_INVALID_ENUM);
 			}
 
-			if((level != 0) && ((clientVersion < 3) || (textarget == GL_TEXTURE_RECTANGLE_ARB)))
+			if((textarget == GL_TEXTURE_RECTANGLE_ARB) && (level != 0))
 			{
 				return error(GL_INVALID_VALUE);
 			}
@@ -2099,56 +2010,19 @@
 
 		switch(attachment)
 		{
-		case GL_COLOR_ATTACHMENT0:
-		case GL_COLOR_ATTACHMENT1:
-		case GL_COLOR_ATTACHMENT2:
-		case GL_COLOR_ATTACHMENT3:
-		case GL_COLOR_ATTACHMENT4:
-		case GL_COLOR_ATTACHMENT5:
-		case GL_COLOR_ATTACHMENT6:
-		case GL_COLOR_ATTACHMENT7:
-		case GL_COLOR_ATTACHMENT8:
-		case GL_COLOR_ATTACHMENT9:
-		case GL_COLOR_ATTACHMENT10:
-		case GL_COLOR_ATTACHMENT11:
-		case GL_COLOR_ATTACHMENT12:
-		case GL_COLOR_ATTACHMENT13:
-		case GL_COLOR_ATTACHMENT14:
-		case GL_COLOR_ATTACHMENT15:
-		case GL_COLOR_ATTACHMENT16:
-		case GL_COLOR_ATTACHMENT17:
-		case GL_COLOR_ATTACHMENT18:
-		case GL_COLOR_ATTACHMENT19:
-		case GL_COLOR_ATTACHMENT20:
-		case GL_COLOR_ATTACHMENT21:
-		case GL_COLOR_ATTACHMENT22:
-		case GL_COLOR_ATTACHMENT23:
-		case GL_COLOR_ATTACHMENT24:
-		case GL_COLOR_ATTACHMENT25:
-		case GL_COLOR_ATTACHMENT26:
-		case GL_COLOR_ATTACHMENT27:
-		case GL_COLOR_ATTACHMENT28:
-		case GL_COLOR_ATTACHMENT29:
-		case GL_COLOR_ATTACHMENT30:
-		case GL_COLOR_ATTACHMENT31:
+		case GL_DEPTH_ATTACHMENT:   framebuffer->setDepthbuffer(textarget, texture, level);   break;
+		case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level); break;
+		case GL_DEPTH_STENCIL_ATTACHMENT:
+			framebuffer->setDepthbuffer(textarget, texture, level);
+			framebuffer->setStencilbuffer(textarget, texture, level);
+			break;
+		default:
 			if((attachment - GL_COLOR_ATTACHMENT0) >= MAX_COLOR_ATTACHMENTS)
 			{
 				return error(GL_INVALID_ENUM);
 			}
 			framebuffer->setColorbuffer(textarget, texture, attachment - GL_COLOR_ATTACHMENT0, level);
 			break;
-		case GL_DEPTH_ATTACHMENT:   framebuffer->setDepthbuffer(textarget, texture, level);   break;
-		case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture, level); break;
-		case GL_DEPTH_STENCIL_ATTACHMENT:
-			if(clientVersion >= 3)
-			{
-				framebuffer->setDepthbuffer(textarget, texture, level);
-				framebuffer->setStencilbuffer(textarget, texture, level);
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
-		default:
-			return error(GL_INVALID_ENUM);
 		}
 	}
 }
@@ -2205,8 +2079,6 @@
 	{
 		es2::Texture *texture = nullptr;
 
-		GLint clientVersion = context->getClientVersion();
-
 		switch(target)
 		{
 		case GL_TEXTURE_2D:
@@ -2224,14 +2096,7 @@
 			}
 			break;
 		case GL_TEXTURE_2D_ARRAY:
-			if(clientVersion < 3)
-			{
-				return error(GL_INVALID_ENUM);
-			}
-			else
-			{
-				texture = context->getTexture2DArray();
-			}
+			texture = context->getTexture2DArray();
 			break;
 		case GL_TEXTURE_3D:
 			texture = context->getTexture3D();
@@ -2243,7 +2108,7 @@
 			return error(GL_INVALID_ENUM);
 		}
 
-		if(!IsMipmappable(texture->getFormat(target, texture->getBaseLevel()), clientVersion))
+		if(!IsMipmappable(texture->getFormat(target, texture->getBaseLevel())))
 		{
 			return error(GL_INVALID_OPERATION);
 		}
@@ -2570,8 +2435,6 @@
 			return error(GL_INVALID_OPERATION);
 		}
 
-		GLint clientVersion = context->getClientVersion();
-
 		switch(pname)
 		{
 		case GL_BUFFER_USAGE:
@@ -2581,33 +2444,17 @@
 			*params = (GLint)buffer->size();
 			break;
 		case GL_BUFFER_ACCESS_FLAGS:
-			if(clientVersion >= 3)
-			{
-				*params = buffer->access();
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = buffer->access();
+			break;
 		case GL_BUFFER_MAPPED:
-			if(clientVersion >= 3)
-			{
-				*params = buffer->isMapped();
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = buffer->isMapped();
+			break;
 		case GL_BUFFER_MAP_LENGTH:
-			if(clientVersion >= 3)
-			{
-				*params = (GLint)buffer->length();
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = (GLint)buffer->length();
+			break;
 		case GL_BUFFER_MAP_OFFSET:
-			if(clientVersion >= 3)
-			{
-				*params = (GLint)buffer->offset();
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = (GLint)buffer->offset();
+			break;
 		default:
 			return error(GL_INVALID_ENUM);
 		}
@@ -2725,26 +2572,11 @@
 			framebufferName = context->getDrawFramebufferName();
 		}
 
-		GLint clientVersion = context->getClientVersion();
-
-		if(framebufferName == 0)   // Default framebuffer.
-		{
-			if(clientVersion < 3)
-			{
-				return error(GL_INVALID_OPERATION);
-			}
-		}
-
 		switch(attachment)
 		{
 		case GL_BACK:
 		case GL_DEPTH:
 		case GL_STENCIL:
-			if(clientVersion < 3)
-			{
-				return error(GL_INVALID_ENUM);
-			}
-
 			if(framebufferName != 0)
 			{
 				return error(GL_INVALID_OPERATION);
@@ -2758,11 +2590,6 @@
 			}
 			break;
 		case GL_DEPTH_STENCIL_ATTACHMENT:
-			if(clientVersion < 3)
-			{
-				return error(GL_INVALID_ENUM);
-			}
-
 			if(framebufferName == 0)
 			{
 				return error(GL_INVALID_OPERATION);
@@ -2868,7 +2695,7 @@
 			case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL:
 				if(attachmentObjectType == GL_TEXTURE)
 				{
-					*params = clientVersion < 3 ? 0 : renderbuffer->getLevel();   // glFramebufferTexture2D does not allow level to be set to anything else in GL ES 2.0
+					*params = renderbuffer->getLevel();
 				}
 				else
 				{
@@ -2893,53 +2720,25 @@
 				}
 				break;
 			case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
-				if(clientVersion >= 3)
-				{
-					*params = attachmentLayer;
-				}
-				else return error(GL_INVALID_ENUM);
+				*params = attachmentLayer;
 				break;
 			case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
-				if(clientVersion >= 3)
-				{
-					*params = renderbuffer->getRedSize();
-				}
-				else return error(GL_INVALID_ENUM);
+				*params = renderbuffer->getRedSize();
 				break;
 			case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
-				if(clientVersion >= 3)
-				{
-					*params = renderbuffer->getGreenSize();
-				}
-				else return error(GL_INVALID_ENUM);
+				*params = renderbuffer->getGreenSize();
 				break;
 			case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
-				if(clientVersion >= 3)
-				{
-					*params = renderbuffer->getBlueSize();
-				}
-				else return error(GL_INVALID_ENUM);
+				*params = renderbuffer->getBlueSize();
 				break;
 			case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
-				if(clientVersion >= 3)
-				{
-					*params = renderbuffer->getAlphaSize();
-				}
-				else return error(GL_INVALID_ENUM);
+				*params = renderbuffer->getAlphaSize();
 				break;
 			case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
-				if(clientVersion >= 3)
-				{
-					*params = renderbuffer->getDepthSize();
-				}
-				else return error(GL_INVALID_ENUM);
+				*params = renderbuffer->getDepthSize();
 				break;
 			case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
-				if(clientVersion >= 3)
-				{
-					*params = renderbuffer->getStencilSize();
-				}
-				else return error(GL_INVALID_ENUM);
+				*params = renderbuffer->getStencilSize();
 				break;
 			case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
 		//	case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT:   // GL_EXT_color_buffer_half_float
@@ -2951,11 +2750,7 @@
 				*params = GetComponentType(renderbuffer->getFormat(), attachment);
 				break;
 			case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
-				if(clientVersion >= 3)
-				{
-					*params = GetColorEncoding(renderbuffer->getFormat());
-				}
-				else return error(GL_INVALID_ENUM);
+				*params = GetColorEncoding(renderbuffer->getFormat());
 				break;
 			default:
 				return error(GL_INVALID_ENUM);
@@ -2976,21 +2771,10 @@
 				*params = GL_NONE;
 				break;
 			case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
-				if(clientVersion < 3)
-				{
-					return error(GL_INVALID_ENUM);
-				}
 				*params = 0;
 				break;
 			default:
-				if(clientVersion < 3)
-				{
-					return error(GL_INVALID_ENUM);
-				}
-				else
-				{
-					return error(GL_INVALID_OPERATION);
-				}
+				return error(GL_INVALID_OPERATION);
 			}
 		}
 	}
@@ -3107,8 +2891,6 @@
 			}
 		}
 
-		GLint clientVersion = egl::getClientVersion();
-
 		switch(pname)
 		{
 		case GL_DELETE_STATUS:
@@ -3139,54 +2921,26 @@
 			*params = programObject->getActiveUniformMaxLength();
 			return;
 		case GL_ACTIVE_UNIFORM_BLOCKS:
-			if(clientVersion >= 3)
-			{
-				*params = (GLint)programObject->getActiveUniformBlockCount();
-				return;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = (GLint)programObject->getActiveUniformBlockCount();
+			return;
 		case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
-			if(clientVersion >= 3)
-			{
-				*params = programObject->getActiveUniformBlockMaxLength();
-				return;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = programObject->getActiveUniformBlockMaxLength();
+			return;
 		case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
-			if(clientVersion >= 3)
-			{
-				*params = programObject->getTransformFeedbackBufferMode();
-				return;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = programObject->getTransformFeedbackBufferMode();
+			return;
 		case GL_TRANSFORM_FEEDBACK_VARYINGS:
-			if(clientVersion >= 3)
-			{
-				*params = programObject->getTransformFeedbackVaryingCount();
-				return;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = programObject->getTransformFeedbackVaryingCount();
+			return;
 		case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
-			if(clientVersion >= 3)
-			{
-				*params = programObject->getTransformFeedbackVaryingMaxLength();
-				return;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = programObject->getTransformFeedbackVaryingMaxLength();
+			return;
 		case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
-			if(clientVersion >= 3)
-			{
-				*params = programObject->getBinaryRetrievableHint();
-				return;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = programObject->getBinaryRetrievableHint();
+			return;
 		case GL_PROGRAM_BINARY_LENGTH:
-			if(clientVersion >= 3)
-			{
-				*params = programObject->getBinaryLength();
-				return;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = programObject->getBinaryLength();
+			return;
 		default:
 			return error(GL_INVALID_ENUM);
 		}
@@ -3488,19 +3242,9 @@
 	case GL_RENDERER:
 		return (GLubyte*)"Google SwiftShader";
 	case GL_VERSION:
-		{
-			es2::Context *context = es2::getContext();
-			return (context && (context->getClientVersion() >= 3)) ?
-			       (GLubyte*)"OpenGL ES 3.0 SwiftShader " VERSION_STRING :
-			       (GLubyte*)"OpenGL ES 2.0 SwiftShader " VERSION_STRING;
-		}
+		return (GLubyte*)"OpenGL ES 3.0 SwiftShader " VERSION_STRING;
 	case GL_SHADING_LANGUAGE_VERSION:
-		{
-			es2::Context *context = es2::getContext();
-			return (context && (context->getClientVersion() >= 3)) ?
-			       (GLubyte*)"OpenGL ES GLSL ES 3.00 SwiftShader " VERSION_STRING :
-			       (GLubyte*)"OpenGL ES GLSL ES 1.00 SwiftShader " VERSION_STRING;
-		}
+		return (GLubyte*)"OpenGL ES GLSL ES 3.00 SwiftShader " VERSION_STRING;
 	case GL_EXTENSIONS:
 		{
 			es2::Context *context = es2::getContext();
@@ -3521,35 +3265,14 @@
 	{
 		es2::Texture *texture;
 
-		GLint clientVersion = context->getClientVersion();
-
 		switch(target)
 		{
-		case GL_TEXTURE_2D:
-			texture = context->getTexture2D();
-			break;
-		case GL_TEXTURE_CUBE_MAP:
-			texture = context->getTextureCubeMap();
-			break;
-		case GL_TEXTURE_EXTERNAL_OES:
-			texture = context->getTextureExternal();
-			break;
-		case GL_TEXTURE_2D_ARRAY:
-			if(clientVersion < 3)
-			{
-				return error(GL_INVALID_ENUM);
-			}
-			else
-			{
-				texture = context->getTexture2DArray();
-			}
-			break;
-		case GL_TEXTURE_3D:
-			texture = context->getTexture3D();
-			break;
-		case GL_TEXTURE_RECTANGLE_ARB:
-			texture = context->getTexture2DRect();
-			break;
+		case GL_TEXTURE_2D:            texture = context->getTexture2D();       break;
+		case GL_TEXTURE_2D_ARRAY:      texture = context->getTexture2DArray();  break;
+		case GL_TEXTURE_3D:            texture = context->getTexture3D();       break;
+		case GL_TEXTURE_CUBE_MAP:      texture = context->getTextureCubeMap();  break;
+		case GL_TEXTURE_EXTERNAL_OES:  texture = context->getTextureExternal(); break;
+		case GL_TEXTURE_RECTANGLE_ARB: texture = context->getTexture2DRect();   break;
 		default:
 			return error(GL_INVALID_ENUM);
 		}
@@ -3578,89 +3301,41 @@
 			*params = (GLfloat)1;
 			break;
 		case GL_TEXTURE_BASE_LEVEL:
-			if(clientVersion >= 3)
-			{
-				*params = (GLfloat)texture->getBaseLevel();
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = (GLfloat)texture->getBaseLevel();
+			break;
 		case GL_TEXTURE_COMPARE_FUNC:
-			if(clientVersion >= 3)
-			{
-				*params = (GLfloat)texture->getCompareFunc();
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = (GLfloat)texture->getCompareFunc();
+			break;
 		case GL_TEXTURE_COMPARE_MODE:
-			if(clientVersion >= 3)
-			{
-				*params = (GLfloat)texture->getCompareMode();
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = (GLfloat)texture->getCompareMode();
+			break;
 		case GL_TEXTURE_IMMUTABLE_FORMAT:
-			if(clientVersion >= 3)
-			{
-				*params = (GLfloat)texture->getImmutableFormat();
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = (GLfloat)texture->getImmutableFormat();
+			break;
 		case GL_TEXTURE_IMMUTABLE_LEVELS:
-			if(clientVersion >= 3)
-			{
-				*params = (GLfloat)texture->getImmutableLevels();
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = (GLfloat)texture->getImmutableLevels();
+			break;
 		case GL_TEXTURE_MAX_LEVEL:
-			if(clientVersion >= 3)
-			{
-				*params = (GLfloat)texture->getMaxLevel();
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = (GLfloat)texture->getMaxLevel();
+			break;
 		case GL_TEXTURE_MAX_LOD:
-			if(clientVersion >= 3)
-			{
-				*params = texture->getMaxLOD();
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = texture->getMaxLOD();
+			break;
 		case GL_TEXTURE_MIN_LOD:
-			if(clientVersion >= 3)
-			{
-				*params = texture->getMinLOD();
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = texture->getMinLOD();
+			break;
 		case GL_TEXTURE_SWIZZLE_R:
-			if(clientVersion >= 3)
-			{
-				*params = (GLfloat)texture->getSwizzleR();
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = (GLfloat)texture->getSwizzleR();
+			break;
 		case GL_TEXTURE_SWIZZLE_G:
-			if(clientVersion >= 3)
-			{
-				*params = (GLfloat)texture->getSwizzleG();
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = (GLfloat)texture->getSwizzleG();
+			break;
 		case GL_TEXTURE_SWIZZLE_B:
-			if(clientVersion >= 3)
-			{
-				*params = (GLfloat)texture->getSwizzleB();
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = (GLfloat)texture->getSwizzleB();
+			break;
 		case GL_TEXTURE_SWIZZLE_A:
-			if(clientVersion >= 3)
-			{
-				*params = (GLfloat)texture->getSwizzleA();
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = (GLfloat)texture->getSwizzleA();
+			break;
 		default:
 			return error(GL_INVALID_ENUM);
 		}
@@ -3677,35 +3352,14 @@
 	{
 		es2::Texture *texture;
 
-		GLint clientVersion = context->getClientVersion();
-
 		switch(target)
 		{
-		case GL_TEXTURE_2D:
-			texture = context->getTexture2D();
-			break;
-		case GL_TEXTURE_CUBE_MAP:
-			texture = context->getTextureCubeMap();
-			break;
-		case GL_TEXTURE_EXTERNAL_OES:
-			texture = context->getTextureExternal();
-			break;
-		case GL_TEXTURE_2D_ARRAY:
-			if(clientVersion < 3)
-			{
-				return error(GL_INVALID_ENUM);
-			}
-			else
-			{
-				texture = context->getTexture2DArray();
-			}
-			break;
-		case GL_TEXTURE_3D:
-			texture = context->getTexture3D();
-			break;
-		case GL_TEXTURE_RECTANGLE_ARB:
-			texture = context->getTexture2DRect();
-			break;
+		case GL_TEXTURE_2D:            texture = context->getTexture2D();       break;
+		case GL_TEXTURE_2D_ARRAY:      texture = context->getTexture2DArray();  break;
+		case GL_TEXTURE_3D:            texture = context->getTexture3D();       break;
+		case GL_TEXTURE_CUBE_MAP:      texture = context->getTextureCubeMap();  break;
+		case GL_TEXTURE_EXTERNAL_OES:  texture = context->getTextureExternal(); break;
+		case GL_TEXTURE_RECTANGLE_ARB: texture = context->getTexture2DRect();   break;
 		default:
 			return error(GL_INVALID_ENUM);
 		}
@@ -3734,89 +3388,41 @@
 			*params = 1;
 			break;
 		case GL_TEXTURE_BASE_LEVEL:
-			if(clientVersion >= 3)
-			{
-				*params = texture->getBaseLevel();
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = texture->getBaseLevel();
+			break;
 		case GL_TEXTURE_COMPARE_FUNC:
-			if(clientVersion >= 3)
-			{
-				*params = (GLint)texture->getCompareFunc();
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = (GLint)texture->getCompareFunc();
+			break;
 		case GL_TEXTURE_COMPARE_MODE:
-			if(clientVersion >= 3)
-			{
-				*params = (GLint)texture->getCompareMode();
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = (GLint)texture->getCompareMode();
+			break;
 		case GL_TEXTURE_IMMUTABLE_FORMAT:
-			if(clientVersion >= 3)
-			{
-				*params = (GLint)texture->getImmutableFormat();
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = (GLint)texture->getImmutableFormat();
+			break;
 		case GL_TEXTURE_IMMUTABLE_LEVELS:
-			if(clientVersion >= 3)
-			{
-				*params = (GLint)texture->getImmutableLevels();
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = (GLint)texture->getImmutableLevels();
+			break;
 		case GL_TEXTURE_MAX_LEVEL:
-			if(clientVersion >= 3)
-			{
-				*params = texture->getMaxLevel();
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = texture->getMaxLevel();
+			break;
 		case GL_TEXTURE_MAX_LOD:
-			if(clientVersion >= 3)
-			{
-				*params = (GLint)roundf(texture->getMaxLOD());
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = (GLint)roundf(texture->getMaxLOD());
+			break;
 		case GL_TEXTURE_MIN_LOD:
-			if(clientVersion >= 3)
-			{
-				*params = (GLint)roundf(texture->getMinLOD());
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = (GLint)roundf(texture->getMinLOD());
+			break;
 		case GL_TEXTURE_SWIZZLE_R:
-			if(clientVersion >= 3)
-			{
-				*params = (GLint)texture->getSwizzleR();
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = (GLint)texture->getSwizzleR();
+			break;
 		case GL_TEXTURE_SWIZZLE_G:
-			if(clientVersion >= 3)
-			{
-				*params = (GLint)texture->getSwizzleG();
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = (GLint)texture->getSwizzleG();
+			break;
 		case GL_TEXTURE_SWIZZLE_B:
-			if(clientVersion >= 3)
-			{
-				*params = (GLint)texture->getSwizzleB();
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = (GLint)texture->getSwizzleB();
+			break;
 		case GL_TEXTURE_SWIZZLE_A:
-			if(clientVersion >= 3)
-			{
-				*params = (GLint)texture->getSwizzleA();
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
+			*params = (GLint)texture->getSwizzleA();
+			break;
 		default:
 			return error(GL_INVALID_ENUM);
 		}
@@ -4024,8 +3630,6 @@
 
 		const es2::VertexAttribute &attribState = context->getVertexAttribState(index);
 
-		GLint clientVersion = context->getClientVersion();
-
 		switch(pname)
 		{
 		case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
@@ -4056,13 +3660,10 @@
 			}
 			break;
 		case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
-			if(clientVersion >= 3)
-			{
-				*params = (GLfloat)(attribState.mPureInteger ? GL_TRUE : GL_FALSE);
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
-		default: return error(GL_INVALID_ENUM);
+			*params = (GLfloat)(attribState.mPureInteger ? GL_TRUE : GL_FALSE);
+			break;
+		default:
+			return error(GL_INVALID_ENUM);
 		}
 	}
 }
@@ -4082,8 +3683,6 @@
 
 		const es2::VertexAttribute &attribState = context->getVertexAttribState(index);
 
-		GLint clientVersion = context->getClientVersion();
-
 		switch(pname)
 		{
 		case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
@@ -4115,13 +3714,10 @@
 			}
 			break;
 		case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
-			if(clientVersion >= 3)
-			{
-				*params = (attribState.mPureInteger ? GL_TRUE : GL_FALSE);
-				break;
-			}
-			else return error(GL_INVALID_ENUM);
-		default: return error(GL_INVALID_ENUM);
+			*params = (attribState.mPureInteger ? GL_TRUE : GL_FALSE);
+			break;
+		default:
+			return error(GL_INVALID_ENUM);
 		}
 	}
 }
@@ -4210,8 +3806,6 @@
 
 	if(context)
 	{
-		GLint clientVersion = context->getClientVersion();
-
 		switch(cap)
 		{
 		case GL_CULL_FACE:                return context->isCullFaceEnabled();
@@ -4223,18 +3817,8 @@
 		case GL_DEPTH_TEST:               return context->isDepthTestEnabled();
 		case GL_BLEND:                    return context->isBlendEnabled();
 		case GL_DITHER:                   return context->isDitherEnabled();
-		case GL_PRIMITIVE_RESTART_FIXED_INDEX:
-			if(clientVersion >= 3)
-			{
-				return context->isPrimitiveRestartFixedIndexEnabled();
-			}
-			else return error(GL_INVALID_ENUM, false);
-		case GL_RASTERIZER_DISCARD:
-			if(clientVersion >= 3)
-			{
-				return context->isRasterizerDiscardEnabled();
-			}
-			else return error(GL_INVALID_ENUM, false);
+		case GL_PRIMITIVE_RESTART_FIXED_INDEX: return context->isPrimitiveRestartFixedIndexEnabled();
+		case GL_RASTERIZER_DISCARD:       return context->isRasterizerDiscardEnabled();
 		default:
 			return error(GL_INVALID_ENUM, false);
 		}
@@ -4443,8 +4027,6 @@
 
 	if(context)
 	{
-		GLint clientVersion = context->getClientVersion();
-
 		switch(pname)
 		{
 		case GL_UNPACK_ALIGNMENT:
@@ -4462,92 +4044,61 @@
 			context->setPackAlignment(param);
 			break;
 		case GL_PACK_ROW_LENGTH:
-			if(clientVersion >= 3)
+			if(param < 0)
 			{
-				if(param < 0)
-				{
-					return error(GL_INVALID_VALUE);
-				}
-				context->setPackRowLength(param);
-				break;
+				return error(GL_INVALID_VALUE);
 			}
-			else return error(GL_INVALID_ENUM);
+			context->setPackRowLength(param);
+			break;
 		case GL_PACK_SKIP_PIXELS:
-			if(clientVersion >= 3)
+			if(param < 0)
 			{
-				if(param < 0)
-				{
-					return error(GL_INVALID_VALUE);
-				}
-				context->setPackSkipPixels(param);
-				break;
+				return error(GL_INVALID_VALUE);
 			}
-			else return error(GL_INVALID_ENUM);
+			context->setPackSkipPixels(param);
+			break;
 		case GL_PACK_SKIP_ROWS:
-			if(clientVersion >= 3)
+			if(param < 0)
 			{
-				if(param < 0)
-				{
-					return error(GL_INVALID_VALUE);
-				}
-				context->setPackSkipRows(param);
-				break;
+				return error(GL_INVALID_VALUE);
 			}
-			else return error(GL_INVALID_ENUM);
+			context->setPackSkipRows(param);
+			break;
 		case GL_UNPACK_ROW_LENGTH:
-			if(clientVersion >= 3)
+			if(param < 0)
 			{
-				if(param < 0)
-				{
-					return error(GL_INVALID_VALUE);
-				}
-				context->setUnpackRowLength(param);
-				break;
+				return error(GL_INVALID_VALUE);
 			}
-			else return error(GL_INVALID_ENUM);
+			context->setUnpackRowLength(param);
+			break;
 		case GL_UNPACK_IMAGE_HEIGHT:
-			if(clientVersion >= 3)
+			if(param < 0)
 			{
-				if(param < 0)
-				{
-					return error(GL_INVALID_VALUE);
-				}
-				context->setUnpackImageHeight(param);
-				break;
+				return error(GL_INVALID_VALUE);
 			}
-			else return error(GL_INVALID_ENUM);
+			context->setUnpackImageHeight(param);
+			break;
 		case GL_UNPACK_SKIP_PIXELS:
-			if(clientVersion >= 3)
+			if(param < 0)
 			{
-				if(param < 0)
-				{
-					return error(GL_INVALID_VALUE);
-				}
-				context->setUnpackSkipPixels(param);
-				break;
+				return error(GL_INVALID_VALUE);
 			}
-			else return error(GL_INVALID_ENUM);
+			context->setUnpackSkipPixels(param);
+			break;
 		case GL_UNPACK_SKIP_ROWS:
-			if(clientVersion >= 3)
+			if(param < 0)
 			{
-				if(param < 0)
-				{
-					return error(GL_INVALID_VALUE);
-				}
-				context->setUnpackSkipRows(param);
-				break;
+				return error(GL_INVALID_VALUE);
 			}
-			else return error(GL_INVALID_ENUM);
+			context->setUnpackSkipRows(param);
+			break;
 		case GL_UNPACK_SKIP_IMAGES:
-			if(clientVersion >= 3) {
-				if(param < 0)
-				{
-					return error(GL_INVALID_VALUE);
-				}
-				context->setUnpackSkipImages(param);
-				break;
+			if(param < 0)
+			{
+				return error(GL_INVALID_VALUE);
 			}
-			else return error(GL_INVALID_ENUM);
+			context->setUnpackSkipImages(param);
+			break;
 		default:
 			return error(GL_INVALID_ENUM);
 		}
@@ -4648,21 +4199,19 @@
 			return error(GL_INVALID_OPERATION);
 		}
 
-		GLint clientVersion = context->getClientVersion();
-
-		if(IsColorRenderable(internalformat, clientVersion))
+		if(IsColorRenderable(internalformat))
 		{
 			context->setRenderbufferStorage(new es2::Colorbuffer(width, height, internalformat, samples));
 		}
-		else if(IsDepthRenderable(internalformat, clientVersion) && IsStencilRenderable(internalformat, clientVersion))
+		else if(IsDepthRenderable(internalformat) && IsStencilRenderable(internalformat))
 		{
 			context->setRenderbufferStorage(new es2::DepthStencilbuffer(width, height, internalformat, samples));
 		}
-		else if(IsDepthRenderable(internalformat, clientVersion))
+		else if(IsDepthRenderable(internalformat))
 		{
 			context->setRenderbufferStorage(new es2::Depthbuffer(width, height, internalformat, samples));
 		}
-		else if(IsStencilRenderable(internalformat, clientVersion))
+		else if(IsStencilRenderable(internalformat))
 		{
 			context->setRenderbufferStorage(new es2::Stencilbuffer(width, height, samples));
 		}
@@ -4978,25 +4527,14 @@
 
 	if(context)
 	{
-		// Core OpenGL ES 2.0 requires format and internalformat to be equal (checked below),
-		// but GL_APPLE_texture_format_BGRA8888 allows (only) GL_BGRA_EXT / GL_RGBA, while
+		// GL_APPLE_texture_format_BGRA8888 allows (only) GL_BGRA_EXT / GL_RGBA, while
 		// GL_EXT_texture_format_BGRA8888 also allows GL_BGRA_EXT / GL_BGRA_EXT.
 		if(format == GL_BGRA_EXT && internalformat == GL_RGBA)
 		{
 			internalformat = GL_BGRA_EXT;
 		}
 
-		GLint clientVersion = context->getClientVersion();
-		if(clientVersion < 3)
-		{
-			if((internalformat != (GLint)format) &&
-			   !((type == GL_FLOAT) && (format == GL_RGBA) && (internalformat == GL_RGBA32F))) // CHROMIUM_color_buffer_float_rgba
-			{
-				return error(GL_INVALID_OPERATION);
-			}
-		}
-
-		GLenum validationError = ValidateTextureFormatType(format, type, internalformat, target, clientVersion);
+		GLenum validationError = ValidateTextureFormatType(format, type, internalformat, target);
 		if(validationError != GL_NO_ERROR)
 		{
 			return error(validationError);
@@ -5086,35 +4624,14 @@
 	{
 		es2::Texture *texture;
 
-		GLint clientVersion = context->getClientVersion();
-
 		switch(target)
 		{
-		case GL_TEXTURE_2D:
-			texture = context->getTexture2D();
-			break;
-		case GL_TEXTURE_2D_ARRAY:
-			if(clientVersion < 3)
-			{
-				return error(GL_INVALID_ENUM);
-			}
-			else
-			{
-				texture = context->getTexture2DArray();
-			}
-			break;
-		case GL_TEXTURE_3D:
-			texture = context->getTexture3D();
-			break;
-		case GL_TEXTURE_CUBE_MAP:
-			texture = context->getTextureCubeMap();
-			break;
-		case GL_TEXTURE_EXTERNAL_OES:
-			texture = context->getTextureExternal();
-			break;
-		case GL_TEXTURE_RECTANGLE_ARB:
-			texture = context->getTexture2DRect();
-			break;
+		case GL_TEXTURE_2D:            texture = context->getTexture2D();       break;
+		case GL_TEXTURE_2D_ARRAY:      texture = context->getTexture2DArray();  break;
+		case GL_TEXTURE_3D:            texture = context->getTexture3D();       break;
+		case GL_TEXTURE_CUBE_MAP:      texture = context->getTextureCubeMap();  break;
+		case GL_TEXTURE_EXTERNAL_OES:  texture = context->getTextureExternal(); break;
+		case GL_TEXTURE_RECTANGLE_ARB: texture = context->getTexture2DRect();   break;
 		default:
 			return error(GL_INVALID_ENUM);
 		}
@@ -5158,61 +4675,61 @@
 			}
 			break;
 		case GL_TEXTURE_BASE_LEVEL:
-			if(clientVersion < 3 || !texture->setBaseLevel((GLint)(roundf(param))))
+			if(!texture->setBaseLevel((GLint)(roundf(param))))
 			{
 				return error(GL_INVALID_VALUE);
 			}
 			break;
 		case GL_TEXTURE_COMPARE_FUNC:
-			if(clientVersion < 3 || !texture->setCompareFunc((GLenum)param))
+			if(!texture->setCompareFunc((GLenum)param))
 			{
 				return error(GL_INVALID_VALUE);
 			}
 			break;
 		case GL_TEXTURE_COMPARE_MODE:
-			if(clientVersion < 3 || !texture->setCompareMode((GLenum)param))
+			if(!texture->setCompareMode((GLenum)param))
 			{
 				return error(GL_INVALID_VALUE);
 			}
 			break;
 		case GL_TEXTURE_MAX_LEVEL:
-			if(clientVersion < 3 || !texture->setMaxLevel((GLint)(roundf(param))))
+			if(!texture->setMaxLevel((GLint)(roundf(param))))
 			{
 				return error(GL_INVALID_VALUE);
 			}
 			break;
 		case GL_TEXTURE_MAX_LOD:
-			if(clientVersion < 3 || !texture->setMaxLOD(param))
+			if(!texture->setMaxLOD(param))
 			{
 				return error(GL_INVALID_VALUE);
 			}
 			break;
 		case GL_TEXTURE_MIN_LOD:
-			if(clientVersion < 3 || !texture->setMinLOD(param))
+			if(!texture->setMinLOD(param))
 			{
 				return error(GL_INVALID_VALUE);
 			}
 			break;
 		case GL_TEXTURE_SWIZZLE_R:
-			if(clientVersion < 3 || !texture->setSwizzleR((GLenum)param))
+			if(!texture->setSwizzleR((GLenum)param))
 			{
 				return error(GL_INVALID_VALUE);
 			}
 			break;
 		case GL_TEXTURE_SWIZZLE_G:
-			if(clientVersion < 3 || !texture->setSwizzleG((GLenum)param))
+			if(!texture->setSwizzleG((GLenum)param))
 			{
 				return error(GL_INVALID_VALUE);
 			}
 			break;
 		case GL_TEXTURE_SWIZZLE_B:
-			if(clientVersion < 3 || !texture->setSwizzleB((GLenum)param))
+			if(!texture->setSwizzleB((GLenum)param))
 			{
 				return error(GL_INVALID_VALUE);
 			}
 			break;
 		case GL_TEXTURE_SWIZZLE_A:
-			if(clientVersion < 3 || !texture->setSwizzleA((GLenum)param))
+			if(!texture->setSwizzleA((GLenum)param))
 			{
 				return error(GL_INVALID_VALUE);
 			}
@@ -5238,35 +4755,14 @@
 	{
 		es2::Texture *texture;
 
-		GLint clientVersion = context->getClientVersion();
-
 		switch(target)
 		{
-		case GL_TEXTURE_2D:
-			texture = context->getTexture2D();
-			break;
-		case GL_TEXTURE_2D_ARRAY:
-			if(clientVersion < 3)
-			{
-				return error(GL_INVALID_ENUM);
-			}
-			else
-			{
-				texture = context->getTexture2DArray();
-			}
-			break;
-		case GL_TEXTURE_3D:
-			texture = context->getTexture3D();
-			break;
-		case GL_TEXTURE_CUBE_MAP:
-			texture = context->getTextureCubeMap();
-			break;
-		case GL_TEXTURE_EXTERNAL_OES:
-			texture = context->getTextureExternal();
-			break;
-		case GL_TEXTURE_RECTANGLE_ARB:
-			texture = context->getTexture2DRect();
-			break;
+		case GL_TEXTURE_2D:            texture = context->getTexture2D();       break;
+		case GL_TEXTURE_2D_ARRAY:      texture = context->getTexture2DArray();  break;
+		case GL_TEXTURE_3D:            texture = context->getTexture3D();       break;
+		case GL_TEXTURE_CUBE_MAP:      texture = context->getTextureCubeMap();  break;
+		case GL_TEXTURE_EXTERNAL_OES:  texture = context->getTextureExternal(); break;
+		case GL_TEXTURE_RECTANGLE_ARB: texture = context->getTexture2DRect();   break;
 		default:
 			return error(GL_INVALID_ENUM);
 		}
@@ -5314,61 +4810,61 @@
 			{
 				return error(GL_INVALID_OPERATION); // Base level has to be 0
 			}
-			if(clientVersion < 3 || !texture->setBaseLevel(param))
+			if(!texture->setBaseLevel(param))
 			{
 				return error(GL_INVALID_VALUE);
 			}
 			break;
 		case GL_TEXTURE_COMPARE_FUNC:
-			if(clientVersion < 3 || !texture->setCompareFunc((GLenum)param))
+			if(!texture->setCompareFunc((GLenum)param))
 			{
 				return error(GL_INVALID_VALUE);
 			}
 			break;
 		case GL_TEXTURE_COMPARE_MODE:
-			if(clientVersion < 3 || !texture->setCompareMode((GLenum)param))
+			if(!texture->setCompareMode((GLenum)param))
 			{
 				return error(GL_INVALID_VALUE);
 			}
 			break;
 		case GL_TEXTURE_MAX_LEVEL:
-			if(clientVersion < 3 || !texture->setMaxLevel(param))
+			if(!texture->setMaxLevel(param))
 			{
 				return error(GL_INVALID_VALUE);
 			}
 			break;
 		case GL_TEXTURE_MAX_LOD:
-			if(clientVersion < 3 || !texture->setMaxLOD((GLfloat)param))
+			if(!texture->setMaxLOD((GLfloat)param))
 			{
 				return error(GL_INVALID_VALUE);
 			}
 			break;
 		case GL_TEXTURE_MIN_LOD:
-			if(clientVersion < 3 || !texture->setMinLOD((GLfloat)param))
+			if(!texture->setMinLOD((GLfloat)param))
 			{
 				return error(GL_INVALID_VALUE);
 			}
 			break;
 		case GL_TEXTURE_SWIZZLE_R:
-			if(clientVersion < 3 || !texture->setSwizzleR((GLenum)param))
+			if(!texture->setSwizzleR((GLenum)param))
 			{
 				return error(GL_INVALID_VALUE);
 			}
 			break;
 		case GL_TEXTURE_SWIZZLE_G:
-			if(clientVersion < 3 || !texture->setSwizzleG((GLenum)param))
+			if(!texture->setSwizzleG((GLenum)param))
 			{
 				return error(GL_INVALID_VALUE);
 			}
 			break;
 		case GL_TEXTURE_SWIZZLE_B:
-			if(clientVersion < 3 || !texture->setSwizzleB((GLenum)param))
+			if(!texture->setSwizzleB((GLenum)param))
 			{
 				return error(GL_INVALID_VALUE);
 			}
 			break;
 		case GL_TEXTURE_SWIZZLE_A:
-			if(clientVersion < 3 || !texture->setSwizzleA((GLenum)param))
+			if(!texture->setSwizzleA((GLenum)param))
 			{
 				return error(GL_INVALID_VALUE);
 			}
@@ -5420,7 +4916,7 @@
 		{
 			es2::Texture2D *texture = context->getTexture2D(target);
 
-			GLenum validationError = ValidateSubImageParams(false, false, target, level, xoffset, yoffset, width, height, format, type, texture, context->getClientVersion());
+			GLenum validationError = ValidateSubImageParams(false, false, target, level, xoffset, yoffset, width, height, format, type, texture);
 			if(validationError != GL_NO_ERROR)
 			{
 				return error(validationError);
@@ -5438,7 +4934,7 @@
 		{
 			es2::TextureCubeMap *texture = context->getTextureCubeMap();
 
-			GLenum validationError = ValidateSubImageParams(false, false, target, level, xoffset, yoffset, width, height, format, type, texture, context->getClientVersion());
+			GLenum validationError = ValidateSubImageParams(false, false, target, level, xoffset, yoffset, width, height, format, type, texture);
 			if(validationError != GL_NO_ERROR)
 			{
 				return error(validationError);
@@ -5778,11 +5274,6 @@
 
 	if(context)
 	{
-		if(context->getClientVersion() < 3 && transpose != GL_FALSE)
-		{
-			return error(GL_INVALID_VALUE);
-		}
-
 		es2::Program *program = context->getCurrentProgram();
 
 		if(!program)
@@ -5816,11 +5307,6 @@
 
 	if(context)
 	{
-		if(context->getClientVersion() < 3 && transpose != GL_FALSE)
-		{
-			return error(GL_INVALID_VALUE);
-		}
-
 		es2::Program *program = context->getCurrentProgram();
 
 		if(!program)
@@ -5854,11 +5340,6 @@
 
 	if(context)
 	{
-		if(context->getClientVersion() < 3 && transpose != GL_FALSE)
-		{
-			return error(GL_INVALID_VALUE);
-		}
-
 		es2::Program *program = context->getCurrentProgram();
 
 		if(!program)
@@ -6100,8 +5581,6 @@
 		return error(GL_INVALID_VALUE);
 	}
 
-	GLint clientVersion = egl::getClientVersion();
-
 	switch(type)
 	{
 	case GL_BYTE:
@@ -6115,22 +5594,13 @@
 		break;
 	case GL_INT_2_10_10_10_REV:
 	case GL_UNSIGNED_INT_2_10_10_10_REV:
-		if(clientVersion >= 3)
+		if(size != 4)
 		{
-			if(size != 4)
-			{
-				return error(GL_INVALID_OPERATION);
-			}
-			break;
+			return error(GL_INVALID_OPERATION);
 		}
-		else return error(GL_INVALID_ENUM);
 	case GL_INT:
 	case GL_UNSIGNED_INT:
-		if(clientVersion >= 3)
-		{
-			break;
-		}
-		else return error(GL_INVALID_ENUM);
+		break;
 	default:
 		return error(GL_INVALID_ENUM);
 	}
@@ -6253,7 +5723,7 @@
 		return error(GL_INVALID_OPERATION);
 	}
 
-	GLenum validationError = ValidateTextureFormatType(format, type, internalformat, target, egl::getClientVersion());
+	GLenum validationError = ValidateTextureFormatType(format, type, internalformat, target);
 	if(validationError != GL_NO_ERROR)
 	{
 		return error(validationError);
@@ -6328,7 +5798,7 @@
 	{
 		es2::Texture3D *texture = context->getTexture3D();
 
-		GLenum validationError = ValidateSubImageParams(false, false, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, texture, context->getClientVersion());
+		GLenum validationError = ValidateSubImageParams(false, false, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, texture);
 		if(validationError != GL_NO_ERROR)
 		{
 			return error(validationError);
@@ -6383,7 +5853,7 @@
 
 		es2::Texture3D *texture = context->getTexture3D();
 
-		GLenum validationError = ValidateSubImageParams(false, true, target, level, xoffset, yoffset, zoffset, width, height, 1, GL_NONE, GL_NONE, texture, context->getClientVersion());
+		GLenum validationError = ValidateSubImageParams(false, true, target, level, xoffset, yoffset, zoffset, width, height, 1, GL_NONE, GL_NONE, texture);
 		if(validationError != GL_NO_ERROR)
 		{
 			return error(validationError);
@@ -6418,7 +5888,7 @@
 		return error(GL_INVALID_VALUE);
 	}
 
-	if(!IsCompressed(internalformat, egl::getClientVersion()))
+	if(!IsCompressed(internalformat))
 	{
 		return error(GL_INVALID_ENUM);
 	}
@@ -6475,7 +5945,7 @@
 		return error(GL_INVALID_VALUE);
 	}
 
-	if(!IsCompressed(format, egl::getClientVersion()))
+	if(!IsCompressed(format))
 	{
 		return error(GL_INVALID_ENUM);
 	}
@@ -6574,57 +6044,17 @@
 			return error(GL_INVALID_OPERATION);
 		}
 
-		GLint clientVersion = context->getClientVersion();
-
 		switch(attachment)
 		{
-		case GL_COLOR_ATTACHMENT1:
-		case GL_COLOR_ATTACHMENT2:
-		case GL_COLOR_ATTACHMENT3:
-		case GL_COLOR_ATTACHMENT4:
-		case GL_COLOR_ATTACHMENT5:
-		case GL_COLOR_ATTACHMENT6:
-		case GL_COLOR_ATTACHMENT7:
-		case GL_COLOR_ATTACHMENT8:
-		case GL_COLOR_ATTACHMENT9:
-		case GL_COLOR_ATTACHMENT10:
-		case GL_COLOR_ATTACHMENT11:
-		case GL_COLOR_ATTACHMENT12:
-		case GL_COLOR_ATTACHMENT13:
-		case GL_COLOR_ATTACHMENT14:
-		case GL_COLOR_ATTACHMENT15:
-		case GL_COLOR_ATTACHMENT16:
-		case GL_COLOR_ATTACHMENT17:
-		case GL_COLOR_ATTACHMENT18:
-		case GL_COLOR_ATTACHMENT19:
-		case GL_COLOR_ATTACHMENT20:
-		case GL_COLOR_ATTACHMENT21:
-		case GL_COLOR_ATTACHMENT22:
-		case GL_COLOR_ATTACHMENT23:
-		case GL_COLOR_ATTACHMENT24:
-		case GL_COLOR_ATTACHMENT25:
-		case GL_COLOR_ATTACHMENT26:
-		case GL_COLOR_ATTACHMENT27:
-		case GL_COLOR_ATTACHMENT28:
-		case GL_COLOR_ATTACHMENT29:
-		case GL_COLOR_ATTACHMENT30:
-		case GL_COLOR_ATTACHMENT31:
-			if(clientVersion < 3)
-			{
-				return error(GL_INVALID_ENUM);
-			}
-			// fall through
-		case GL_COLOR_ATTACHMENT0:
+		case GL_DEPTH_ATTACHMENT:   framebuffer->setDepthbuffer(textarget, texture);   break;
+		case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
+		default:
 			if((attachment - GL_COLOR_ATTACHMENT0) >= MAX_COLOR_ATTACHMENTS)
 			{
 				return error(GL_INVALID_ENUM);
 			}
 			framebuffer->setColorbuffer(textarget, texture, attachment - GL_COLOR_ATTACHMENT0);
 			break;
-		case GL_DEPTH_ATTACHMENT:   framebuffer->setDepthbuffer(textarget, texture);   break;
-		case GL_STENCIL_ATTACHMENT: framebuffer->setStencilbuffer(textarget, texture); break;
-		default:
-			return error(GL_INVALID_ENUM);
 		}
 	}
 }
diff --git a/src/OpenGL/libGLESv2/libGLESv2.hpp b/src/OpenGL/libGLESv2/libGLESv2.hpp
index 0c617c9..cb16caf 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.hpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.hpp
@@ -243,7 +243,7 @@
 	void (*glGenerateMipmapOES)(GLenum target);
 	void (*glDrawBuffersEXT)(GLsizei n, const GLenum *bufs);
 
-	egl::Context *(*es2CreateContext)(egl::Display *display, const egl::Context *shareContext, int clientVersion, const egl::Config *config);
+	egl::Context *(*es2CreateContext)(egl::Display *display, const egl::Context *shareContext, const egl::Config *config);
 	__eglMustCastToProperFunctionPointerType (*es2GetProcAddress)(const char *procname);
 	egl::Image *(*createBackBuffer)(int width, int height, sw::Format format, int multiSampleDepth);
 	egl::Image *(*createBackBufferFromClientBuffer)(const egl::ClientBuffer& clientBuffer);
diff --git a/src/OpenGL/libGLESv2/libGLESv3.cpp b/src/OpenGL/libGLESv2/libGLESv3.cpp
index 5d35d06..adb24d7 100644
--- a/src/OpenGL/libGLESv2/libGLESv3.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv3.cpp
@@ -368,7 +368,7 @@
 
 	if(context)
 	{
-		GLenum validationError = ValidateTextureFormatType(format, type, internalformat, target, context->getClientVersion());
+		GLenum validationError = ValidateTextureFormatType(format, type, internalformat, target);
 		if(validationError != GL_NO_ERROR)
 		{
 			return error(validationError);
@@ -424,7 +424,7 @@
 	{
 		es2::Texture3D *texture = (target == GL_TEXTURE_3D) ? context->getTexture3D() : context->getTexture2DArray();
 
-		GLenum validationError = ValidateSubImageParams(false, false, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, texture, context->getClientVersion());
+		GLenum validationError = ValidateSubImageParams(false, false, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, texture);
 		if(validationError != GL_NO_ERROR)
 		{
 			return error(validationError);
@@ -486,7 +486,7 @@
 		GLenum colorbufferFormat = source->getFormat();
 		es2::Texture3D *texture = (target == GL_TEXTURE_3D) ? context->getTexture3D() : context->getTexture2DArray();
 
-		GLenum validationError = ValidateSubImageParams(false, true, target, level, xoffset, yoffset, zoffset, width, height, 1, GL_NONE, GL_NONE, texture, context->getClientVersion());
+		GLenum validationError = ValidateSubImageParams(false, true, target, level, xoffset, yoffset, zoffset, width, height, 1, GL_NONE, GL_NONE, texture);
 		if(validationError != GL_NO_ERROR)
 		{
 			return error(validationError);
@@ -529,7 +529,7 @@
 		return error(GL_INVALID_VALUE);
 	}
 
-	if(!IsCompressed(internalformat, egl::getClientVersion()))
+	if(!IsCompressed(internalformat))
 	{
 		return error(GL_INVALID_ENUM);
 	}
@@ -586,7 +586,7 @@
 		return error(GL_INVALID_VALUE);
 	}
 
-	if(!IsCompressed(format, egl::getClientVersion()))
+	if(!IsCompressed(format))
 	{
 		return error(GL_INVALID_ENUM);
 	}
@@ -3634,7 +3634,7 @@
 		return error(GL_INVALID_OPERATION);
 	}
 
-	bool isCompressed = IsCompressed(internalformat, egl::getClientVersion());
+	bool isCompressed = IsCompressed(internalformat);
 	if(!IsSizedInternalFormat(internalformat) && !isCompressed)
 	{
 		return error(GL_INVALID_ENUM);
@@ -3717,7 +3717,7 @@
 		return error(GL_INVALID_VALUE);
 	}
 
-	if(!IsSizedInternalFormat(internalformat) && !IsCompressed(internalformat, egl::getClientVersion()))
+	if(!IsSizedInternalFormat(internalformat) && !IsCompressed(internalformat))
 	{
 		return error(GL_INVALID_ENUM);
 	}
@@ -3801,9 +3801,9 @@
 	if(internalformat == GL_RGB)  internalformat = GL_RGB8;
 	if(internalformat == GL_RGBA) internalformat = GL_RGBA8;
 
-	if(!IsColorRenderable(internalformat, egl::getClientVersion()) &&
-	   !IsDepthRenderable(internalformat, egl::getClientVersion()) &&
-	   !IsStencilRenderable(internalformat, egl::getClientVersion()))
+	if(!IsColorRenderable(internalformat) &&
+	   !IsDepthRenderable(internalformat) &&
+	   !IsStencilRenderable(internalformat))
 	{
 		return error(GL_INVALID_ENUM);
 	}
diff --git a/src/OpenGL/libGLESv2/utilities.cpp b/src/OpenGL/libGLESv2/utilities.cpp
index b863f1d..c531b26 100644
--- a/src/OpenGL/libGLESv2/utilities.cpp
+++ b/src/OpenGL/libGLESv2/utilities.cpp
@@ -323,7 +323,7 @@
 		return -1;
 	}
 
-	bool IsCompressed(GLint internalformat, GLint clientVersion)
+	bool IsCompressed(GLint internalformat)
 	{
 		switch(internalformat)
 		{
@@ -332,7 +332,6 @@
 		case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
 		case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
 		case GL_ETC1_RGB8_OES:
-			return true;
 		case GL_COMPRESSED_R11_EAC:
 		case GL_COMPRESSED_SIGNED_R11_EAC:
 		case GL_COMPRESSED_RG11_EAC:
@@ -343,7 +342,7 @@
 		case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
 		case GL_COMPRESSED_RGBA8_ETC2_EAC:
 		case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
-			return (clientVersion >= 3);
+			return true;
 		case GL_COMPRESSED_RGBA_ASTC_4x4_KHR:
 		case GL_COMPRESSED_RGBA_ASTC_5x4_KHR:
 		case GL_COMPRESSED_RGBA_ASTC_5x5_KHR:
@@ -372,7 +371,7 @@
 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
 		case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:
-			return ASTC_SUPPORT && (clientVersion >= 3);
+			return ASTC_SUPPORT;
 		default:
 			return false;
 		}
@@ -455,7 +454,7 @@
 	}
 
 	GLenum ValidateSubImageParams(bool compressed, bool copy, GLenum target, GLint level, GLint xoffset, GLint yoffset,
-	                              GLsizei width, GLsizei height, GLenum format, GLenum type, Texture *texture, GLint clientVersion)
+	                              GLsizei width, GLsizei height, GLenum format, GLenum type, Texture *texture)
 	{
 		if(!texture)
 		{
@@ -473,7 +472,7 @@
 		}
 		else if(!copy)   // CopyTexSubImage doesn't have format/type parameters.
 		{
-			GLenum validationError = ValidateTextureFormatType(format, type, sizedInternalFormat, target, clientVersion);
+			GLenum validationError = ValidateTextureFormatType(format, type, sizedInternalFormat, target);
 			if(validationError != GL_NO_ERROR)
 			{
 				return validationError;
@@ -499,7 +498,7 @@
 	}
 
 	GLenum ValidateSubImageParams(bool compressed, bool copy, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
-	                              GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, Texture *texture, GLint clientVersion)
+	                              GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, Texture *texture)
 	{
 		if(!texture)
 		{
@@ -515,7 +514,7 @@
 		{
 			GLenum sizedInternalFormat = texture->getFormat(target, level);
 
-			GLenum validationError = ValidateTextureFormatType(format, type, sizedInternalFormat, target, clientVersion);
+			GLenum validationError = ValidateTextureFormatType(format, type, sizedInternalFormat, target);
 			if(validationError != GL_NO_ERROR)
 			{
 				return validationError;
@@ -624,7 +623,7 @@
 		return true;
 	}
 
-	bool IsValidReadPixelsFormatType(const Framebuffer *framebuffer, GLenum format, GLenum type, GLint clientVersion)
+	bool IsValidReadPixelsFormatType(const Framebuffer *framebuffer, GLenum format, GLenum type)
 	{
 		// GL_NV_read_depth
 		if(format == GL_DEPTH_COMPONENT)
@@ -686,8 +685,6 @@
 		}
 		else if(IsSignedNonNormalizedInteger(internalformat))
 		{
-			ASSERT(clientVersion >= 3);
-
 			if(format == GL_RGBA_INTEGER && type == GL_INT)
 			{
 				return true;
@@ -695,8 +692,6 @@
 		}
 		else if(IsUnsignedNonNormalizedInteger(internalformat))
 		{
-			ASSERT(clientVersion >= 3);
-
 			if(format == GL_RGBA_INTEGER && type == GL_UNSIGNED_INT)
 			{
 				return true;
@@ -727,8 +722,6 @@
 		// Additional third combination accepted by OpenGL ES 3.0.
 		if(internalformat == GL_RGB10_A2)
 		{
-			ASSERT(clientVersion >= 3);
-
 			if(format == GL_RGBA && type == GL_UNSIGNED_INT_2_10_10_10_REV)
 			{
 				return true;
@@ -783,7 +776,7 @@
 		return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target) || target == GL_TEXTURE_3D || target == GL_TEXTURE_2D_ARRAY || target == GL_TEXTURE_RECTANGLE_ARB;
 	}
 
-	GLenum ValidateTextureFormatType(GLenum format, GLenum type, GLint internalformat, GLenum target, GLint clientVersion)
+	GLenum ValidateTextureFormatType(GLenum format, GLenum type, GLint internalformat, GLenum target)
 	{
 		switch(type)
 		{
@@ -805,10 +798,6 @@
 		case GL_UNSIGNED_INT_10F_11F_11F_REV:
 		case GL_UNSIGNED_INT_5_9_9_9_REV:
 		case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
-			if(clientVersion < 3)
-			{
-				return GL_INVALID_ENUM;
-			}
 			break;
 		default:
 			return GL_INVALID_ENUM;
@@ -846,10 +835,6 @@
 		case GL_RG_INTEGER:
 		case GL_RGB_INTEGER:
 		case GL_RGBA_INTEGER:
-			if(clientVersion < 3)
-			{
-				return GL_INVALID_ENUM;
-			}
 			break;
 		default:
 			return GL_INVALID_ENUM;
@@ -1165,9 +1150,9 @@
 		return 1;
 	}
 
-	bool IsColorRenderable(GLint internalformat, GLint clientVersion)
+	bool IsColorRenderable(GLint internalformat)
 	{
-		if(IsCompressed(internalformat, clientVersion))
+		if(IsCompressed(internalformat))
 		{
 			return false;
 		}
@@ -1188,9 +1173,8 @@
 		case GL_R32F:
 		case GL_RG32F:
 		case GL_RGB32F:
-		case GL_RGBA32F:
+		case GL_RGBA32F:     // GL_EXT_color_buffer_float, OpenGL ES 3.0+ only.
 		case GL_BGRA8_EXT:   // GL_EXT_texture_format_BGRA8888
-			return true;
 		case GL_R8UI:
 		case GL_R8I:
 		case GL_R16UI:
@@ -1213,7 +1197,7 @@
 		case GL_RGBA32I:
 		case GL_RGBA32UI:
 		case GL_R11F_G11F_B10F:
-			return clientVersion >= 3;
+			return true;
 		case GL_R8_SNORM:
 		case GL_RG8_SNORM:
 		case GL_RGB8_SNORM:
@@ -1242,9 +1226,9 @@
 		return false;
 	}
 
-	bool IsDepthRenderable(GLint internalformat, GLint clientVersion)
+	bool IsDepthRenderable(GLint internalformat)
 	{
-		if(IsCompressed(internalformat, clientVersion))
+		if(IsCompressed(internalformat))
 		{
 			return false;
 		}
@@ -1255,10 +1239,9 @@
 		case GL_DEPTH_COMPONENT16:
 		case GL_DEPTH24_STENCIL8_OES:    // GL_OES_packed_depth_stencil
 		case GL_DEPTH_COMPONENT32_OES:   // GL_OES_depth32
-			return true;
 		case GL_DEPTH32F_STENCIL8:
 		case GL_DEPTH_COMPONENT32F:
-			return clientVersion >= 3;
+			return true;
 		case GL_STENCIL_INDEX8:
 		case GL_R8:
 		case GL_R8UI:
@@ -1313,9 +1296,9 @@
 		return false;
 	}
 
-	bool IsStencilRenderable(GLint internalformat, GLint clientVersion)
+	bool IsStencilRenderable(GLint internalformat)
 	{
-		if(IsCompressed(internalformat, clientVersion))
+		if(IsCompressed(internalformat))
 		{
 			return false;
 		}
@@ -1324,9 +1307,8 @@
 		{
 		case GL_STENCIL_INDEX8:
 		case GL_DEPTH24_STENCIL8_OES:
-			return true;
 		case GL_DEPTH32F_STENCIL8:
-			return clientVersion >= 3;
+			return true;
 		case GL_R8:
 		case GL_R8UI:
 		case GL_R8I:
@@ -1384,7 +1366,7 @@
 		return false;
 	}
 
-	bool IsMipmappable(GLint internalformat, GLint clientVersion)
+	bool IsMipmappable(GLint internalformat)
 	{
 		if(internalformat == GL_NONE)
 		{
@@ -1409,7 +1391,7 @@
 		case GL_LUMINANCE_ALPHA16F_EXT:
 			return true;
 		default:
-			return IsColorRenderable(internalformat, clientVersion);
+			return IsColorRenderable(internalformat);
 		}
 	}
 
diff --git a/src/OpenGL/libGLESv2/utilities.h b/src/OpenGL/libGLESv2/utilities.h
index f0fdb4b..00f577e 100644
--- a/src/OpenGL/libGLESv2/utilities.h
+++ b/src/OpenGL/libGLESv2/utilities.h
@@ -44,26 +44,26 @@
 
 	int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize);
 
-	bool IsCompressed(GLint intenalformat, GLint clientVersion);
+	bool IsCompressed(GLint intenalformat);
 	bool IsSizedInternalFormat(GLint internalformat);   // Not compressed.
 	GLenum ValidateSubImageParams(bool compressed, bool copy, GLenum target, GLint level, GLint xoffset, GLint yoffset,
-	                              GLsizei width, GLsizei height, GLenum format, GLenum type, Texture *texture, GLint clientVersion);
+	                              GLsizei width, GLsizei height, GLenum format, GLenum type, Texture *texture);
 	GLenum ValidateSubImageParams(bool compressed, bool copy, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
-	                              GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, Texture *texture, GLint clientVersion);
+	                              GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, Texture *texture);
 	bool ValidateCopyFormats(GLenum textureFormat, GLenum colorbufferFormat);
-	bool IsValidReadPixelsFormatType(const Framebuffer *framebuffer, GLenum format, GLenum type, GLint clientVersion);
+	bool IsValidReadPixelsFormatType(const Framebuffer *framebuffer, GLenum format, GLenum type);
 	bool IsDepthTexture(GLenum format);
 	bool IsStencilTexture(GLenum format);
 	bool IsCubemapTextureTarget(GLenum target);
 	int CubeFaceIndex(GLenum cubeTarget);
 	bool IsTextureTarget(GLenum target);
-	GLenum ValidateTextureFormatType(GLenum format, GLenum type, GLint internalformat, GLenum target, GLint clientVersion);
+	GLenum ValidateTextureFormatType(GLenum format, GLenum type, GLint internalformat, GLenum target);
 	size_t GetTypeSize(GLenum type);
 
-	bool IsColorRenderable(GLint internalformat, GLint clientVersion);
-	bool IsDepthRenderable(GLint internalformat, GLint clientVersion);
-	bool IsStencilRenderable(GLint internalformat, GLint clientVersion);
-	bool IsMipmappable(GLint internalformat, GLint clientVersion);
+	bool IsColorRenderable(GLint internalformat);
+	bool IsDepthRenderable(GLint internalformat);
+	bool IsStencilRenderable(GLint internalformat);
+	bool IsMipmappable(GLint internalformat);
 
 	GLuint GetAlphaSize(GLint internalformat);
 	GLuint GetRedSize(GLint internalformat);
diff --git a/tests/unittests/unittests.cpp b/tests/unittests/unittests.cpp
index 40f1c59..ba50b0d 100644
--- a/tests/unittests/unittests.cpp
+++ b/tests/unittests/unittests.cpp
@@ -136,7 +136,7 @@
 			EXPECT_TRUE(renderableType & EGL_OPENGL_ES2_BIT);
 
 			EGLint surfaceType = 0;
-			eglGetConfigAttrib(display, config, EGL_RENDERABLE_TYPE, &surfaceType);
+			eglGetConfigAttrib(display, config, EGL_SURFACE_TYPE, &surfaceType);
 			EXPECT_EQ(EGL_SUCCESS, eglGetError());
 			EXPECT_TRUE(surfaceType & EGL_WINDOW_BIT);
 		}
@@ -333,9 +333,10 @@
 	EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());
 	EXPECT_STREQ("Google SwiftShader", (const char*)glRenderer);
 
+	// SwiftShader return an OpenGL ES 3.0 context when a 2.0 context is requested, as allowed by the spec.
 	const GLubyte *glVersion = glGetString(GL_VERSION);
 	EXPECT_GLENUM_EQ(GL_NO_ERROR, glGetError());
-	EXPECT_THAT((const char*)glVersion, testing::HasSubstr("OpenGL ES 2.0 SwiftShader "));
+	EXPECT_THAT((const char*)glVersion, testing::HasSubstr("OpenGL ES 3.0 SwiftShader "));
 
 	Uninitialize();
 }