Create 64-bit translator libraries for the Android Emulator.

This patch also clips 64-bit parameters for glBufferData and glBufferSubData
to 32-bit to work around an Android emulator issue.

Bug 18510357

Change-Id: If6870d75849e372747072ec157580d9f5ec76a9a
Reviewed-on: https://swiftshader-review.googlesource.com/1610
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/OpenGL/libEGL/main.cpp b/src/OpenGL/libEGL/main.cpp
index 3256595..7e4e09a 100644
--- a/src/OpenGL/libEGL/main.cpp
+++ b/src/OpenGL/libEGL/main.cpp
@@ -85,6 +85,8 @@
 

 	#if defined(_WIN32)

 	const char *libGLES_CM_lib[] = {"libGLES_CM.dll", "libGLES_CM_translator.dll"};

+	#elif defined(__LP64__)

+	const char *libGLES_CM_lib[] = {"lib64GLES_CM_translator.so", "libGLES_CM.so.1", "libGLES_CM.so"};

 	#else

 	const char *libGLES_CM_lib[] = {"libGLES_CM_translator.so", "libGLES_CM.so.1", "libGLES_CM.so"};

 	#endif

@@ -95,6 +97,8 @@
 

 	#if defined(_WIN32)

 	const char *libGLESv2_lib[] = {"libGLESv2.dll", "libGLES_V2_translator.dll"};

+	#elif defined(__LP64__)

+	const char *libGLESv2_lib[] = {"lib64GLES_V2_translator.so", "libGLESv2.so.2", "libGLESv2.so"};

 	#else

 	const char *libGLESv2_lib[] = {"libGLES_V2_translator.so", "libGLESv2.so.2", "libGLESv2.so"};

 	#endif

diff --git a/src/OpenGL/libGLES_CM/libGLES_CM.cpp b/src/OpenGL/libGLES_CM/libGLES_CM.cpp
index 790e5e2..0e48003 100644
--- a/src/OpenGL/libGLES_CM/libGLES_CM.cpp
+++ b/src/OpenGL/libGLES_CM/libGLES_CM.cpp
@@ -377,13 +377,13 @@
 	{

 		switch(target)

 		{

-			case GL_ARRAY_BUFFER:

+		case GL_ARRAY_BUFFER:

 			context->bindArrayBuffer(buffer);

 			return;

-			case GL_ELEMENT_ARRAY_BUFFER:

+		case GL_ELEMENT_ARRAY_BUFFER:

 			context->bindElementArrayBuffer(buffer);

 			return;

-			default:

+		default:

 			return error(GL_INVALID_ENUM);

 		}

 	}

@@ -535,71 +535,71 @@
 

 	switch(srcRGB)

 	{

-		case GL_ZERO:

-		case GL_ONE:

-		case GL_SRC_COLOR:

-		case GL_ONE_MINUS_SRC_COLOR:

-		case GL_DST_COLOR:

-		case GL_ONE_MINUS_DST_COLOR:

-		case GL_SRC_ALPHA:

-		case GL_ONE_MINUS_SRC_ALPHA:

-		case GL_DST_ALPHA:

-		case GL_ONE_MINUS_DST_ALPHA:

-		case GL_SRC_ALPHA_SATURATE:

+	case GL_ZERO:

+	case GL_ONE:

+	case GL_SRC_COLOR:

+	case GL_ONE_MINUS_SRC_COLOR:

+	case GL_DST_COLOR:

+	case GL_ONE_MINUS_DST_COLOR:

+	case GL_SRC_ALPHA:

+	case GL_ONE_MINUS_SRC_ALPHA:

+	case GL_DST_ALPHA:

+	case GL_ONE_MINUS_DST_ALPHA:

+	case GL_SRC_ALPHA_SATURATE:

 		break;

-		default:

+	default:

 		return error(GL_INVALID_ENUM);

 	}

 

 	switch(dstRGB)

 	{

-		case GL_ZERO:

-		case GL_ONE:

-		case GL_SRC_COLOR:

-		case GL_ONE_MINUS_SRC_COLOR:

-		case GL_DST_COLOR:

-		case GL_ONE_MINUS_DST_COLOR:

-		case GL_SRC_ALPHA:

-		case GL_ONE_MINUS_SRC_ALPHA:

-		case GL_DST_ALPHA:

-		case GL_ONE_MINUS_DST_ALPHA:

+	case GL_ZERO:

+	case GL_ONE:

+	case GL_SRC_COLOR:

+	case GL_ONE_MINUS_SRC_COLOR:

+	case GL_DST_COLOR:

+	case GL_ONE_MINUS_DST_COLOR:

+	case GL_SRC_ALPHA:

+	case GL_ONE_MINUS_SRC_ALPHA:

+	case GL_DST_ALPHA:

+	case GL_ONE_MINUS_DST_ALPHA:

 		break;

-		default:

+	default:

 		return error(GL_INVALID_ENUM);

 	}

 

 	switch(srcAlpha)

 	{

-		case GL_ZERO:

-		case GL_ONE:

-		case GL_SRC_COLOR:

-		case GL_ONE_MINUS_SRC_COLOR:

-		case GL_DST_COLOR:

-		case GL_ONE_MINUS_DST_COLOR:

-		case GL_SRC_ALPHA:

-		case GL_ONE_MINUS_SRC_ALPHA:

-		case GL_DST_ALPHA:

-		case GL_ONE_MINUS_DST_ALPHA:

-		case GL_SRC_ALPHA_SATURATE:

+	case GL_ZERO:

+	case GL_ONE:

+	case GL_SRC_COLOR:

+	case GL_ONE_MINUS_SRC_COLOR:

+	case GL_DST_COLOR:

+	case GL_ONE_MINUS_DST_COLOR:

+	case GL_SRC_ALPHA:

+	case GL_ONE_MINUS_SRC_ALPHA:

+	case GL_DST_ALPHA:

+	case GL_ONE_MINUS_DST_ALPHA:

+	case GL_SRC_ALPHA_SATURATE:

 		break;

-		default:

+	default:

 		return error(GL_INVALID_ENUM);

 	}

 

 	switch(dstAlpha)

 	{

-		case GL_ZERO:

-		case GL_ONE:

-		case GL_SRC_COLOR:

-		case GL_ONE_MINUS_SRC_COLOR:

-		case GL_DST_COLOR:

-		case GL_ONE_MINUS_DST_COLOR:

-		case GL_SRC_ALPHA:

-		case GL_ONE_MINUS_SRC_ALPHA:

-		case GL_DST_ALPHA:

-		case GL_ONE_MINUS_DST_ALPHA:

+	case GL_ZERO:

+	case GL_ONE:

+	case GL_SRC_COLOR:

+	case GL_ONE_MINUS_SRC_COLOR:

+	case GL_DST_COLOR:

+	case GL_ONE_MINUS_DST_COLOR:

+	case GL_SRC_ALPHA:

+	case GL_ONE_MINUS_SRC_ALPHA:

+	case GL_DST_ALPHA:

+	case GL_ONE_MINUS_DST_ALPHA:

 		break;

-		default:

+	default:

 		return error(GL_INVALID_ENUM);

 	}

 

@@ -612,7 +612,9 @@
 }

 

 void GL_APIENTRY glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)

-{

+{
+	size = static_cast<GLint>(size);   // Work around issues with some 64-bit applications
+

 	TRACE("(GLenum target = 0x%X, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p, GLenum usage = %d)",

 	      target, size, data, usage);

 

@@ -623,10 +625,10 @@
 

 	switch(usage)

 	{

-		case GL_STATIC_DRAW:

-		case GL_DYNAMIC_DRAW:

+	case GL_STATIC_DRAW:

+	case GL_DYNAMIC_DRAW:

 		break;

-		default:

+	default:

 		return error(GL_INVALID_ENUM);

 	}

 

@@ -638,13 +640,13 @@
 

 		switch(target)

 		{

-			case GL_ARRAY_BUFFER:

+		case GL_ARRAY_BUFFER:

 			buffer = context->getArrayBuffer();

 			break;

-			case GL_ELEMENT_ARRAY_BUFFER:

+		case GL_ELEMENT_ARRAY_BUFFER:

 			buffer = context->getElementArrayBuffer();

 			break;

-			default:

+		default:

 			return error(GL_INVALID_ENUM);

 		}

 

@@ -658,9 +660,12 @@
 }

 

 void GL_APIENTRY glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)

-{

+{
+	size = static_cast<GLint>(size);   // Work around issues with some 64-bit applications
+	offset = static_cast<GLint>(offset);
+

 	TRACE("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p)",

-	      target, offset, size, data);

+	      target, offset, size, data);
 

 	if(size < 0 || offset < 0)

 	{

@@ -680,13 +685,13 @@
 

 		switch(target)

 		{

-			case GL_ARRAY_BUFFER:

+		case GL_ARRAY_BUFFER:

 			buffer = context->getArrayBuffer();

 			break;

-			case GL_ELEMENT_ARRAY_BUFFER:

+		case GL_ELEMENT_ARRAY_BUFFER:

 			buffer = context->getElementArrayBuffer();

 			break;

-			default:

+		default:

 			return error(GL_INVALID_ENUM);

 		}

 

@@ -945,7 +950,7 @@
 		{

 		case GL_TEXTURE_2D:

 			if(width > (es1::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level) ||

-				height > (es1::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level))

+			   height > (es1::IMPLEMENTATION_MAX_TEXTURE_SIZE >> level))

 			{

 				return error(GL_INVALID_VALUE);

 			}

@@ -2839,7 +2844,7 @@
 	{

 		switch(pname)

 		{

-			case GL_UNPACK_ALIGNMENT:

+		case GL_UNPACK_ALIGNMENT:

 			if(param != 1 && param != 2 && param != 4 && param != 8)

 			{

 				return error(GL_INVALID_VALUE);

@@ -2847,8 +2852,7 @@
 

 			context->setUnpackAlignment(param);

 			break;

-

-			case GL_PACK_ALIGNMENT:

+		case GL_PACK_ALIGNMENT:

 			if(param != 1 && param != 2 && param != 4 && param != 8)

 			{

 				return error(GL_INVALID_VALUE);

@@ -2856,8 +2860,7 @@
 

 			context->setPackAlignment(param);

 			break;

-

-			default:

+		default:

 			return error(GL_INVALID_ENUM);

 		}

 	}

@@ -3105,16 +3108,16 @@
 

 	switch(func)

 	{

-		case GL_NEVER:

-		case GL_ALWAYS:

-		case GL_LESS:

-		case GL_LEQUAL:

-		case GL_EQUAL:

-		case GL_GEQUAL:

-		case GL_GREATER:

-		case GL_NOTEQUAL:

+	case GL_NEVER:

+	case GL_ALWAYS:

+	case GL_LESS:

+	case GL_LEQUAL:

+	case GL_EQUAL:

+	case GL_GEQUAL:

+	case GL_GREATER:

+	case GL_NOTEQUAL:

 		break;

-		default:

+	default:

 		return error(GL_INVALID_ENUM);

 	}

 

@@ -3144,46 +3147,46 @@
 

 	switch(fail)

 	{

-		case GL_ZERO:

-		case GL_KEEP:

-		case GL_REPLACE:

-		case GL_INCR:

-		case GL_DECR:

-		case GL_INVERT:

-		case GL_INCR_WRAP_OES:

-		case GL_DECR_WRAP_OES:

+	case GL_ZERO:

+	case GL_KEEP:

+	case GL_REPLACE:

+	case GL_INCR:

+	case GL_DECR:

+	case GL_INVERT:

+	case GL_INCR_WRAP_OES:

+	case GL_DECR_WRAP_OES:

 		break;

-		default:

+	default:

 		return error(GL_INVALID_ENUM);

 	}

 

 	switch(zfail)

 	{

-		case GL_ZERO:

-		case GL_KEEP:

-		case GL_REPLACE:

-		case GL_INCR:

-		case GL_DECR:

-		case GL_INVERT:

-		case GL_INCR_WRAP_OES:

-		case GL_DECR_WRAP_OES:

+	case GL_ZERO:

+	case GL_KEEP:

+	case GL_REPLACE:

+	case GL_INCR:

+	case GL_DECR:

+	case GL_INVERT:

+	case GL_INCR_WRAP_OES:

+	case GL_DECR_WRAP_OES:

 		break;

-		default:

+	default:

 		return error(GL_INVALID_ENUM);

 	}

 

 	switch(zpass)

 	{

-		case GL_ZERO:

-		case GL_KEEP:

-		case GL_REPLACE:

-		case GL_INCR:

-		case GL_DECR:

-		case GL_INVERT:

-		case GL_INCR_WRAP_OES:

-		case GL_DECR_WRAP_OES:

+	case GL_ZERO:

+	case GL_KEEP:

+	case GL_REPLACE:

+	case GL_INCR:

+	case GL_DECR:

+	case GL_INVERT:

+	case GL_INCR_WRAP_OES:

+	case GL_DECR_WRAP_OES:

 		break;

-		default:

+	default:

 		return error(GL_INVALID_ENUM);

 	}

 

@@ -3445,8 +3448,8 @@
 			texture = context->getTexture2D();

 			break;

 		case GL_TEXTURE_EXTERNAL_OES:

-				texture = context->getTextureExternal();

-				break;

+			texture = context->getTextureExternal();

+			break;

 		default:

 			return error(GL_INVALID_ENUM);

 		}

diff --git a/src/OpenGL/libGLES_CM/main.cpp b/src/OpenGL/libGLES_CM/main.cpp
index 858992b..bef7451 100644
--- a/src/OpenGL/libGLES_CM/main.cpp
+++ b/src/OpenGL/libGLES_CM/main.cpp
@@ -45,6 +45,8 @@
 

 	#if defined(_WIN32)

 	const char *libEGL_lib[] = {"libEGL.dll", "libEGL_translator.dll"};

+	#elif defined(__LP64__)

+	const char *libEGL_lib[] = {"lib64EGL_translator.so", "libEGL.so.1", "libEGL.so"};

 	#else

 	const char *libEGL_lib[] = {"libEGL_translator.so", "libEGL.so.1", "libEGL.so"};

 	#endif

@@ -156,4 +158,4 @@
 	egl::Display *(*getCurrentDisplay)() = 0;

 }

 

-void *libEGL = 0;   // Handle to the libEGL module
+void *libEGL = 0;   // Handle to the libEGL module

diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp
index 96728c4..dae58e4 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -507,7 +507,9 @@
 }

 

 void GL_APIENTRY glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)

-{

+{
+	size = static_cast<GLint>(size);   // Work around issues with some 64-bit applications
+

 	TRACE("(GLenum target = 0x%X, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p, GLenum usage = %d)",

 	      target, size, data, usage);

 

@@ -554,7 +556,10 @@
 }

 

 void GL_APIENTRY glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data)

-{

+{
+	size = static_cast<GLint>(size);   // Work around issues with some 64-bit applications
+	offset = static_cast<GLint>(offset);
+

 	TRACE("(GLenum target = 0x%X, GLintptr offset = %d, GLsizeiptr size = %d, const GLvoid* data = 0x%0.8p)",

 	      target, offset, size, data);

 

diff --git a/src/OpenGL/libGLESv2/main.cpp b/src/OpenGL/libGLESv2/main.cpp
index 18e8fcb..e351580 100644
--- a/src/OpenGL/libGLESv2/main.cpp
+++ b/src/OpenGL/libGLESv2/main.cpp
@@ -45,6 +45,8 @@
 

 	#if defined(_WIN32)

 	const char *libEGL_lib[] = {"libEGL.dll", "libEGL_translator.dll"};

+	#elif defined(__LP64__)

+	const char *libEGL_lib[] = {"lib64EGL_translator.so", "libEGL.so.1", "libEGL.so"};

 	#else

 	const char *libEGL_lib[] = {"libEGL_translator.so", "libEGL.so.1", "libEGL.so"};

 	#endif

@@ -55,6 +57,8 @@
 

 	#if defined(_WIN32)

 	const char *libGLES_CM_lib[] = {"libGLES_CM.dll", "libGLES_CM_translator.dll"};

+	#elif defined(__LP64__)

+	const char *libGLES_CM_lib[] = {"lib64GLES_CM_translator.so", "libGLES_CM.so.1", "libGLES_CM.so"};

 	#else

 	const char *libGLES_CM_lib[] = {"libGLES_CM_translator.so", "libGLES_CM.so.1", "libGLES_CM.so"};

 	#endif