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
parent 36217c88d3
commit 902feca0b9
2 changed files with 45 additions and 8 deletions

View File

@ -35,7 +35,9 @@ static const char *sEGLExtensionNames[] = {
"EGL_EXT_create_context_robustness", "EGL_EXT_create_context_robustness",
"EGL_KHR_image", "EGL_KHR_image",
"EGL_KHR_fence_sync", "EGL_KHR_fence_sync",
"EGL_ANDROID_native_fence_sync" "EGL_ANDROID_native_fence_sync",
"ANGLE_platform_angle",
"ANGLE_platform_angle_d3d"
}; };
#if defined(ANDROID) #if defined(ANDROID)
@ -249,6 +251,32 @@ GLLibraryEGL::EnsureInitialized()
"Couldn't find eglQueryStringImplementationANDROID"); "Couldn't find eglQueryStringImplementationANDROID");
#endif #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); mEGLDisplay = GetAndInitDisplay(*this, EGL_DEFAULT_DISPLAY);
const char* vendor = (char*)fQueryString(mEGLDisplay, LOCAL_EGL_VENDOR); const char* vendor = (char*)fQueryString(mEGLDisplay, LOCAL_EGL_VENDOR);
@ -286,10 +314,7 @@ GLLibraryEGL::EnsureInitialized()
} }
} }
InitExtensions(); InitExtensionsFromDisplay(mEGLDisplay);
GLLibraryLoader::PlatformLookupFunction lookupFunction =
(GLLibraryLoader::PlatformLookupFunction)mSymbols.fGetProcAddress;
if (IsExtensionSupported(KHR_lock_surface)) { if (IsExtensionSupported(KHR_lock_surface)) {
GLLibraryLoader::SymLoadStruct lockSymbols[] = { GLLibraryLoader::SymLoadStruct lockSymbols[] = {
@ -420,11 +445,11 @@ GLLibraryEGL::EnsureInitialized()
} }
void void
GLLibraryEGL::InitExtensions() GLLibraryEGL::InitExtensionsFromDisplay(EGLDisplay eglDisplay)
{ {
std::vector<nsCString> driverExtensionList; 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) { if (rawExts) {
nsDependentCString exts(rawExts); nsDependentCString exts(rawExts);
SplitByChar(exts, ' ', &driverExtensionList); SplitByChar(exts, ' ', &driverExtensionList);

View File

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