mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-08 19:04:45 +00:00
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:
parent
36217c88d3
commit
902feca0b9
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user