Added missing validation to CopyBufferSubData

Missing validation for mapped buffers and overlap
was added to CopyBufferSubData.

Change-Id: If1f3f9901f039f5737d41ca46d98ce4c188274d6
Reviewed-on: https://swiftshader-review.googlesource.com/3603
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libGLESv2/libGLESv3.cpp b/src/OpenGL/libGLESv2/libGLESv3.cpp
index e1cef90..fa75133 100644
--- a/src/OpenGL/libGLESv2/libGLESv3.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv3.cpp
@@ -2661,22 +2661,23 @@
 

 	if(context)

 	{

-		es2::Buffer *readBuffer = nullptr;

-		if(!context->getBuffer(readTarget, &readBuffer))

+		es2::Buffer *readBuffer = nullptr, *writeBuffer = nullptr;

+		if(!context->getBuffer(readTarget, &readBuffer) || !context->getBuffer(writeTarget, &writeBuffer))

 		{

 			return error(GL_INVALID_ENUM);

 		}

-		if(static_cast<size_t>(readOffset + size) > readBuffer->size())

+		if(!readBuffer || readBuffer->isMapped() || !writeBuffer || writeBuffer->isMapped())

+		{

+			return error(GL_INVALID_OPERATION);

+		}

+		if((readBuffer == writeBuffer) && // If same buffer, check for overlap

+		   ((readOffset >= writeOffset) && (readOffset < (writeOffset + size)) ||

+		    (writeOffset >= readOffset) && (writeOffset < (readOffset + size))))

 		{

 			return error(GL_INVALID_VALUE);

 		}

-

-		es2::Buffer *writeBuffer = nullptr;

-		if(!context->getBuffer(writeTarget, &writeBuffer))

-		{

-			return error(GL_INVALID_ENUM);

-		}

-		if(static_cast<size_t>(writeOffset + size) > writeBuffer->size())

+		if((static_cast<size_t>(readOffset + size) > readBuffer->size()) ||

+		   (static_cast<size_t>(writeOffset + size) > writeBuffer->size()))

 		{

 			return error(GL_INVALID_VALUE);

 		}