Port to OSX.
Change-Id: I31fdb6a1e403831feb6040ea756f2c144ac79a5b
Reviewed-on: https://swiftshader-review.googlesource.com/4383
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d5131a4..0e0f152 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,6 @@
-cmake_minimum_required(VERSION 2.8)
+cmake_minimum_required(VERSION 3.0)
-project(SwiftShaders CXX)
+project(SwiftShader C CXX)
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "The type of build: Debug Release RelWithDebInfo." )
@@ -98,6 +98,7 @@
set(OPENGL_COMPILER_DIR ${OPENGL_DIR}/compiler)
set(LLVM_DIR ${SOURCE_DIR}/LLVM)
set(TESTS_DIR ${CMAKE_SOURCE_DIR}/tests)
+set(HELLO2_DIR ${TESTS_DIR}/third_party/PowerVR/Examples/Beginner/01_HelloAPI/OGLES2)
###########################################################
# Compile flags
@@ -170,13 +171,12 @@
###########################################################
# We want the code for all of LLVM except the code for non-X86 targets
-file(GLOB_RECURSE LLVM_LIST ${LLVM_DIR}/lib/*.cpp)
-file(GLOB_RECURSE LLVM_ALL_TARGET_LIST ${LLVM_DIR}/lib/Target/*.cpp)
-file(GLOB_RECURSE LLVM_X86_TARGET_LIST ${LLVM_DIR}/lib/Target/X86/*.cpp)
+file(GLOB_RECURSE LLVM_LIST ${LLVM_DIR}/lib/*.cpp ${LLVM_DIR}/lib/*.c)
+file(GLOB_RECURSE LLVM_ALL_TARGET_LIST ${LLVM_DIR}/lib/Target/*.cpp ${LLVM_DIR}/lib/Target/*.c)
+file(GLOB_RECURSE LLVM_X86_TARGET_LIST ${LLVM_DIR}/lib/Target/X86/*.cpp ${LLVM_DIR}/lib/Target/X86/*.c)
list(REMOVE_ITEM LLVM_LIST ${LLVM_ALL_TARGET_LIST})
list(APPEND LLVM_LIST ${LLVM_X86_TARGET_LIST})
-list(REMOVE_ITEM LLVM_LIST "${LLVM_DIR}/lib/Target/X86/X86MCInstLower.cpp")
list(APPEND LLVM_LIST
${LLVM_DIR}/lib/Target/Mangler.cpp
${LLVM_DIR}/lib/Target/TargetData.cpp
@@ -200,10 +200,11 @@
${LLVM_DIR}/include
${LLVM_DIR}/lib/Target/X86
)
-add_library(llvm STATIC ${LLVM_LIST})
+add_library(llvm SHARED ${LLVM_LIST})
set_target_properties(llvm PROPERTIES
POSITION_INDEPENDENT_CODE 1
INCLUDE_DIRECTORIES "${LLVM_INCLUDE_DIR}"
+ COMPILE_DEFINITIONS "__STDC_CONSTANT_MACROS;__STDC_LIMIT_MACROS"
FOLDER "LLVM"
)
@@ -218,11 +219,11 @@
${SOURCE_DIR}/Reactor
${SOURCE_DIR}/Renderer
${SOURCE_DIR}/Shader
+ ${OPENGL_DIR}/include
${LLVM_INCLUDE_DIR}
)
set(OPENGL_INCLUDE_DIR
${OPENGL_DIR}
- ${OPENGL_DIR}/include
${COMMON_INCLUDE_DIR}
)
@@ -359,6 +360,10 @@
${SOURCE_DIR}/Main/FrameBufferOSX.mm
${SOURCE_DIR}/Main/FrameBufferOSX.hpp
)
+ list(APPEND EGL_LIST
+ ${OPENGL_DIR}/libEGL/OSXUtils.mm
+ ${OPENGL_DIR}/libEGL/OSXUtils.hpp
+ )
list(APPEND OPENGL_COMPILER_LIST
${OPENGL_COMPILER_DIR}/ossource_posix.cpp
)
@@ -368,6 +373,10 @@
set(OS_LIBS odbc32 odbccp32 WS2_32 dxguid)
elseif(LINUX)
set(OS_LIBS dl X11 Xext pthread)
+elseif(APPLE)
+ find_library(COCOA_FRAMEWORK Cocoa)
+ find_library(QUARTZ_FRAMEWORK Quartz)
+ set(OS_LIBS "${COCOA_FRAMEWORK}" "${QUARTZ_FRAMEWORK}")
endif()
###########################################################
@@ -458,7 +467,21 @@
# Extra programs
###########################################################
-if (LINUX)
- add_executable(OGLES2HelloAPI tests/third_party/PowerVR/Examples/Beginner/01_HelloAPI/OGLES2/OGLES2HelloAPI_LinuxX11.cpp)
+if(LINUX)
+ add_executable(OGLES2HelloAPI HELLO2_DIR/OGLES2HelloAPI_LinuxX11.cpp)
target_link_libraries(OGLES2HelloAPI dl X11 EGL GLESv2)
+elseif(APPLE)
+ add_executable(OGLES2HelloAPI MACOSX_BUNDLE
+ ${HELLO2_DIR}/OGLES2HelloAPI_OSX.mm
+ ${HELLO2_DIR}/Build/OSX/en.lproj/MainMenu.xib
+ )
+ set_target_properties(OGLES2HelloAPI PROPERTIES
+ INCLUDE_DIRECTORIES "${OPENGL_DIR}/include"
+ COMPILE_DEFINITIONS "GL_GLEXT_PROTOTYPES"
+ MACOSX_BUNDLE_INFO_PLIST "${HELLO2_DIR}/Build/OSX/Info.plist"
+ )
+ target_link_libraries(OGLES2HelloAPI libEGL libGLESv2 ${OS_LIBS})
+ set_source_files_properties(${HELLO2_DIR}/Build/OSX/en.lproj/MainMenu.xib PROPERTIES
+ MACOSX_PACKAGE_LOCATION "Resources"
+ )
endif()
diff --git a/src/Main/FrameBufferOSX.hpp b/src/Main/FrameBufferOSX.hpp
index bbd8493..41a6348 100644
--- a/src/Main/FrameBufferOSX.hpp
+++ b/src/Main/FrameBufferOSX.hpp
@@ -3,6 +3,8 @@
#include "Main/FrameBuffer.hpp"
+#import <Cocoa/Cocoa.h>
+
@class CALayer;
namespace sw
@@ -10,15 +12,23 @@
class FrameBufferOSX : public FrameBuffer
{
public:
- FrameBufferOSX(CALayer *window, int width, int height) : FrameBuffer(width, height, false, false) {};
-
- ~FrameBufferOSX() override {};
+ FrameBufferOSX(CALayer *layer, int width, int height);
+ ~FrameBufferOSX() override;
void flip(void *source, Format sourceFormat, size_t sourceStride) override;
- void blit(void *source, const Rect *sourceRect, const Rect *destRect, Format sourceFormat, size_t sourceStride) override {};
+ void blit(void *source, const Rect *sourceRect, const Rect *destRect, Format sourceFormat, size_t sourceStride) override;
- void *lock() override {return nullptr;};
- void unlock() override {};
+ void *lock() override;
+ void unlock() override;
+
+ private:
+ int width;
+ int height;
+ CALayer *layer;
+ uint8_t *buffer;
+ CGDataProviderRef provider;
+ CGColorSpaceRef colorspace;
+ CGImageRef currentImage;
};
}
diff --git a/src/Main/FrameBufferOSX.mm b/src/Main/FrameBufferOSX.mm
index 0ed083c..40827cc 100644
--- a/src/Main/FrameBufferOSX.mm
+++ b/src/Main/FrameBufferOSX.mm
@@ -1,14 +1,89 @@
#include "FrameBufferOSX.hpp"
-namespace sw
-{
+#include "Common/Debug.hpp"
+
+#include <EGL/egl.h>
+#import <QuartzCore/QuartzCore.h>
+
+namespace sw {
+
+ FrameBufferOSX::FrameBufferOSX(CALayer* layer, int width, int height)
+ : FrameBuffer(width, height, false, false), width(width), height(height),
+ layer(layer), buffer(nullptr), provider(nullptr), currentImage(nullptr)
+ {
+ destFormat = sw::FORMAT_X8B8G8R8;
+ int bufferSize = width * height * 4 * sizeof(uint8_t);
+ buffer = new uint8_t[bufferSize];
+ provider = CGDataProviderCreateWithData(nullptr, buffer, bufferSize, nullptr);
+ colorspace = CGColorSpaceCreateDeviceRGB();
+ }
+
+ FrameBufferOSX::~FrameBufferOSX()
+ {
+ //[CATransaction begin];
+ //[layer setContents:nullptr];
+ //[CATransaction commit];
+
+ CGImageRelease(currentImage);
+ CGColorSpaceRelease(colorspace);
+ CGDataProviderRelease(provider);
+
+ delete[] buffer;
+ }
+
void FrameBufferOSX::flip(void *source, Format sourceFormat, size_t sourceStride)
{
- blit(source, 0, 0, sourceFormat, sourceStride);
+ blit(source, nullptr, nullptr, sourceFormat, sourceStride);
}
+
+ void FrameBufferOSX::blit(void *source, const Rect *sourceRect, const Rect *destRect, Format sourceFormat, size_t sourceStride)
+ {
+ copy(source, sourceFormat, sourceStride);
+
+ int bytesPerRow = width * 4 * sizeof(uint8_t);
+ CGImageRef image = CGImageCreate(width, height, 8, 32, bytesPerRow, colorspace, kCGBitmapByteOrder32Big, provider, nullptr, false, kCGRenderingIntentDefault);
+
+ [CATransaction begin];
+ [layer setContents:(id)image];
+ [CATransaction commit];
+ [CATransaction flush];
+
+ if(currentImage)
+ {
+ CGImageRelease(currentImage);
+ }
+ currentImage = image;
+ }
+
+ void *FrameBufferOSX::lock()
+ {
+ stride = width * 4 * sizeof(uint8_t);
+ locked = buffer;
+ return locked;
+ };
+
+ void FrameBufferOSX::unlock()
+ {
+ locked = nullptr;
+ };
}
-sw::FrameBuffer *createFrameBuffer(void *display, CALayer *layer, int width, int height)
+sw::FrameBuffer *createFrameBuffer(void *display, EGLNativeWindowType nativeWindow, int width, int height)
{
+ NSObject *window = reinterpret_cast<NSObject*>(nativeWindow);
+ CALayer *layer = nullptr;
+
+ if([window isKindOfClass:[NSView class]])
+ {
+ NSView *view = reinterpret_cast<NSView*>(window);
+ [view setWantsLayer:YES];
+ layer = [view layer];
+ }
+ else if([window isKindOfClass:[CALayer class]])
+ {
+ layer = reinterpret_cast<CALayer*>(window);
+ }
+ else ASSERT(0);
+
return new sw::FrameBufferOSX(layer, width, height);
}
diff --git a/src/OpenGL/libEGL/Display.cpp b/src/OpenGL/libEGL/Display.cpp
index 4c1c7e2..3b2dbbc 100644
--- a/src/OpenGL/libEGL/Display.cpp
+++ b/src/OpenGL/libEGL/Display.cpp
@@ -32,6 +32,10 @@
#include <fcntl.h>
#endif
+#if defined(__APPLE__)
+#include "OSXUtils.hpp"
+#endif
+
#include <algorithm>
#include <vector>
#include <map>
@@ -553,7 +557,7 @@
return status == True;
}
#elif defined(__APPLE__)
- return true;
+ return sw::OSX::IsValidWindow(window);
#else
#error "Display::isValidWindow unimplemented for this platform"
#endif
@@ -688,7 +692,7 @@
}
else UNREACHABLE(platform);
#elif defined(__APPLE__)
- return sw::FORMAT_X8R8G8B8;
+ return sw::FORMAT_A8B8G8R8;
#else
#error "Display::isValidWindow unimplemented for this platform"
#endif
diff --git a/src/OpenGL/libEGL/OSXUtils.hpp b/src/OpenGL/libEGL/OSXUtils.hpp
new file mode 100644
index 0000000..26f703a
--- /dev/null
+++ b/src/OpenGL/libEGL/OSXUtils.hpp
@@ -0,0 +1,15 @@
+#ifndef sw_OSXUtils_hpp
+#define sw_OSXUtils_hpp
+
+#include <EGL/egl.h>
+
+namespace sw
+{
+namespace OSX
+{
+ bool IsValidWindow(EGLNativeWindowType window);
+ void GetNativeWindowSize(EGLNativeWindowType window, int &width, int &height);
+}
+}
+
+#endif // sw_OSXUtils_hpp
diff --git a/src/OpenGL/libEGL/OSXUtils.mm b/src/OpenGL/libEGL/OSXUtils.mm
new file mode 100644
index 0000000..93bc683
--- /dev/null
+++ b/src/OpenGL/libEGL/OSXUtils.mm
@@ -0,0 +1,36 @@
+#include "OSXUtils.hpp"
+
+#include "common/debug.h"
+
+#import <Cocoa/Cocoa.h>
+
+namespace sw
+{
+namespace OSX
+{
+ bool IsValidWindow(EGLNativeWindowType window)
+ {
+ NSObject *object = reinterpret_cast<NSObject*>(window);
+ return window && ([object isKindOfClass:[NSView class]] || [object isKindOfClass:[CALayer class]]);
+ }
+
+ void GetNativeWindowSize(EGLNativeWindowType window, int &width, int &height)
+ {
+ NSObject *object = reinterpret_cast<NSObject*>(window);
+
+ if([object isKindOfClass:[NSView class]])
+ {
+ NSView *view = reinterpret_cast<NSView*>(object);
+ width = [view bounds].size.width;
+ height = [view bounds].size.height;
+ }
+ else if([object isKindOfClass:[CALayer class]])
+ {
+ CALayer *layer = reinterpret_cast<CALayer*>(object);
+ width = CGRectGetWidth([layer frame]);
+ height = CGRectGetHeight([layer frame]);
+ }
+ else UNREACHABLE(0);
+ }
+}
+}
diff --git a/src/OpenGL/libEGL/Surface.cpp b/src/OpenGL/libEGL/Surface.cpp
index b6599da..48a28e2 100644
--- a/src/OpenGL/libEGL/Surface.cpp
+++ b/src/OpenGL/libEGL/Surface.cpp
@@ -31,6 +31,10 @@
#include <tchar.h>
#endif
+#if defined(__APPLE__)
+#include "OSXUtils.hpp"
+#endif
+
#include <algorithm>
namespace egl
@@ -250,7 +254,11 @@
return reset(windowAttributes.width, windowAttributes.height);
#elif defined(__APPLE__)
- return true;
+ int width;
+ int height;
+ sw::OSX::GetNativeWindowSize(window, width, height);
+
+ return reset(width, height);
#else
#error "WindowSurface::initialize unimplemented for this platform"
#endif
@@ -295,8 +303,9 @@
int clientWidth = windowAttributes.width;
int clientHeight = windowAttributes.height;
#elif defined(__APPLE__)
- int clientWidth = 0;
- int clientHeight = 0;
+ int clientWidth;
+ int clientHeight;
+ sw::OSX::GetNativeWindowSize(window, clientWidth, clientHeight);
return true;
#else
#error "WindowSurface::checkForResize unimplemented for this platform"
diff --git a/src/OpenGL/libEGL/libEGL.hpp b/src/OpenGL/libEGL/libEGL.hpp
index 8c0d949..69b020c 100644
--- a/src/OpenGL/libEGL/libEGL.hpp
+++ b/src/OpenGL/libEGL/libEGL.hpp
@@ -82,17 +82,31 @@
if(!libEGL)
{
#if defined(_WIN32)
- const char *libEGL_lib[] = {"libEGL.dll", "libEGL_translator.dll"};
+ #if defined(__LP64__)
+ const char *libEGL_lib[] = {"libEGL.dll", "lib64EGL_translator.dll"};
+ #else
+ const char *libEGL_lib[] = {"libEGL.dll", "libEGL_translator.dll"};
+ #endif
#elif defined(__ANDROID__)
- #if defined(__LP64__)
- const char *libEGL_lib[] = {"/vendor/lib64/egl/libEGL_swiftshader.so"};
+ #if defined(__LP64__)
+ const char *libEGL_lib[] = {"/vendor/lib64/egl/libEGL_swiftshader.so"};
+ #else
+ const char *libEGL_lib[] = {"/vendor/lib/egl/libEGL_swiftshader.so"};
+ #endif
+ #elif defined(__linux__)
+ #if 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
+ #elif defined(__APPLE__)
+ #if defined(__LP64__)
+ const char *libEGL_lib[] = {"lib64EGL_translator.dylib", "libEGL.so", "libEGL.dylib"};
+ #else
+ const char *libEGL_lib[] = {"libEGL_translator.dylib", "libEGL.so", "libEGL.dylib"};
+ #endif
#else
- const char *libEGL_lib[] = {"/vendor/lib/egl/libEGL_swiftshader.so"};
- #endif
- #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"};
+ #error "libEGL::loadExports unimplemented for this platform"
#endif
libEGL = loadLibrary(libEGL_lib, "libEGL_swiftshader");
diff --git a/src/OpenGL/libGLES_CM/libGLES_CM.hpp b/src/OpenGL/libGLES_CM/libGLES_CM.hpp
index d4b4d75..f2718d7 100644
--- a/src/OpenGL/libGLES_CM/libGLES_CM.hpp
+++ b/src/OpenGL/libGLES_CM/libGLES_CM.hpp
@@ -241,17 +241,31 @@
if(!libGLES_CM)
{
#if defined(_WIN32)
- const char *libGLES_CM_lib[] = {"libGLES_CM.dll", "libGLES_CM_translator.dll"};
+ #if defined(__LP64__)
+ const char *libGLES_CM_lib[] = {"libGLES_CM.dll", "libGLES_CM_translator.dll"};
+ #else
+ const char *libGLES_CM_lib[] = {"libGLES_CM.dll", "lib64GLES_CM_translator.dll"};
+ #endif
#elif defined(__ANDROID__)
- #if defined(__LP64__)
- const char *libGLES_CM_lib[] = {"/vendor/lib64/egl/libGLESv1_CM_swiftshader.so"};
+ #if defined(__LP64__)
+ const char *libGLES_CM_lib[] = {"/vendor/lib64/egl/libGLESv1_CM_swiftshader.so"};
+ #else
+ const char *libGLES_CM_lib[] = {"/vendor/lib/egl/libGLESv1_CM_swiftshader.so"};
+ #endif
+ #elif defined(__linux__)
+ #if 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
+ #elif defined(__APPLE__)
+ #if defined(__LP64__)
+ const char *libGLES_CM_lib[] = {"lib64GLES_CM_translator.dylib", "libGLES_CM.dylib"};
+ #else
+ const char *libGLES_CM_lib[] = {"libGLES_CM_translator.dylib", "libGLES_CM.dylib"};
+ #endif
#else
- const char *libGLES_CM_lib[] = {"/vendor/lib/egl/libGLESv1_CM_swiftshader.so"};
- #endif
- #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"};
+ #error "libGLES_CM::loadExports unimplemented for this platform"
#endif
libGLES_CM = loadLibrary(libGLES_CM_lib, "libGLES_CM_swiftshader");
diff --git a/src/OpenGL/libGLESv2/libGLESv2.hpp b/src/OpenGL/libGLESv2/libGLESv2.hpp
index afb7224..a741329 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.hpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.hpp
@@ -209,20 +209,20 @@
void (*glFramebufferTexture3DOES)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
void (*glEGLImageTargetTexture2DOES)(GLenum target, GLeglImageOES image);
void (*glEGLImageTargetRenderbufferStorageOES)(GLenum target, GLeglImageOES image);
- GLboolean (*glIsRenderbufferOES)(GLuint renderbuffer);
- void (*glBindRenderbufferOES)(GLenum target, GLuint renderbuffer);
- void (*glDeleteRenderbuffersOES)(GLsizei n, const GLuint* renderbuffers);
- void (*glGenRenderbuffersOES)(GLsizei n, GLuint* renderbuffers);
- void (*glRenderbufferStorageOES)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
- void (*glGetRenderbufferParameterivOES)(GLenum target, GLenum pname, GLint* params);
- GLboolean (*glIsFramebufferOES)(GLuint framebuffer);
- void (*glBindFramebufferOES)(GLenum target, GLuint framebuffer);
- void (*glDeleteFramebuffersOES)(GLsizei n, const GLuint* framebuffers);
- void (*glGenFramebuffersOES)(GLsizei n, GLuint* framebuffers);
- GLenum (*glCheckFramebufferStatusOES)(GLenum target);
- void (*glFramebufferRenderbufferOES)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
- void (*glFramebufferTexture2DOES)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
- void (*glGetFramebufferAttachmentParameterivOES)(GLenum target, GLenum attachment, GLenum pname, GLint* params);
+ GLboolean (*glIsRenderbufferOES)(GLuint renderbuffer);
+ void (*glBindRenderbufferOES)(GLenum target, GLuint renderbuffer);
+ void (*glDeleteRenderbuffersOES)(GLsizei n, const GLuint* renderbuffers);
+ void (*glGenRenderbuffersOES)(GLsizei n, GLuint* renderbuffers);
+ void (*glRenderbufferStorageOES)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+ void (*glGetRenderbufferParameterivOES)(GLenum target, GLenum pname, GLint* params);
+ GLboolean (*glIsFramebufferOES)(GLuint framebuffer);
+ void (*glBindFramebufferOES)(GLenum target, GLuint framebuffer);
+ void (*glDeleteFramebuffersOES)(GLsizei n, const GLuint* framebuffers);
+ void (*glGenFramebuffersOES)(GLsizei n, GLuint* framebuffers);
+ GLenum (*glCheckFramebufferStatusOES)(GLenum target);
+ void (*glFramebufferRenderbufferOES)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+ void (*glFramebufferTexture2DOES)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+ void (*glGetFramebufferAttachmentParameterivOES)(GLenum target, GLenum attachment, GLenum pname, GLint* params);
void (*glGenerateMipmapOES)(GLenum target);
egl::Context *(*es2CreateContext)(const egl::Config *config, const egl::Context *shareContext, int clientVersion);
@@ -262,17 +262,31 @@
if(!libGLESv2)
{
#if defined(_WIN32)
- const char *libGLESv2_lib[] = {"libGLESv2.dll", "libGLES_V2_translator.dll"};
+ #if defined(__LP64__)
+ const char *libGLESv2_lib[] = {"libGLESv2.dll", "lib64GLES_V2_translator.dll"};
+ #else
+ const char *libGLESv2_lib[] = {"libGLESv2.dll", "libGLES_V2_translator.dll"};
+ #endif
#elif defined(__ANDROID__)
- #if defined(__LP64__)
- const char *libGLESv2_lib[] = {"/vendor/lib64/egl/libGLESv2_swiftshader.so"};
+ #if defined(__LP64__)
+ const char *libGLESv2_lib[] = {"/vendor/lib64/egl/libGLESv2_swiftshader.so"};
+ #else
+ const char *libGLESv2_lib[] = {"/vendor/lib/egl/libGLESv2_swiftshader.so"};
+ #endif
+ #elif defined(__linux__)
+ #if 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
+ #elif defined(__APPLE__)
+ #if defined(__LP64__)
+ const char *libGLESv2_lib[] = {"lib64GLES_V2_translator.dylib", "libGLESv2.dylib"};
+ #else
+ const char *libGLESv2_lib[] = {"libGLES_V2_translator.dylib", "libGLESv2.dylib"};
+ #endif
#else
- const char *libGLESv2_lib[] = {"/vendor/lib/egl/libGLESv2_swiftshader.so"};
- #endif
- #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"};
+ #error "libGLESv2::loadExports unimplemented for this platform"
#endif
libGLESv2 = loadLibrary(libGLESv2_lib, "libGLESv2_swiftshader");