Commit a230805e by Nicolas Capens

Access library dependencies through a single object.

Bug 18752589 Change-Id: I93155cead50b30faa876023f9ed00f60b7c9e34e Reviewed-on: https://swiftshader-review.googlesource.com/2831Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarGreg Hartman <ghartman@google.com> Tested-by: 's avatarGreg Hartman <ghartman@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com> Tested-by: 's avatarNicolas Capens <capn@google.com>
parent 18ad5106
......@@ -9,6 +9,9 @@
// or implied, including but not limited to any patent rights, are granted to you.
//
#ifndef SharedLibrary_hpp
#define SharedLibrary_hpp
#if defined(_WIN32)
#include <Windows.h>
#else
......@@ -102,3 +105,5 @@ void *loadLibrary(const char *(&names)[n])
return library ? dlsym(library, name) : 0;
}
#endif
#endif // SharedLibrary_hpp
......@@ -96,10 +96,7 @@ namespace sw
}
}
extern "C"
sw::FrameBuffer *createFrameBuffer(void *display, ANativeWindow* window, int width, int height)
{
sw::FrameBuffer *createFrameBuffer(void *display, void* window, int width, int height)
{
return new sw::FrameBufferAndroid((ANativeWindow*)window, width, height);
}
return new sw::FrameBufferAndroid(window, width, height);
}
......@@ -52,27 +52,24 @@ namespace sw
#include "FrameBufferGDI.hpp"
#include "Common/Configurator.hpp"
extern "C"
sw::FrameBufferWin *createFrameBufferWin(HWND windowHandle, int width, int height, bool fullscreen, bool topLeftOrigin)
{
sw::FrameBufferWin *createFrameBufferWin(HWND windowHandle, int width, int height, bool fullscreen, bool topLeftOrigin)
{
sw::Configurator ini("SwiftShader.ini");
int api = ini.getInteger("Testing", "FrameBufferAPI", 0);
if(api == 0 && topLeftOrigin)
{
return new sw::FrameBufferDD(windowHandle, width, height, fullscreen, topLeftOrigin);
}
else
{
return new sw::FrameBufferGDI(windowHandle, width, height, fullscreen, topLeftOrigin);
}
sw::Configurator ini("SwiftShader.ini");
int api = ini.getInteger("Testing", "FrameBufferAPI", 0);
return 0;
if(api == 0 && topLeftOrigin)
{
return new sw::FrameBufferDD(windowHandle, width, height, fullscreen, topLeftOrigin);
}
sw::FrameBuffer *createFrameBuffer(HDC display, HWND window, int width, int height)
else
{
return createFrameBufferWin(window, width, height, false, false);
return new sw::FrameBufferGDI(windowHandle, width, height, fullscreen, topLeftOrigin);
}
return 0;
}
sw::FrameBuffer *createFrameBuffer(HDC display, HWND window, int width, int height)
{
return createFrameBufferWin(window, width, height, false, false);
}
......@@ -54,9 +54,4 @@ namespace sw
};
}
extern "C"
{
sw::FrameBufferWin *createFrameBufferWin(HWND windowHandle, int width, int height, bool fullscreen, bool topLeftOrigin);
}
#endif // sw_FrameBufferWin_hpp
......@@ -144,10 +144,7 @@ namespace sw
}
}
extern "C"
sw::FrameBuffer *createFrameBuffer(Display *display, Window window, int width, int height)
{
sw::FrameBuffer *createFrameBuffer(void *display, Window window, int width, int height)
{
return new sw::FrameBufferX11((Display*)display, window, width, height);
}
return new sw::FrameBufferX11(display, window, width, height);
}
......@@ -20,7 +20,7 @@ public:
virtual void bindTexImage(Surface *surface) = 0;
virtual EGLenum validateSharedImage(EGLenum target, GLuint name, GLuint textureLevel) = 0;
virtual Image *createSharedImage(EGLenum target, GLuint name, GLuint textureLevel) = 0;
virtual int getClientVersion() = 0;
virtual int getClientVersion() const = 0;
protected:
virtual ~Context() {};
......
......@@ -420,17 +420,17 @@ EGLContext Display::createContext(EGLConfig configHandle, const egl::Context *sh
if(clientVersion == 1 && config->mRenderableType & EGL_OPENGL_ES_BIT)
{
if(es1::createContext != 0)
if(libGLES_CM)
{
context = es1::createContext(config, shareContext);
context = libGLES_CM->es1CreateContext(config, shareContext);
}
}
else if((clientVersion == 2 && config->mRenderableType & EGL_OPENGL_ES2_BIT) ||
(clientVersion == 3 && config->mRenderableType & EGL_OPENGL_ES3_BIT))
{
if(es2::createContext != 0)
if(libGLESv2)
{
context = es2::createContext(config, shareContext, clientVersion);
context = libGLESv2->es2CreateContext(config, shareContext, clientVersion);
}
}
else
......
......@@ -137,8 +137,15 @@ bool Surface::reset(int backBufferWidth, int backBufferHeight)
deleteResources();
if(mWindow)
{
frameBuffer = es::createFrameBuffer(mDisplay->getNativeDisplay(), mWindow, backBufferWidth, backBufferHeight);
{
if(libGLES_CM)
{
frameBuffer = libGLES_CM->createFrameBuffer(mDisplay->getNativeDisplay(), mWindow, backBufferWidth, backBufferHeight);
}
else if(libGLESv2)
{
frameBuffer = libGLESv2->createFrameBuffer(mDisplay->getNativeDisplay(), mWindow, backBufferWidth, backBufferHeight);
}
if(!frameBuffer)
{
......@@ -147,8 +154,15 @@ bool Surface::reset(int backBufferWidth, int backBufferHeight)
return error(EGL_BAD_ALLOC, false);
}
}
backBuffer = es::createBackBuffer(backBufferWidth, backBufferHeight, mConfig);
if(libGLES_CM)
{
backBuffer = libGLES_CM->createBackBuffer(backBufferWidth, backBufferHeight, mConfig);
}
else if(libGLESv2)
{
backBuffer = libGLESv2->createBackBuffer(backBufferWidth, backBufferHeight, mConfig);
}
if(!backBuffer)
{
......@@ -158,8 +172,16 @@ bool Surface::reset(int backBufferWidth, int backBufferHeight)
}
if(mConfig->mDepthStencilFormat != sw::FORMAT_NULL)
{
mDepthStencil = es::createDepthStencil(backBufferWidth, backBufferHeight, mConfig->mDepthStencilFormat, 1, false);
{
if(libGLES_CM)
{
mDepthStencil = libGLES_CM->createDepthStencil(backBufferWidth, backBufferHeight, mConfig->mDepthStencilFormat, 1, false);
}
else if(libGLESv2)
{
mDepthStencil = libGLESv2->createDepthStencil(backBufferWidth, backBufferHeight, mConfig->mDepthStencilFormat, 1, false);
}
if(!mDepthStencil)
{
......
......@@ -42,9 +42,7 @@ global:
eglCreatePlatformWindowSurfaceEXT;
eglCreatePlatformPixmapSurfaceEXT;
# Functions that don't change the error code, for use by client APIs
clientGetCurrentContext;
clientGetCurrentDisplay;
libEGLexports;
local:
*;
......
......@@ -126,6 +126,7 @@
<Unit filename="Surface.h" />
<Unit filename="exports.map" />
<Unit filename="libEGL.cpp" />
<Unit filename="libEGL.hpp" />
<Unit filename="main.cpp" />
<Unit filename="main.h" />
<Extensions>
......
......@@ -26,6 +26,8 @@
#include <string.h>
using namespace egl;
static bool validateDisplay(egl::Display *display)
{
if(display == EGL_NO_DISPLAY)
......@@ -630,13 +632,19 @@ EGLContext EGLAPIENTRY eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLCon
}
egl::Display *display = static_cast<egl::Display*>(dpy);
egl::Context *shareContext = static_cast<egl::Context*>(share_context);
if(!validateConfig(display, config))
{
return EGL_NO_CONTEXT;
}
return display->createContext(config, static_cast<egl::Context*>(share_context), clientVersion);
if(shareContext && shareContext->getClientVersion() != clientVersion)
{
return error(EGL_BAD_CONTEXT, EGL_NO_CONTEXT);
}
return display->createContext(config, shareContext, clientVersion);
}
EGLBoolean EGLAPIENTRY eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
......@@ -977,15 +985,15 @@ __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress(const cha
}
}
if(es2::getProcAddress != 0)
if(libGLESv2)
{
__eglMustCastToProperFunctionPointerType proc = es2::getProcAddress(procname);
__eglMustCastToProperFunctionPointerType proc = libGLESv2->es2GetProcAddress(procname);
if(proc) return proc;
}
if(es1::getProcAddress != 0)
if(libGLES_CM)
{
__eglMustCastToProperFunctionPointerType proc = es1::getProcAddress(procname);
__eglMustCastToProperFunctionPointerType proc = libGLES_CM->es1GetProcAddress(procname);
if(proc) return proc;
}
......
......@@ -42,6 +42,4 @@ EXPORTS
eglCreatePlatformWindowSurfaceEXT
eglCreatePlatformPixmapSurfaceEXT
; Functions that don't change the error code, for use by client APIs
clientGetCurrentContext
clientGetCurrentDisplay
\ No newline at end of file
libEGLexports
\ No newline at end of file
#ifndef libEGL_hpp
#define libEGL_hpp
#define EGLAPI
#include <EGL/egl.h>
#define EGL_EGLEXT_PROTOTYPES
#include <EGL/eglext.h>
#include "Common/SharedLibrary.hpp"
class LibEGLexports
{
public:
LibEGLexports();
EGLint (EGLAPIENTRY *eglGetError)(void);
EGLDisplay (EGLAPIENTRY *eglGetDisplay)(EGLNativeDisplayType display_id);
EGLBoolean (EGLAPIENTRY *eglInitialize)(EGLDisplay dpy, EGLint *major, EGLint *minor);
EGLBoolean (EGLAPIENTRY *eglTerminate)(EGLDisplay dpy);
const char *(EGLAPIENTRY *eglQueryString)(EGLDisplay dpy, EGLint name);
EGLBoolean (EGLAPIENTRY *eglGetConfigs)(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);
EGLBoolean (EGLAPIENTRY *eglChooseConfig)(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);
EGLBoolean (EGLAPIENTRY *eglGetConfigAttrib)(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value);
EGLSurface (EGLAPIENTRY *eglCreateWindowSurface)(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType window, const EGLint *attrib_list);
EGLSurface (EGLAPIENTRY *eglCreatePbufferSurface)(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list);
EGLSurface (EGLAPIENTRY *eglCreatePixmapSurface)(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list);
EGLBoolean (EGLAPIENTRY *eglDestroySurface)(EGLDisplay dpy, EGLSurface surface);
EGLBoolean (EGLAPIENTRY *eglQuerySurface)(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value);
EGLBoolean (EGLAPIENTRY *eglBindAPI)(EGLenum api);
EGLenum (EGLAPIENTRY *eglQueryAPI)(void);
EGLBoolean (EGLAPIENTRY *eglWaitClient)(void);
EGLBoolean (EGLAPIENTRY *eglReleaseThread)(void);
EGLSurface (EGLAPIENTRY *eglCreatePbufferFromClientBuffer)(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list);
EGLBoolean (EGLAPIENTRY *eglSurfaceAttrib)(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value);
EGLBoolean (EGLAPIENTRY *eglBindTexImage)(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
EGLBoolean (EGLAPIENTRY *eglReleaseTexImage)(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
EGLBoolean (EGLAPIENTRY *eglSwapInterval)(EGLDisplay dpy, EGLint interval);
EGLContext (EGLAPIENTRY *eglCreateContext)(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list);
EGLBoolean (EGLAPIENTRY *eglDestroyContext)(EGLDisplay dpy, EGLContext ctx);
EGLBoolean (EGLAPIENTRY *eglMakeCurrent)(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
EGLContext (EGLAPIENTRY *eglGetCurrentContext)(void);
EGLSurface (EGLAPIENTRY *eglGetCurrentSurface)(EGLint readdraw);
EGLDisplay (EGLAPIENTRY *eglGetCurrentDisplay)(void);
EGLBoolean (EGLAPIENTRY *eglQueryContext)(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value);
EGLBoolean (EGLAPIENTRY *eglWaitGL)(void);
EGLBoolean (EGLAPIENTRY *eglWaitNative)(EGLint engine);
EGLBoolean (EGLAPIENTRY *eglSwapBuffers)(EGLDisplay dpy, EGLSurface surface);
EGLBoolean (EGLAPIENTRY *eglCopyBuffers)(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target);
EGLImageKHR (EGLAPIENTRY *eglCreateImageKHR)(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);
EGLBoolean (EGLAPIENTRY *eglDestroyImageKHR)(EGLDisplay dpy, EGLImageKHR image);
__eglMustCastToProperFunctionPointerType (EGLAPIENTRY *eglGetProcAddress)(const char*);
// Functions that don't change the error code, for use by client APIs
egl::Context *(*clientGetCurrentContext)();
egl::Display *(*clientGetCurrentDisplay)();
};
class LibEGL
{
public:
LibEGL()
{
libEGL = nullptr;
libEGLexports = nullptr;
}
~LibEGL()
{
freeLibrary(libEGL);
}
LibEGLexports *operator->()
{
return loadExports();
}
private:
LibEGLexports *loadExports()
{
if(!libEGL)
{
#if defined(_WIN32)
const char *libEGL_lib[] = {"libEGL.dll", "libEGL_translator.dll"};
#elif defined(__ANDROID__)
const char *libEGL_lib[] = {"/vendor/lib/egl/libEGL_swiftshader.so"};
#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
libEGL = loadLibrary(libEGL_lib);
if(libEGL)
{
auto libEGLexportsProc = (LibEGLexports *(*)())getProcAddress(libEGL, "libEGLexports");
libEGLexports = libEGLexportsProc();
}
}
return libEGLexports;
}
void *libEGL;
LibEGLexports *libEGLexports;
};
#endif // libEGL_hpp
......@@ -312,6 +312,7 @@ copy "$(OutDir)libEGL.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)_$(Platfor
<ClInclude Include="Context.hpp" />
<ClInclude Include="Display.h" />
<ClInclude Include="Image.hpp" />
<ClInclude Include="libEGL.hpp" />
<ClInclude Include="main.h" />
<ClInclude Include="resource.h" />
<ClInclude Include="Surface.h" />
......
......@@ -73,6 +73,9 @@
<ClInclude Include="..\common\Object.hpp">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="libEGL.hpp">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="libEGL.rc" />
......
......@@ -13,6 +13,7 @@
#include "main.h"
#include "libEGL.hpp"
#include "Context.hpp"
#include "Surface.h"
......@@ -21,6 +22,9 @@
#include "Common/SharedLibrary.hpp"
#include "common/debug.h"
#define EGL_EGLEXT_PROTOTYPES
#include <EGL/eglext.h>
static sw::Thread::LocalStorageKey currentTLS = TLS_OUT_OF_INDEXES;
#if !defined(_MSC_VER)
......@@ -62,7 +66,7 @@ static void eglDetachThread()
}
}
CONSTRUCTOR static bool eglAttachProcess()
CONSTRUCTOR static void eglAttachProcess()
{
TRACE("()");
......@@ -81,51 +85,10 @@ CONSTRUCTOR static bool eglAttachProcess()
if(currentTLS == TLS_OUT_OF_INDEXES)
{
return false;
return;
}
eglAttachThread();
#if defined(_WIN32)
const char *libGLES_CM_lib[] = {"libGLES_CM.dll", "libGLES_CM_translator.dll"};
#elif defined(__ANDROID__)
const char *libGLES_CM_lib[] = {"/vendor/lib/egl/libGLESv1_CM_swiftshader.so"};
#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
libGLES_CM = loadLibrary(libGLES_CM_lib);
es1::createContext = (egl::Context *(*)(const egl::Config*, const egl::Context*))getProcAddress(libGLES_CM, "glCreateContext");
es1::getProcAddress = (__eglMustCastToProperFunctionPointerType (*)(const char*))getProcAddress(libGLES_CM, "glGetProcAddress");
#if defined(_WIN32)
const char *libGLESv2_lib[] = {"libGLESv2.dll", "libGLES_V2_translator.dll"};
#elif defined(__ANDROID__)
const char *libGLESv2_lib[] = {"/vendor/lib/egl/libGLESv2_swiftshader.so"};
#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
libGLESv2 = loadLibrary(libGLESv2_lib);
es2::createContext = (egl::Context *(*)(const egl::Config*, const egl::Context*, EGLint))getProcAddress(libGLESv2, "glCreateContext");
es2::getProcAddress = (__eglMustCastToProperFunctionPointerType (*)(const char*))getProcAddress(libGLESv2, "glGetProcAddress");
es::createBackBuffer = (egl::Image *(*)(int, int, const egl::Config*))getProcAddress(libGLES_CM, "createBackBuffer");
es::createDepthStencil = (egl::Image *(*)(unsigned int, unsigned int, sw::Format, int, bool))getProcAddress(libGLES_CM, "createDepthStencil");
es::createFrameBuffer = (sw::FrameBuffer *(*)(EGLNativeDisplayType, EGLNativeWindowType, int, int))getProcAddress(libGLES_CM, "createFrameBuffer");
if(!es::createBackBuffer)
{
es::createBackBuffer = (egl::Image *(*)(int, int, const egl::Config*))getProcAddress(libGLESv2, "createBackBuffer");
es::createDepthStencil = (egl::Image *(*)(unsigned int, unsigned int, sw::Format, int, bool))getProcAddress(libGLESv2, "createDepthStencil");
es::createFrameBuffer = (sw::FrameBuffer *(*)(EGLNativeDisplayType, EGLNativeWindowType, int, int))getProcAddress(libGLESv2, "createFrameBuffer");
}
return libGLES_CM != 0 || libGLESv2 != 0;
}
DESTRUCTOR static void eglDetachProcess()
......@@ -134,7 +97,6 @@ DESTRUCTOR static void eglDetachProcess()
eglDetachThread();
sw::Thread::freeLocalStorageKey(currentTLS);
freeLibrary(libGLESv2);
}
#if defined(_WIN32)
......@@ -183,7 +145,7 @@ extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved
#ifndef NDEBUG
WaitForDebugger(instance);
#endif
return eglAttachProcess();
eglAttachProcess();
break;
case DLL_THREAD_ATTACH:
eglAttachThread();
......@@ -329,7 +291,6 @@ egl::Surface *getCurrentReadSurface()
return current->readSurface;
}
}
void error(EGLint errorCode)
{
......@@ -357,38 +318,56 @@ void error(EGLint errorCode)
}
}
}
extern "C"
{
EGLContext clientGetCurrentContext()
{
return egl::getCurrentContext();
}
EGLContext clientGetCurrentDisplay()
{
return egl::getCurrentDisplay();
}
}
namespace es1
{
egl::Context *(*createContext)(const egl::Config *config, const egl::Context *shareContext) = 0;
__eglMustCastToProperFunctionPointerType (*getProcAddress)(const char *procname) = 0;
}
namespace es2
LibEGLexports::LibEGLexports()
{
egl::Context *(*createContext)(const egl::Config *config, const egl::Context *shareContext, EGLint clientVersion) = 0;
__eglMustCastToProperFunctionPointerType (*getProcAddress)(const char *procname) = 0;
this->eglGetError = ::eglGetError;
this->eglGetDisplay = ::eglGetDisplay;
this->eglInitialize = ::eglInitialize;
this->eglTerminate = ::eglTerminate;
this->eglQueryString = ::eglQueryString;
this->eglGetConfigs = ::eglGetConfigs;
this->eglChooseConfig = ::eglChooseConfig;
this->eglGetConfigAttrib = ::eglGetConfigAttrib;
this->eglCreateWindowSurface = ::eglCreateWindowSurface;
this->eglCreatePbufferSurface = ::eglCreatePbufferSurface;
this->eglCreatePixmapSurface = ::eglCreatePixmapSurface;
this->eglDestroySurface = ::eglDestroySurface;
this->eglQuerySurface = ::eglQuerySurface;
this->eglBindAPI = ::eglBindAPI;
this->eglQueryAPI = ::eglQueryAPI;
this->eglWaitClient = ::eglWaitClient;
this->eglReleaseThread = ::eglReleaseThread;
this->eglCreatePbufferFromClientBuffer = ::eglCreatePbufferFromClientBuffer;
this->eglSurfaceAttrib = ::eglSurfaceAttrib;
this->eglBindTexImage = ::eglBindTexImage;
this->eglReleaseTexImage = ::eglReleaseTexImage;
this->eglSwapInterval = ::eglSwapInterval;
this->eglCreateContext = ::eglCreateContext;
this->eglDestroyContext = ::eglDestroyContext;
this->eglMakeCurrent = ::eglMakeCurrent;
this->eglGetCurrentContext = ::eglGetCurrentContext;
this->eglGetCurrentSurface = ::eglGetCurrentSurface;
this->eglGetCurrentDisplay = ::eglGetCurrentDisplay;
this->eglQueryContext = ::eglQueryContext;
this->eglWaitGL = ::eglWaitGL;
this->eglWaitNative = ::eglWaitNative;
this->eglSwapBuffers = ::eglSwapBuffers;
this->eglCopyBuffers = ::eglCopyBuffers;
this->eglCreateImageKHR = ::eglCreateImageKHR;
this->eglDestroyImageKHR = ::eglDestroyImageKHR;
this->eglGetProcAddress = ::eglGetProcAddress;
this->clientGetCurrentContext = egl::getCurrentContext;
this->clientGetCurrentDisplay = egl::getCurrentDisplay;
}
namespace es
extern "C" LibEGLexports *libEGLexports()
{
egl::Image *(*createBackBuffer)(int width, int height, const egl::Config *config) = 0;
egl::Image *(*createDepthStencil)(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard) = 0;
sw::FrameBuffer *(*createFrameBuffer)(EGLNativeDisplayType display, EGLNativeWindowType window, int width, int height) = 0;
static LibEGLexports libEGL;
return &libEGL;
}
void *libGLES_CM = 0; // Handle to the libGLES_CM module
void *libGLESv2 = 0; // Handle to the libGLESv2 module
LibGLES_CM libGLES_CM;
LibGLESv2 libGLESv2;
......@@ -14,8 +14,12 @@
#ifndef LIBEGL_MAIN_H_
#define LIBEGL_MAIN_H_
#include "libGLES_CM/libGLES_CM.hpp"
#include "libGLESv2/libGLESv2.hpp"
#define EGLAPI
#include <EGL/egl.h>
#define EGL_EGLEXT_PROTOTYPES
#include <EGL/eglext.h>
namespace egl
......@@ -51,28 +55,25 @@ namespace egl
void setCurrentReadSurface(Surface *surface);
Surface *getCurrentReadSurface();
}
void error(EGLint errorCode);
template<class T>
const T &error(EGLint errorCode, const T &returnValue)
{
error(errorCode);
void error(EGLint errorCode);
template<class T>
const T &error(EGLint errorCode, const T &returnValue)
{
egl::error(errorCode);
return returnValue;
}
return returnValue;
}
template<class T>
const T &success(const T &returnValue)
{
egl::setCurrentError(EGL_SUCCESS);
template<class T>
const T &success(const T &returnValue)
{
egl::setCurrentError(EGL_SUCCESS);
return returnValue;
}
return returnValue;
}
namespace egl
{
class Config;
class Surface;
class Display;
......@@ -80,34 +81,7 @@ namespace egl
class Image;
}
namespace sw
{
class FrameBuffer;
enum Format : unsigned char;
}
// libGLES_CM dependencies
namespace es1
{
extern egl::Context *(*createContext)(const egl::Config *config, const egl::Context *shareContext);
extern __eglMustCastToProperFunctionPointerType (*getProcAddress)(const char *procname);
}
// libGLESv2 dependencies
namespace es2
{
extern egl::Context *(*createContext)(const egl::Config *config, const egl::Context *shareContext, EGLint clientVersion);
extern __eglMustCastToProperFunctionPointerType (*getProcAddress)(const char *procname);
}
namespace es
{
extern egl::Image *(*createBackBuffer)(int width, int height, const egl::Config *config);
extern egl::Image *(*createDepthStencil)(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard);
extern sw::FrameBuffer *(*createFrameBuffer)(EGLNativeDisplayType display, EGLNativeWindowType window, int width, int height);
}
extern void *libGLES_CM; // Handle to the libGLES_CM module
extern void *libGLESv2; // Handle to the libGLESv2 module
extern LibGLES_CM libGLES_CM;
extern LibGLESv2 libGLESv2;
#endif // LIBEGL_MAIN_H_
......@@ -67,6 +67,6 @@ const T &error(GLenum errorCode, const T &returnValue)
return returnValue;
}
extern "C" sw::FrameBuffer *createFrameBuffer(NativeDisplayType display, NativeWindowType window, int width, int height);
extern sw::FrameBuffer *createFrameBuffer(NativeDisplayType display, NativeWindowType window, int width, int height);
#endif // LIBGL_MAIN_H_
......@@ -255,7 +255,7 @@ void Context::makeCurrent(egl::Surface *surface)
markAllStateDirty();
}
int Context::getClientVersion()
int Context::getClientVersion() const
{
return 1;
}
......@@ -2807,11 +2807,8 @@ GLenum Context::getTextureEnvMode()
}
// Exported functions for use by EGL
extern "C"
egl::Context *es1CreateContext(const egl::Config *config, const egl::Context *shareContext)
{
es1::Context *glCreateContext(const egl::Config *config, const es1::Context *shareContext)
{
return new es1::Context(config, shareContext);
}
ASSERT(!shareContext || shareContext->getClientVersion() == 1); // Should be checked by eglCreateContext
return new es1::Context(config, static_cast<const es1::Context*>(shareContext));
}
......@@ -25,6 +25,7 @@
#define GL_API
#include <GLES/gl.h>
#define GL_GLEXT_PROTOTYPES
#include <GLES/glext.h>
#define EGLAPI
#include <EGL/egl.h>
......@@ -263,7 +264,7 @@ public:
Context(const egl::Config *config, const Context *shareContext);
virtual void makeCurrent(egl::Surface *surface);
virtual int getClientVersion();
virtual int getClientVersion() const;
void markAllStateDirty();
......
......@@ -758,60 +758,56 @@ GLenum TextureExternal::getTarget() const
}
// Exported functions for use by EGL
extern "C"
egl::Image *createBackBuffer(int width, int height, const egl::Config *config)
{
egl::Image *createBackBuffer(int width, int height, const egl::Config *config)
if(config)
{
if(config)
{
return new es1::Image(0, width, height, config->mAlphaSize ? GL_RGBA : GL_RGB, GL_UNSIGNED_BYTE);
}
return 0;
return new es1::Image(0, width, height, config->mAlphaSize ? GL_RGBA : GL_RGB, GL_UNSIGNED_BYTE);
}
egl::Image *createDepthStencil(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard)
{
if(width == 0 || height == 0 || height > OUTLINE_RESOLUTION)
{
ERR("Invalid parameters");
return 0;
}
return 0;
}
bool lockable = true;
egl::Image *createDepthStencil(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard)
{
if(width == 0 || height == 0 || height > OUTLINE_RESOLUTION)
{
ERR("Invalid parameters");
return 0;
}
switch(format)
{
// case sw::FORMAT_D15S1:
case sw::FORMAT_D24S8:
case sw::FORMAT_D24X8:
// case sw::FORMAT_D24X4S4:
case sw::FORMAT_D24FS8:
case sw::FORMAT_D32:
case sw::FORMAT_D16:
lockable = false;
break;
// case sw::FORMAT_S8_LOCKABLE:
// case sw::FORMAT_D16_LOCKABLE:
case sw::FORMAT_D32F_LOCKABLE:
// case sw::FORMAT_D32_LOCKABLE:
case sw::FORMAT_DF24S8:
case sw::FORMAT_DF16S8:
lockable = true;
break;
default:
UNREACHABLE();
}
bool lockable = true;
es1::Image *surface = new es1::Image(0, width, height, format, multiSampleDepth, lockable, true);
switch(format)
{
// case sw::FORMAT_D15S1:
case sw::FORMAT_D24S8:
case sw::FORMAT_D24X8:
// case sw::FORMAT_D24X4S4:
case sw::FORMAT_D24FS8:
case sw::FORMAT_D32:
case sw::FORMAT_D16:
lockable = false;
break;
// case sw::FORMAT_S8_LOCKABLE:
// case sw::FORMAT_D16_LOCKABLE:
case sw::FORMAT_D32F_LOCKABLE:
// case sw::FORMAT_D32_LOCKABLE:
case sw::FORMAT_DF24S8:
case sw::FORMAT_DF16S8:
lockable = true;
break;
default:
UNREACHABLE();
}
if(!surface)
{
ERR("Out of memory");
return 0;
}
es1::Image *surface = new es1::Image(0, width, height, format, multiSampleDepth, lockable, true);
return surface;
if(!surface)
{
ERR("Out of memory");
return 0;
}
return surface;
}
......@@ -205,13 +205,7 @@ global:
glDrawTexfOES;
glDrawTexfvOES;
# EGL dependencies
glCreateContext;
glGetProcAddress;
createFrameBuffer;
createBackBuffer;
createDepthStencil;
libGLES_CMexports;
Register;
......
......@@ -286,6 +286,7 @@
<Unit filename="VertexDataManager.h" />
<Unit filename="exports.map" />
<Unit filename="libGLES_CM.cpp" />
<Unit filename="libGLES_CM.hpp" />
<Unit filename="main.cpp" />
<Unit filename="main.h" />
<Unit filename="mathutil.h" />
......
......@@ -205,12 +205,6 @@ EXPORTS
glDrawTexfOES
glDrawTexfvOES
; EGL dependencies
glCreateContext
glGetProcAddress
createFrameBuffer
createBackBuffer
createDepthStencil
libGLES_CMexports
Register
\ No newline at end of file
#ifndef libGLES_CM_hpp
#define libGLES_CM_hpp
#define GL_API
#include <GLES/gl.h>
#define GL_GLEXT_PROTOTYPES
#include <GLES/glext.h>
#define EGLAPI
#include <EGL/egl.h>
#include "Common/SharedLibrary.hpp"
namespace sw
{
class FrameBuffer;
enum Format : unsigned char;
}
namespace egl
{
class Context;
class Image;
class Config;
}
class LibGLES_CMexports
{
public:
LibGLES_CMexports();
egl::Context *(*es1CreateContext)(const egl::Config *config, const egl::Context *shareContext);
__eglMustCastToProperFunctionPointerType (*es1GetProcAddress)(const char *procname);
egl::Image *(*createBackBuffer)(int width, int height, const egl::Config *config);
egl::Image *(*createDepthStencil)(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard);
sw::FrameBuffer *(*createFrameBuffer)(EGLNativeDisplayType display, EGLNativeWindowType window, int width, int height);
void (GL_APIENTRY *glEGLImageTargetTexture2DOES)(GLenum target, GLeglImageOES image);
};
class LibGLES_CM
{
public:
LibGLES_CM()
{
libGLES_CM = nullptr;
libGLES_CMexports = nullptr;
}
~LibGLES_CM()
{
freeLibrary(libGLES_CM);
}
operator bool()
{
return loadExports();
}
LibGLES_CMexports *operator->()
{
return loadExports();
}
private:
LibGLES_CMexports *loadExports()
{
if(!libGLES_CM)
{
#if defined(_WIN32)
const char *libGLES_CM_lib[] = {"libGLES_CM.dll", "libGLES_CM_translator.dll"};
#elif defined(__ANDROID__)
const char *libGLES_CM_lib[] = {"/vendor/lib/egl/libGLESv1_CM_swiftshader.so"};
#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
libGLES_CM = loadLibrary(libGLES_CM_lib);
if(libGLES_CM)
{
auto libGLES_CMexportsProc = (LibGLES_CMexports *(*)())getProcAddress(libGLES_CM, "libGLES_CMexports");
libGLES_CMexports = libGLES_CMexportsProc();
}
}
return libGLES_CMexports;
}
void *libGLES_CM;
LibGLES_CMexports *libGLES_CMexports;
};
#endif libGLES_CM_hpp
......@@ -351,6 +351,7 @@ copy "$(OutDir)libGLES_CM.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)_$(Pla
<ClInclude Include="Framebuffer.h" />
<ClInclude Include="Image.hpp" />
<ClInclude Include="IndexDataManager.h" />
<ClInclude Include="libGLES_CM.hpp" />
<ClInclude Include="main.h" />
<ClInclude Include="mathutil.h" />
<ClInclude Include="Renderbuffer.h" />
......
......@@ -130,6 +130,9 @@
<ClInclude Include="..\common\MatrixStack.hpp">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="libGLES_CM.hpp">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="libGLES_CM.rc" />
......
......@@ -13,12 +13,16 @@
#include "main.h"
#include "libGLES_CM.hpp"
#include "Framebuffer.h"
#include "libEGL/Surface.h"
#include "Common/Thread.hpp"
#include "Common/SharedLibrary.hpp"
#include "common/debug.h"
#define GL_GLEXT_PROTOTYPES
#include <GLES/glext.h>
#if !defined(_MSC_VER)
#define CONSTRUCTOR __attribute__((constructor))
#define DESTRUCTOR __attribute__((destructor))
......@@ -37,27 +41,11 @@ static void glDetachThread()
TRACE("()");
}
CONSTRUCTOR static bool glAttachProcess()
CONSTRUCTOR static void glAttachProcess()
{
TRACE("()");
glAttachThread();
#if defined(_WIN32)
const char *libEGL_lib[] = {"libEGL.dll", "libEGL_translator.dll"};
#elif defined(__ANDROID__)
const char *libEGL_lib[] = {"/vendor/lib/egl/libEGL_swiftshader.so"};
#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
libEGL = loadLibrary(libEGL_lib);
egl::getCurrentContext = (egl::Context *(*)())getProcAddress(libEGL, "clientGetCurrentContext");
egl::getCurrentDisplay = (egl::Display *(*)())getProcAddress(libEGL, "clientGetCurrentDisplay");
return libEGL != 0;
}
DESTRUCTOR static void glDetachProcess()
......@@ -65,7 +53,6 @@ DESTRUCTOR static void glDetachProcess()
TRACE("()");
glDetachThread();
freeLibrary(libEGL);
}
#if defined(_WIN32)
......@@ -74,7 +61,7 @@ extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved
switch(reason)
{
case DLL_PROCESS_ATTACH:
return glAttachProcess();
glAttachProcess();
break;
case DLL_THREAD_ATTACH:
glAttachThread();
......@@ -97,7 +84,7 @@ namespace es1
{
es1::Context *getContext()
{
egl::Context *context = egl::getCurrentContext();
egl::Context *context = libEGL->clientGetCurrentContext();
if(context && context->getClientVersion() == 1)
{
......@@ -109,7 +96,7 @@ es1::Context *getContext()
egl::Display *getDisplay()
{
return egl::getCurrentDisplay();
return libEGL->clientGetCurrentDisplay();
}
Device *getDevice()
......@@ -118,7 +105,6 @@ Device *getDevice()
return context ? context->getDevice() : 0;
}
}
// Records an error code
void error(GLenum errorCode)
......@@ -153,11 +139,28 @@ void error(GLenum errorCode)
}
}
}
}
egl::Context *es1CreateContext(const egl::Config *config, const egl::Context *shareContext);
extern "C" __eglMustCastToProperFunctionPointerType es1GetProcAddress(const char *procname);
egl::Image *createBackBuffer(int width, int height, const egl::Config *config);
egl::Image *createDepthStencil(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard);
sw::FrameBuffer *createFrameBuffer(EGLNativeDisplayType display, EGLNativeWindowType window, int width, int height);
LibGLES_CMexports::LibGLES_CMexports()
{
this->es1CreateContext = ::es1CreateContext;
this->es1GetProcAddress = ::es1GetProcAddress;
this->createBackBuffer = ::createBackBuffer;
this->createDepthStencil = ::createDepthStencil;
this->createFrameBuffer = ::createFrameBuffer;
this->glEGLImageTargetTexture2DOES = ::glEGLImageTargetTexture2DOES;
}
namespace egl
extern "C" LibGLES_CMexports *libGLES_CMexports()
{
egl::Context *(*getCurrentContext)() = 0;
egl::Display *(*getCurrentDisplay)() = 0;
static LibGLES_CMexports libGLES_CM;
return &libGLES_CM;
}
void *libEGL = 0; // Handle to the libEGL module
LibEGL libEGL;
\ No newline at end of file
......@@ -17,6 +17,7 @@
#include "Context.h"
#include "Device.hpp"
#include "common/debug.h"
#include "libEGL/libEGL.hpp"
#include "libEGL/Display.h"
#define GL_API
......@@ -29,25 +30,18 @@ namespace es1
Context *getContext();
egl::Display *getDisplay();
Device *getDevice();
}
void error(GLenum errorCode);
void error(GLenum errorCode);
template<class T>
const T &error(GLenum errorCode, const T &returnValue)
{
error(errorCode);
template<class T>
const T &error(GLenum errorCode, const T &returnValue)
{
error(errorCode);
return returnValue;
}
// libEGL dependencies
namespace egl
{
extern egl::Context *(*getCurrentContext)();
extern egl::Display *(*getCurrentDisplay)();
return returnValue;
}
}
extern void *libEGL; // Handle to the libEGL module
extern LibEGL libEGL;
#endif // LIBGLES_CM_MAIN_H_
......@@ -300,7 +300,7 @@ void Context::makeCurrent(egl::Surface *surface)
markAllStateDirty();
}
EGLint Context::getClientVersion()
EGLint Context::getClientVersion() const
{
return clientVersion;
}
......@@ -4125,11 +4125,8 @@ const GLubyte* Context::getExtensions(GLuint index, GLuint* numExt)
}
// Exported functions for use by EGL
extern "C"
egl::Context *es2CreateContext(const egl::Config *config, const egl::Context *shareContext, int clientVersion)
{
es2::Context *glCreateContext(const egl::Config *config, const es2::Context *shareContext, int clientVersion)
{
return new es2::Context(config, shareContext, clientVersion);
}
ASSERT(!shareContext || shareContext->getClientVersion() == clientVersion); // Should be checked by eglCreateContext
return new es2::Context(config, static_cast<const es2::Context*>(shareContext), clientVersion);
}
......@@ -353,7 +353,7 @@ public:
Context(const egl::Config *config, const Context *shareContext, EGLint clientVersion);
virtual void makeCurrent(egl::Surface *surface);
virtual EGLint getClientVersion();
virtual EGLint getClientVersion() const;
void markAllStateDirty();
......
......@@ -1797,60 +1797,57 @@ GLenum TextureExternal::getTarget() const
}
// Exported functions for use by EGL
extern "C"
egl::Image *createBackBuffer(int width, int height, const egl::Config *config)
{
egl::Image *createBackBuffer(int width, int height, const egl::Config *config)
if(config)
{
if(config)
{
return new es2::Image(0, width, height, config->mAlphaSize ? GL_RGBA : GL_RGB, GL_UNSIGNED_BYTE);
}
return 0;
return new es2::Image(0, width, height, config->mAlphaSize ? GL_RGBA : GL_RGB, GL_UNSIGNED_BYTE);
}
egl::Image *createDepthStencil(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard)
return 0;
}
egl::Image *createDepthStencil(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard)
{
if(width == 0 || height == 0 || height > OUTLINE_RESOLUTION)
{
if(width == 0 || height == 0 || height > OUTLINE_RESOLUTION)
{
ERR("Invalid parameters");
return 0;
}
ERR("Invalid parameters");
return 0;
}
bool lockable = true;
switch(format)
{
// case sw::FORMAT_D15S1:
case sw::FORMAT_D24S8:
case sw::FORMAT_D24X8:
// case sw::FORMAT_D24X4S4:
case sw::FORMAT_D24FS8:
case sw::FORMAT_D32:
case sw::FORMAT_D16:
lockable = false;
break;
// case sw::FORMAT_S8_LOCKABLE:
// case sw::FORMAT_D16_LOCKABLE:
case sw::FORMAT_D32F_LOCKABLE:
// case sw::FORMAT_D32_LOCKABLE:
case sw::FORMAT_DF24S8:
case sw::FORMAT_DF16S8:
lockable = true;
break;
default:
UNREACHABLE();
}
es2::Image *surface = new es2::Image(0, width, height, format, multiSampleDepth, lockable, true);
bool lockable = true;
switch(format)
{
// case sw::FORMAT_D15S1:
case sw::FORMAT_D24S8:
case sw::FORMAT_D24X8:
// case sw::FORMAT_D24X4S4:
case sw::FORMAT_D24FS8:
case sw::FORMAT_D32:
case sw::FORMAT_D16:
lockable = false;
break;
// case sw::FORMAT_S8_LOCKABLE:
// case sw::FORMAT_D16_LOCKABLE:
case sw::FORMAT_D32F_LOCKABLE:
// case sw::FORMAT_D32_LOCKABLE:
case sw::FORMAT_DF24S8:
case sw::FORMAT_DF16S8:
lockable = true;
break;
default:
UNREACHABLE();
}
if(!surface)
{
ERR("Out of memory");
return 0;
}
es2::Image *surface = new es2::Image(0, width, height, format, multiSampleDepth, lockable, true);
return surface;
if(!surface)
{
ERR("Out of memory");
return 0;
}
return surface;
}
......@@ -168,13 +168,7 @@ global:
glEGLImageTargetTexture2DOES;
glEGLImageTargetRenderbufferStorageOES;
# EGL dependencies
glCreateContext;
glGetProcAddress;
createFrameBuffer;
createBackBuffer;
createDepthStencil;
libGLESv2exports;
Register;
......
......@@ -372,6 +372,7 @@
<Unit filename="VertexDataManager.h" />
<Unit filename="exports.map" />
<Unit filename="libGLESv2.cpp" />
<Unit filename="libGLESv2.hpp" />
<Unit filename="main.cpp" />
<Unit filename="main.h" />
<Unit filename="mathutil.h" />
......
......@@ -37,6 +37,8 @@
#include <cutils/log.h>
#endif
using namespace es2;
typedef std::pair<GLenum, GLenum> InternalFormatTypePair;
typedef std::map<InternalFormatTypePair, GLenum> FormatMap;
......@@ -6690,8 +6692,7 @@ void GL_APIENTRY glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image
{
if(egl::getClientVersion() == 1)
{
static auto glEGLImageTargetTexture2DOES = (PFNGLEGLIMAGETARGETTEXTURE2DOESPROC)es1::getProcAddress("glEGLImageTargetTexture2DOES");
return glEGLImageTargetTexture2DOES(target, image);
return libGLES_CM->glEGLImageTargetTexture2DOES(target, image);
}
TRACE("(GLenum target = 0x%X, GLeglImageOES image = 0x%0.8p)", target, image);
......@@ -6741,7 +6742,7 @@ void GL_APIENTRY glEGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImag
UNIMPLEMENTED();
}
__eglMustCastToProperFunctionPointerType glGetProcAddress(const char *procname)
__eglMustCastToProperFunctionPointerType es2GetProcAddress(const char *procname)
{
struct Extension
{
......
......@@ -274,12 +274,6 @@ EXPORTS
glTexStorage3D @304
glGetInternalformativ @308
; EGL dependencies
glCreateContext
glGetProcAddress
createFrameBuffer
createBackBuffer
createDepthStencil
libGLESv2exports
Register
\ No newline at end of file
#ifndef libGLESv2_hpp
#define libGLESv2_hpp
#define GL_API
#include <GLES/gl.h>
#define GL_GLEXT_PROTOTYPES
#include <GLES/glext.h>
#define EGLAPI
#include <EGL/egl.h>
#include "Common/SharedLibrary.hpp"
namespace sw
{
class FrameBuffer;
enum Format : unsigned char;
}
namespace egl
{
class Context;
class Image;
class Config;
}
class LibGLESv2exports
{
public:
LibGLESv2exports();
egl::Context *(*es2CreateContext)(const egl::Config *config, const egl::Context *shareContext, int clientVersion);
__eglMustCastToProperFunctionPointerType (*es2GetProcAddress)(const char *procname);
egl::Image *(*createBackBuffer)(int width, int height, const egl::Config *config);
egl::Image *(*createDepthStencil)(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard);
sw::FrameBuffer *(*createFrameBuffer)(EGLNativeDisplayType display, EGLNativeWindowType window, int width, int height);
};
class LibGLESv2
{
public:
LibGLESv2()
{
libGLESv2 = nullptr;
libGLESv2exports = nullptr;
}
~LibGLESv2()
{
freeLibrary(libGLESv2);
}
operator bool()
{
return loadExports();
}
LibGLESv2exports *operator->()
{
return loadExports();
}
private:
LibGLESv2exports *loadExports()
{
if(!libGLESv2)
{
#if defined(_WIN32)
const char *libGLESv2_lib[] = {"libGLESv2.dll", "libGLES_V2_translator.dll"};
#elif defined(__ANDROID__)
const char *libGLESv2_lib[] = {"/vendor/lib/egl/libGLESv2_swiftshader.so"};
#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
libGLESv2 = loadLibrary(libGLESv2_lib);
if(libGLESv2)
{
auto libGLESv2exportsProc = (LibGLESv2exports *(*)())getProcAddress(libGLESv2, "libGLESv2exports");
libGLESv2exports = libGLESv2exportsProc();
}
}
return libGLESv2exports;
}
void *libGLESv2;
LibGLESv2exports *libGLESv2exports;
};
#endif // libGLESv2_hpp
......@@ -355,6 +355,7 @@ copy "$(OutDir)libGLESv2.dll" "$(ProjectDir)..\..\..\lib\$(Configuration)_$(Plat
<ClInclude Include="Framebuffer.h" />
<ClInclude Include="Image.hpp" />
<ClInclude Include="IndexDataManager.h" />
<ClInclude Include="libGLESv2.hpp" />
<ClInclude Include="main.h" />
<ClInclude Include="mathutil.h" />
<ClInclude Include="Program.h" />
......
......@@ -160,6 +160,9 @@
<ClInclude Include="VertexArray.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="libGLESv2.hpp">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="libGLESv2.rc" />
......
......@@ -23,6 +23,8 @@
#include <GLES3/gl3.h>
#include <GLES2/gl2ext.h>
using namespace es2;
typedef std::pair<GLenum, GLenum> InternalFormatTypePair;
typedef std::map<InternalFormatTypePair, GLenum> FormatMap;
......
......@@ -13,7 +13,9 @@
#include "main.h"
#include "libGLESv2.hpp"
#include "Framebuffer.h"
#include "libEGL/main.h"
#include "libEGL/Surface.h"
#include "Common/Thread.hpp"
#include "Common/SharedLibrary.hpp"
......@@ -37,40 +39,11 @@ static void glDetachThread()
TRACE("()");
}
CONSTRUCTOR static bool glAttachProcess()
CONSTRUCTOR static void glAttachProcess()
{
TRACE("()");
glAttachThread();
#if defined(_WIN32)
const char *libEGL_lib[] = {"libEGL.dll", "libEGL_translator.dll"};
#elif defined(__ANDROID__)
const char *libEGL_lib[] = {"/vendor/lib/egl/libEGL_swiftshader.so"};
#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
libEGL = loadLibrary(libEGL_lib);
egl::getCurrentContext = (egl::Context *(*)())getProcAddress(libEGL, "clientGetCurrentContext");
egl::getCurrentDisplay = (egl::Display *(*)())getProcAddress(libEGL, "clientGetCurrentDisplay");
#if defined(_WIN32)
const char *libGLES_CM_lib[] = {"libGLES_CM.dll", "libGLES_CM_translator.dll"};
#elif defined(__ANDROID__)
const char *libGLES_CM_lib[] = {"/vendor/lib/egl/libGLESv1_CM_swiftshader.so"};
#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
libGLES_CM = loadLibrary(libGLES_CM_lib);
es1::getProcAddress = (__eglMustCastToProperFunctionPointerType (*)(const char*))getProcAddress(libGLES_CM, "glGetProcAddress");
return libEGL != 0;
}
DESTRUCTOR static void glDetachProcess()
......@@ -78,8 +51,6 @@ DESTRUCTOR static void glDetachProcess()
TRACE("()");
glDetachThread();
freeLibrary(libEGL);
freeLibrary(libGLES_CM);
}
#if defined(_WIN32)
......@@ -88,7 +59,7 @@ extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved
switch(reason)
{
case DLL_PROCESS_ATTACH:
return glAttachProcess();
glAttachProcess();
break;
case DLL_THREAD_ATTACH:
glAttachThread();
......@@ -111,7 +82,7 @@ namespace es2
{
es2::Context *getContext()
{
egl::Context *context = egl::getCurrentContext();
egl::Context *context = libEGL->clientGetCurrentContext();
if(context && (context->getClientVersion() == 2 ||
context->getClientVersion() == 3))
......@@ -124,7 +95,7 @@ es2::Context *getContext()
egl::Display *getDisplay()
{
return egl::getCurrentDisplay();
return libEGL->clientGetCurrentDisplay();
}
Device *getDevice()
......@@ -133,17 +104,6 @@ Device *getDevice()
return context ? context->getDevice() : 0;
}
}
namespace egl
{
GLint getClientVersion()
{
Context *context = egl::getCurrentContext();
return context ? context->getClientVersion() : 0;
}
}
// Records an error code
void error(GLenum errorCode)
......@@ -178,17 +138,38 @@ void error(GLenum errorCode)
}
}
}
}
namespace egl
{
egl::Context *(*getCurrentContext)() = 0;
egl::Display *(*getCurrentDisplay)() = 0;
GLint getClientVersion()
{
Context *context = libEGL->clientGetCurrentContext();
return context ? context->getClientVersion() : 0;
}
}
egl::Context *es2CreateContext(const egl::Config *config, const egl::Context *shareContext, int clientVersion);
extern "C" __eglMustCastToProperFunctionPointerType es2GetProcAddress(const char *procname);
egl::Image *createBackBuffer(int width, int height, const egl::Config *config);
egl::Image *createDepthStencil(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard);
sw::FrameBuffer *createFrameBuffer(EGLNativeDisplayType display, EGLNativeWindowType window, int width, int height);
LibGLESv2exports::LibGLESv2exports()
{
this->es2CreateContext = ::es2CreateContext;
this->es2GetProcAddress = ::es2GetProcAddress;
this->createBackBuffer = ::createBackBuffer;
this->createDepthStencil = ::createDepthStencil;
this->createFrameBuffer = ::createFrameBuffer;
}
namespace es1
extern "C" LibGLESv2exports *libGLESv2exports()
{
__eglMustCastToProperFunctionPointerType (*getProcAddress)(const char *procname) = 0;
static LibGLESv2exports libGLESv2;
return &libGLESv2;
}
void *libEGL = 0; // Handle to the libEGL module
void *libGLES_CM = 0; // Handle to the libGLES_CM module
LibEGL libEGL;
LibGLES_CM libGLES_CM;
\ No newline at end of file
......@@ -17,7 +17,9 @@
#include "Context.h"
#include "Device.hpp"
#include "common/debug.h"
#include "libEGL/libEGL.hpp"
#include "libEGL/Display.h"
#include "libGLES_CM/libGLES_CM.hpp"
#define GL_APICALL
#include <GLES2/gl2.h>
......@@ -29,37 +31,24 @@ namespace es2
Context *getContext();
egl::Display *getDisplay();
Device *getDevice();
}
namespace egl
{
GLint getClientVersion();
}
void error(GLenum errorCode);
void error(GLenum errorCode);
template<class T>
const T &error(GLenum errorCode, const T &returnValue)
{
error(errorCode);
template<class T>
const T &error(GLenum errorCode, const T &returnValue)
{
error(errorCode);
return returnValue;
return returnValue;
}
}
// libEGL dependencies
namespace egl
{
extern egl::Context *(*getCurrentContext)();
extern egl::Display *(*getCurrentDisplay)();
}
// libGLES_CM dependencies
namespace es1
{
extern __eglMustCastToProperFunctionPointerType (*getProcAddress)(const char *procname);
GLint getClientVersion();
}
extern void *libEGL; // Handle to the libEGL module
extern void *libGLES_CM; // Handle to the libGLES_CM module
extern LibEGL libEGL;
extern LibGLES_CM libGLES_CM;
#endif // LIBGLESV2_MAIN_H_
......@@ -33,12 +33,13 @@ extern "C"
{
es2::Image *createBackBuffer(int width, int height, const egl::Config *config);
es2::Image *createDepthStencil(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard);
#if defined(_WIN32)
sw::FrameBuffer *createFrameBuffer(HDC display, HWND window, int width, int height);
#else
sw::FrameBuffer *createFrameBuffer(void *display, Window window, int width, int height);
#endif
}
}
#if defined(_WIN32)
sw::FrameBuffer *createFrameBuffer(HDC display, HWND window, int width, int height);
#else
sw::FrameBuffer *createFrameBuffer(Display *display, Window window, int width, int height);
#endif
namespace egl
{
......
......@@ -108,6 +108,7 @@
<Add directory="./../../Shader/" />
<Add directory="./../../Main/" />
<Add directory="./../../OpenGL/" />
<Add directory="./../../OpenGL/include" />
</Compiler>
<Linker>
<Add option="-Wl,--version-script=./exports.map" />
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment