OSDN Git Service

Implemented EGL_EXT_platform_base and EGL_KHR_platform_gbm.
authorNicolas Capens <capn@google.com>
Thu, 20 Nov 2014 22:58:45 +0000 (17:58 -0500)
committerNicolas Capens <nicolascapens@google.com>
Fri, 21 Nov 2014 05:18:01 +0000 (05:18 +0000)
BUG=18314459

Change-Id: I361dba91a2fec3d9c923c660e64b5cc25beeb72b
Reviewed-on: https://swiftshader-review.googlesource.com/1421
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
src/OpenGL/libEGL/Display.cpp
src/OpenGL/libEGL/Display.h
src/OpenGL/libEGL/libEGL.cpp
src/OpenGL/libEGL/libEGL.def

index e6c8743..69baa9c 100644 (file)
@@ -29,29 +29,43 @@ namespace egl
 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;
@@ -449,14 +463,19 @@ bool Display::isValidSurface(egl::Surface *surface)
 
 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)
@@ -509,19 +528,29 @@ DisplayMode Display::getDisplayMode() const
        
                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;
index ff1d7c8..3c47853 100644 (file)
@@ -30,7 +30,7 @@ namespace egl
        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
@@ -59,10 +59,11 @@ namespace egl
                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
index 6f4a4c8..006005d 100644 (file)
@@ -105,7 +105,7 @@ EGLDisplay EGLAPIENTRY eglGetDisplay(EGLNativeDisplayType display_id)
 \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
@@ -180,7 +180,10 @@ const char *EGLAPIENTRY eglQueryString(EGLDisplay dpy, EGLint name)
     {\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
@@ -1191,6 +1194,32 @@ EGLBoolean EGLAPIENTRY eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
     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
@@ -1209,6 +1238,9 @@ __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress(const cha
 \r
                        EXTENSION(eglCreateImageKHR),\r
                        EXTENSION(eglDestroyImageKHR),\r
+            EXTENSION(eglGetPlatformDisplayEXT),\r
+            EXTENSION(eglCreatePlatformWindowSurfaceEXT),\r
+            EXTENSION(eglCreatePlatformPixmapSurfaceEXT),\r
 \r
                        #undef EXTENSION\r
                };\r
index 4555d71..e9293a9 100644 (file)
@@ -1,44 +1,47 @@
-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