typedef std::map<EGLNativeDisplayType, Display*> DisplayMap;
DisplayMap displays;
-egl::Display *Display::getDisplay(EGLNativeDisplayType displayId)
+egl::Display *Display::getPlatformDisplay(EGLenum platform, EGLNativeDisplayType displayId)
{
- if(displayId == EGL_DEFAULT_DISPLAY)
+ if(platform == EGL_UNKNOWN) // Default
{
#if defined(__unix__)
- displayId = XOpenDisplay(NULL);
+ platform = EGL_PLATFORM_X11_EXT;
#endif
}
+ if(displayId == EGL_DEFAULT_DISPLAY)
+ {
+ if(platform == EGL_PLATFORM_X11_EXT)
+ {
+ #if defined(__unix__)
+ displayId = XOpenDisplay(NULL);
+ #else
+ return error(EGL_BAD_PARAMETER, (egl::Display*)EGL_NO_DISPLAY);
+ #endif
+ }
+ }
+ else
+ {
+ // FIXME: Check if displayId is a valid display device context for <platform>
+ }
+
if(displays.find(displayId) != displays.end())
{
return displays[displayId];
}
- // FIXME: Check if displayId is a valid display device context
-
- egl::Display *display = new egl::Display(displayId);
+ egl::Display *display = new egl::Display(platform, displayId);
displays[displayId] = display;
return display;
}
-Display::Display(EGLNativeDisplayType displayId) : displayId(displayId)
+Display::Display(EGLenum platform, EGLNativeDisplayType displayId) : platform(platform), displayId(displayId)
{
mMinSwapInterval = 1;
mMaxSwapInterval = 1;
bool Display::isValidWindow(EGLNativeWindowType window)
{
- #if defined(_WIN32)
- return IsWindow(window) == TRUE;
- #else
- XWindowAttributes windowAttributes;
- Status status = XGetWindowAttributes(displayId, window, &windowAttributes);
-
- return status == True;
+ #if defined(_WIN32)
+ return IsWindow(window) == TRUE;
+ #else
+ if(platform == EGL_PLATFORM_X11_EXT)
+ {
+ XWindowAttributes windowAttributes;
+ Status status = XGetWindowAttributes(displayId, window, &windowAttributes);
+
+ return status == True;
+ }
#endif
+
+ return false;
}
bool Display::hasExistingWindowSurface(EGLNativeWindowType window)
ReleaseDC(0, deviceContext);
#else
- Screen *screen = XDefaultScreenOfDisplay(displayId);
- displayMode.width = XWidthOfScreen(screen);
- displayMode.height = XHeightOfScreen(screen);
- unsigned int bpp = XPlanesOfScreen(screen);
+ if(platform == EGL_PLATFORM_X11_EXT)
+ {
+ Screen *screen = XDefaultScreenOfDisplay(displayId);
+ displayMode.width = XWidthOfScreen(screen);
+ displayMode.height = XHeightOfScreen(screen);
+ unsigned int bpp = XPlanesOfScreen(screen);
- switch(bpp)
- {
- case 32: displayMode.format = sw::FORMAT_X8R8G8B8; break;
- case 24: displayMode.format = sw::FORMAT_R8G8B8; break;
- case 16: displayMode.format = sw::FORMAT_R5G6B5; break;
- default:
- ASSERT(false); // Unexpected display mode color depth
- }
+ switch(bpp)
+ {
+ case 32: displayMode.format = sw::FORMAT_X8R8G8B8; break;
+ case 24: displayMode.format = sw::FORMAT_R8G8B8; break;
+ case 16: displayMode.format = sw::FORMAT_R5G6B5; break;
+ default:
+ ASSERT(false); // Unexpected display mode color depth
+ }
+ }
+ else if(platform == EGL_PLATFORM_GBM_MESA)
+ {
+ displayMode.width = 0;
+ displayMode.height = 0;
+ displayMode.format = sw::FORMAT_X8R8G8B8;
+ }
+ else UNREACHABLE();
#endif
return displayMode;
public:\r
~Display();\r
\r
- static egl::Display *getDisplay(EGLNativeDisplayType displayId);\r
+ static egl::Display *getPlatformDisplay(EGLenum platform, EGLNativeDisplayType displayId);\r
\r
bool initialize();\r
void terminate();\r
const char *getExtensionString() const;\r
\r
private:\r
- Display(EGLNativeDisplayType displayId);\r
+ Display(EGLenum platform, EGLNativeDisplayType displayId);\r
\r
DisplayMode getDisplayMode() const;\r
\r
+ const EGLenum platform;\r
const EGLNativeDisplayType displayId;\r
\r
EGLint mMaxSwapInterval;\r
\r
try\r
{\r
- return egl::Display::getDisplay(display_id);\r
+ return egl::Display::getPlatformDisplay(EGL_UNKNOWN, display_id);\r
}\r
catch(std::bad_alloc&)\r
{\r
{\r
if(dpy == EGL_NO_DISPLAY && name == EGL_EXTENSIONS)\r
{\r
- return success("EGL_EXT_client_extensions");\r
+ return success("EGL_KHR_platform_gbm "\r
+ "EGL_KHR_platform_x11 "\r
+ "EGL_EXT_client_extensions "\r
+ "EGL_EXT_platform_base");\r
}\r
\r
egl::Display *display = static_cast<egl::Display*>(dpy);\r
return EGL_FALSE;\r
}\r
\r
+EGLDisplay EGLAPIENTRY eglGetPlatformDisplayEXT(EGLenum platform, void *native_display, const EGLint *attrib_list)\r
+{\r
+ TRACE("(EGLenum platform = 0x%X, void *native_display = 0x%0.8p, const EGLint *attrib_list = 0x%0.8p)", platform, native_display, attrib_list);\r
+\r
+ try\r
+ {\r
+ return egl::Display::getPlatformDisplay(platform, (EGLNativeDisplayType)native_display);\r
+ }\r
+ catch(std::bad_alloc&)\r
+ {\r
+ return error(EGL_BAD_ALLOC, EGL_NO_DISPLAY);\r
+ }\r
+\r
+ return EGL_NO_DISPLAY;\r
+}\r
+\r
+EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list)\r
+{\r
+ return eglCreateWindowSurface(dpy, config, (EGLNativeWindowType)native_window, attrib_list);\r
+}\r
+\r
+EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list)\r
+{\r
+ return eglCreatePixmapSurface(dpy, config, (EGLNativePixmapType)native_pixmap, attrib_list);\r
+}\r
+\r
__eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress(const char *procname)\r
{\r
TRACE("(const char *procname = \"%s\")", procname);\r
\r
EXTENSION(eglCreateImageKHR),\r
EXTENSION(eglDestroyImageKHR),\r
+ EXTENSION(eglGetPlatformDisplayEXT),\r
+ EXTENSION(eglCreatePlatformWindowSurfaceEXT),\r
+ EXTENSION(eglCreatePlatformPixmapSurfaceEXT),\r
\r
#undef EXTENSION\r
};\r
-LIBRARY libEGL
-EXPORTS
- eglBindAPI @14
- eglBindTexImage @20
- eglChooseConfig @7
- eglCopyBuffers @33
- eglCreateContext @23
- eglCreatePbufferFromClientBuffer @18
- eglCreatePbufferSurface @10
- eglCreatePixmapSurface @11
- eglCreateWindowSurface @9
- eglDestroyContext @24
- eglDestroySurface @12
- eglGetConfigAttrib @8
- eglGetConfigs @6
- eglGetCurrentContext @26
- eglGetCurrentDisplay @28
- eglGetCurrentSurface @27
- eglGetDisplay @2
- eglGetError @1
- eglGetProcAddress @34
- eglInitialize @3
- eglMakeCurrent @25
- eglQueryAPI @15
- eglQueryContext @29
- eglQueryString @5
- eglQuerySurface @13
- eglReleaseTexImage @21
- eglReleaseThread @17
- eglSurfaceAttrib @19
- eglSwapBuffers @32
- eglSwapInterval @22
- eglTerminate @4
- eglWaitClient @16
- eglWaitGL @30
- eglWaitNative @31
-
- ; Extensions
- eglCreateImageKHR
- eglDestroyImageKHR
-
- ; Functions that don't change the error code, for use by client APIs
- clientGetCurrentContext
+LIBRARY libEGL\r
+EXPORTS\r
+ eglBindAPI @14\r
+ eglBindTexImage @20\r
+ eglChooseConfig @7\r
+ eglCopyBuffers @33\r
+ eglCreateContext @23\r
+ eglCreatePbufferFromClientBuffer @18\r
+ eglCreatePbufferSurface @10\r
+ eglCreatePixmapSurface @11\r
+ eglCreateWindowSurface @9\r
+ eglDestroyContext @24\r
+ eglDestroySurface @12\r
+ eglGetConfigAttrib @8\r
+ eglGetConfigs @6\r
+ eglGetCurrentContext @26\r
+ eglGetCurrentDisplay @28\r
+ eglGetCurrentSurface @27\r
+ eglGetDisplay @2\r
+ eglGetError @1\r
+ eglGetProcAddress @34\r
+ eglInitialize @3\r
+ eglMakeCurrent @25\r
+ eglQueryAPI @15\r
+ eglQueryContext @29\r
+ eglQueryString @5\r
+ eglQuerySurface @13\r
+ eglReleaseTexImage @21\r
+ eglReleaseThread @17\r
+ eglSurfaceAttrib @19\r
+ eglSwapBuffers @32\r
+ eglSwapInterval @22\r
+ eglTerminate @4\r
+ eglWaitClient @16\r
+ eglWaitGL @30\r
+ eglWaitNative @31\r
+\r
+ ; Extensions\r
+ eglCreateImageKHR\r
+ eglDestroyImageKHR\r
+ eglGetPlatformDisplayEXT\r
+ eglCreatePlatformWindowSurfaceEXT\r
+ eglCreatePlatformPixmapSurfaceEXT\r
+\r
+ ; Functions that don't change the error code, for use by client APIs\r
+ clientGetCurrentContext\r
clientGetCurrentDisplay
\ No newline at end of file