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