mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 03:15:11 +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_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);
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user