Bug 1182547 - Replace InitExtensions() with InitExtensionsFromDisplay() so that queries can be made with specific displays and add symbol loading for GetPlatformDisplayEXT so that the ANGLE_platform_angle_d3d extension can be used. r=jgilbert

This commit is contained in:
Kyle 2015-07-10 14:47:48 -04:00
Родитель 36217c88d3
Коммит 902feca0b9
2 изменённых файлов: 45 добавлений и 8 удалений

Просмотреть файл

@ -35,7 +35,9 @@ static const char *sEGLExtensionNames[] = {
"EGL_EXT_create_context_robustness",
"EGL_KHR_image",
"EGL_KHR_fence_sync",
"EGL_ANDROID_native_fence_sync"
"EGL_ANDROID_native_fence_sync",
"ANGLE_platform_angle",
"ANGLE_platform_angle_d3d"
};
#if defined(ANDROID)
@ -249,6 +251,32 @@ GLLibraryEGL::EnsureInitialized()
"Couldn't find eglQueryStringImplementationANDROID");
#endif
//Initialize client extensions
InitExtensionsFromDisplay(EGL_NO_DISPLAY);
GLLibraryLoader::PlatformLookupFunction lookupFunction =
(GLLibraryLoader::PlatformLookupFunction)mSymbols.fGetProcAddress;
#ifdef XP_WIN
if (IsExtensionSupported(ANGLE_platform_angle_d3d)) {
GLLibraryLoader::SymLoadStruct d3dSymbols[] = {
{ (PRFuncPtr*)&mSymbols.fGetPlatformDisplayEXT, { "eglGetPlatformDisplayEXT", nullptr } },
{ nullptr, { nullptr } }
};
bool success = GLLibraryLoader::LoadSymbols(mEGLLibrary,
&d3dSymbols[0],
lookupFunction);
if (!success) {
NS_ERROR("EGL supports ANGLE_platform_angle_d3d without exposing its functions!");
MarkExtensionUnsupported(ANGLE_platform_angle_d3d);
mSymbols.fGetPlatformDisplayEXT = nullptr;
}
}
#endif
mEGLDisplay = GetAndInitDisplay(*this, EGL_DEFAULT_DISPLAY);
const char* vendor = (char*)fQueryString(mEGLDisplay, LOCAL_EGL_VENDOR);
@ -286,10 +314,7 @@ GLLibraryEGL::EnsureInitialized()
}
}
InitExtensions();
GLLibraryLoader::PlatformLookupFunction lookupFunction =
(GLLibraryLoader::PlatformLookupFunction)mSymbols.fGetProcAddress;
InitExtensionsFromDisplay(mEGLDisplay);
if (IsExtensionSupported(KHR_lock_surface)) {
GLLibraryLoader::SymLoadStruct lockSymbols[] = {
@ -420,11 +445,11 @@ GLLibraryEGL::EnsureInitialized()
}
void
GLLibraryEGL::InitExtensions()
GLLibraryEGL::InitExtensionsFromDisplay(EGLDisplay eglDisplay)
{
std::vector<nsCString> driverExtensionList;
const char* rawExts = (const char*)fQueryString(mEGLDisplay, LOCAL_EGL_EXTENSIONS);
const char* rawExts = (const char*)fQueryString(eglDisplay, LOCAL_EGL_EXTENSIONS);
if (rawExts) {
nsDependentCString exts(rawExts);
SplitByChar(exts, ' ', &driverExtensionList);

Просмотреть файл

@ -112,7 +112,7 @@ public:
{
}
void InitExtensions();
void InitExtensionsFromDisplay(EGLDisplay eglDisplay);
/**
* Known GL extensions that can be queried by
@ -131,6 +131,8 @@ public:
KHR_image,
KHR_fence_sync,
ANDROID_native_fence_sync,
ANGLE_platform_angle,
ANGLE_platform_angle_d3d,
Extensions_Max
};
@ -155,6 +157,14 @@ public:
return disp;
}
EGLDisplay fGetPlatformDisplayEXT(EGLenum platform, void* native_display, const EGLint* attrib_list)
{
BEFORE_GL_CALL;
EGLDisplay disp = mSymbols.fGetPlatformDisplayEXT(platform, native_display, attrib_list);
AFTER_GL_CALL;
return disp;
}
EGLBoolean fTerminate(EGLDisplay display)
{
BEFORE_GL_CALL;
@ -486,6 +496,8 @@ public:
struct {
typedef EGLDisplay (GLAPIENTRY * pfnGetDisplay)(void *display_id);
pfnGetDisplay fGetDisplay;
typedef EGLDisplay(GLAPIENTRY * pfnGetPlatformDisplayEXT)(EGLenum platform, void *native_display, const EGLint *attrib_list);
pfnGetPlatformDisplayEXT fGetPlatformDisplayEXT;
typedef EGLBoolean (GLAPIENTRY * pfnTerminate)(EGLDisplay dpy);
pfnTerminate fTerminate;
typedef EGLSurface (GLAPIENTRY * pfnGetCurrentSurface)(EGLint);