| Name |
| |
| EXT_platform_base |
| |
| Name Strings |
| |
| EGL_EXT_platform_base |
| |
| Contributors |
| |
| Chad Versace <chad.versace@intel.com> |
| James Jones <jajones@nvidia.com> |
| |
| Contacts |
| |
| Chad Versace <chad.versace@intel.com> |
| |
| Status |
| |
| Complete |
| |
| Version |
| |
| Version 9, 2014.01.09 |
| |
| Number |
| |
| EGL Extension #57 |
| |
| Extension Type |
| |
| EGL client extension |
| |
| Dependencies |
| |
| Requires EGL 1.4. |
| |
| Requires EGL_EXT_client_extensions to query its existence without |
| a display. |
| |
| This extension is written against the wording of the 2013.02.11 revision |
| of the EGL 1.4 Specification. |
| |
| Overview |
| |
| This extension defines functionality and behavior for EGL implementations |
| that support multiple platforms at runtime. For example, on Linux an EGL |
| implementation could support X11, Wayland, GBM (Generic Buffer Manager), |
| Surface Flinger, and perhaps other platforms. |
| |
| In particular, this extension defines the following: |
| |
| 1. A mechanism by which an EGL client can detect which platforms the |
| EGL implementation supports. |
| |
| 2. New functions that enable an EGL client to specify to which |
| platform a native resource belongs when creating an EGL resource |
| from that native resource. For example, this extension enables an |
| EGL client to specify, when creating an EGLSurface from a native |
| window, that the window belongs to X11. |
| |
| 3. That an EGL client is not restricted to interacting with a single |
| platform per process. A client process can create and manage EGL |
| resources from multiple platforms. |
| |
| The generic term 'platform' is used throughout this extension |
| specification rather than 'window system' because not all EGL platforms |
| are window systems. In particular, those platforms that allow headless |
| rendering without a display server, such as GBM, are not window systems. |
| |
| This extension does not specify behavior specific to any platform, nor |
| does it specify the set of platforms that an EGL implementation may |
| support. Platform-specific details lie outside this extension's scope and |
| are instead described by extensions layered atop this one. |
| |
| New Types |
| |
| None |
| |
| New Procedures and Functions |
| |
| EGLDisplay eglGetPlatformDisplayEXT( |
| EGLenum platform, |
| void *native_display, |
| const EGLint *attrib_list); |
| |
| EGLSurface eglCreatePlatformWindowSurfaceEXT( |
| EGLDisplay dpy, |
| EGLConfig config, |
| void *native_window, |
| const EGLint *attrib_list); |
| |
| EGLSurface eglCreatePlatformPixmapSurfaceEXT( |
| EGLDisplay dpy, |
| EGLConfig config, |
| void *native_pixmap, |
| const EGLint *attrib_list); |
| |
| New Tokens |
| |
| None |
| |
| Additions to the EGL 1.4 Specification |
| |
| Replace each occurence of the term "window system" with "platform". The |
| rationale behind this change is that not all platforms are window systems, |
| yet the EGL 1.4 specification uses the two terms interchangeably. In |
| particular, platforms that allow headless rendering without a display |
| server, such as GBM, are not window systems. |
| |
| Append the following paragraph to the initial, unnamed subsection of |
| section 2.1 "Native Window System and Rendering APIs". |
| |
| "This specification does not define the set of platforms that may be |
| supported by the EGL implementation, nor does it specify behavior specific |
| to any platform. The set of supported platforms and their behavior is |
| defined by extensions. To detect if a particular platform is supported, |
| clients should query the EGL_EXTENSIONS string of EGL_NO_DISPLAY using |
| eglQueryString. |
| |
| Replace the text of section 3.2 "Initialization", from the start of the |
| section and up to and excluding the phrase "EGL may be intialized on |
| a display", with the following: |
| |
| "A display can be obtained by calling |
| |
| EGLDisplay eglGetPlatformDisplayEXT( |
| EGLenum platform, |
| void *native_display, |
| const EGLint *attrib_list); |
| |
| EGL considers the returned EGLDisplay as belonging to the native platform |
| specified by <platform>. This specification defines no valid value for |
| <platform>. Any specification that does define a valid value for |
| <platform> will also define requirements for the <native_display> |
| parameter. For example, an extension specification that defines support |
| for the X11 platform may require that <native_display> be a pointer to an |
| X11 Display, and an extension specification that defines support for the |
| Microsoft Windows platform may require that <native_display> be a pointer |
| to a Windows Device Context. |
| |
| All attribute names in <attrib_list> are immediately followed by the |
| corresponding desired value. The list is terminated with EGL_NONE. The |
| <attrib_list> is considered empty if either <attrib_list> is NULL or if |
| its first element is EGL_NONE. This specification defines no valid |
| attribute names for <attrib_list>. |
| |
| Multiple calls made to eglGetPlatformDisplayEXT with the same <platform> |
| and <native_display> will return the same EGLDisplay handle. |
| |
| An EGL_BAD_PARAMETER error is generated if <platform> has an invalid value. |
| If <platform> is valid but no display matching <native_display> is |
| available, then EGL_NO_DISPLAY is returned; no error condition is raised |
| in this case. |
| |
| A display can also be obtained by calling |
| |
| EGLDisplay eglGetDisplay(EGLNativeDisplayType display_id); |
| |
| The behavior of eglGetDisplay is similar to that of |
| eglGetPlatformDisplayEXT, but is specifided in terms of implementation- |
| specific behavior rather than platform-specific extensions. |
| As for eglGetPlatformDisplayEXT, EGL considers the returned EGLDisplay |
| as belonging to the same platform as <display_id>. However, the set of |
| platforms to which <display_id> is permitted to belong, as well as the |
| actual type of <display_id>, are implementation-specific. If <display_id> |
| is EGL_DEFAULT_DISPLAY, a default display is returned. Multiple calls |
| made to eglGetDisplay with the same <display_id> will return the same |
| EGLDisplay handle. If no display matching <display_id> is available, |
| EGL_NO_DISPLAY is returned; no error condition is raised in this case." |
| |
| In section 3.5.1 "Creating On-Screen Rendering Surfaces", replace the |
| second paragraph, which begins with "Using the platform-specific type" and |
| ends with "render into this surface", with the following: |
| |
| "Then call |
| |
| EGLSurface eglCreatePlatformWindowSurfaceEXT( |
| EGLDisplay dpy, |
| EGLConfig config, |
| void *native_window, |
| const EGLint *attrib_list); |
| |
| eglCreatePlatformWindowSurfaceEXT creates an onscreen EGLSurface and |
| returns a handle to it. Any EGL context created with a compatible |
| EGLConfig can be used to render into this surface. |
| |
| <native_window> must belong to the same platform as <dpy>, and EGL |
| considers the returned EGLSurface as belonging to that same platform. The |
| extension that defines the platform to which <dpy> belongs also defines |
| the requirements for the <native_window> parameter." |
| |
| In the remainder of section 3.5.1, replace each occurrence of |
| 'eglCreateWindowSurface' with 'eglCreatePlatformWindowSurfaceEXT'. |
| |
| Insert the sentence below after the first sentence of the last paragraph |
| of section 3.5.1: |
| |
| "If <dpy> and <native_window> do not belong to the same platform, then |
| undefined behavior occurs. [1]" |
| |
| Add the following footnote to section 3.5.1: |
| |
| "[1] See section 3.1.0.2 "Parameter Validation". |
| |
| Append the following to section 3.5.1: |
| |
| "An on-screen rendering surface may also be created by calling |
| |
| EGLSurface eglCreateWindowSurface( |
| EGLDisplay dpy, |
| EGLConfig config, |
| EGLNativeWindowType win, |
| const EGLint *attrib_list); |
| |
| The behavior of eglCreateWindowSurface is identical to that of |
| eglCreatePlatformWindowSurfaceEXT except that the set of platforms to |
| which <dpy> is permitted to belong, as well as the actual type of <win>, |
| are implementation specific. |
| |
| In section 3.5.4 "Creating Native Pixmap Rendering Surfaces", replace the |
| third paragraph, which begins with "Using the platform-specific type" and |
| ends with "render into this surface", with the following: |
| |
| "Then call |
| |
| EGLSurface eglCreatePlatformPixmapSurfaceEXT( |
| EGLDisplay dpy, |
| EGLConfig config, |
| void *native_pixmap, |
| const EGLint *attrib_list); |
| |
| eglCreatePlatformPixmapSurfaceEXT creates an offscreen EGLSurface and |
| returns a handle to it. Any EGL context created with a compatible |
| EGLConfig can be used to render into this surface. |
| |
| <native_pixmap> must belong to the same platform as <dpy>, and EGL |
| considers the returned EGLSurface as belonging to that same platform. The |
| extension that defines the platform to which <dpy> belongs also defines |
| the requirements for the <native_pixmap> parameter." |
| |
| In the remainder of section 3.5.4, replace each occurrence of |
| 'eglCreatePixmapSurface' with 'eglCreatePlatformPixmapSurfaceEXT' and each |
| occurence of 'eglCreateWindowSurface' with |
| 'eglCreatePlatformWindowSurfaceEXT'. |
| |
| Insert the sentence below after the first sentence of the last paragraph |
| of section 3.5.4: |
| |
| "If <dpy> and <native_pixmap> do not belong to the same platform, then |
| undefined behavior occurs. [1]" |
| |
| Add the following footnote to section 3.5.3: |
| |
| "[1] See section 3.1.0.2 "Parameter Validation". |
| |
| Append the following to section 3.5.2: |
| |
| "An offscreen rendering surface may also be created by calling |
| |
| EGLSurface eglCreatePixmapSurface( |
| EGLDisplay dpy, |
| EGLConfig config, |
| EGLNativePixmapType pixmap, |
| const EGLint *attrib_list); |
| |
| The behavior of eglCreatePixmapSurface is identical to that of |
| eglCreatePlatformPixmapSurfaceEXT except that the set of platforms to |
| which <dpy> is permitted to belong, as well as the actual type of |
| <pixmap>, are implementation specific. |
| |
| Issues |
| |
| 1. What rules define how EGL resources are shared among displays belonging |
| to different platforms? |
| |
| RESOLVED: Neither the EGL 1.4 specification nor any extension allow EGL |
| resources to be shared among displays. This extension does not remove |
| that restriction. |
| |
| 2. Rather than define the new function eglGetPlatformDisplayEXT(), should |
| this extension instead define new thread-local state for the currently |
| bound platform and an associated binding function, such as |
| eglBindPlatformEXT()? |
| |
| RESOLVED: No, for the following reasons. |
| |
| - A current trend among the Khronos workgroups is to remove use of |
| global state by introducing bindless objects. Introducing a new |
| thread-local binding point defies that trend. |
| |
| - Additional specification language would be required to define |
| the interactions between the currently bound platform and all |
| EGL functions that accept an EGLDisplay. (For example, if the |
| currently bound platform is Wayland, then what is the result of |
| calling eglCreateWindowSurface() with a display and native |
| window belonging to X11?) By choosing to not introduce the |
| notion of a "currently bound platform", we obtain a cleaner |
| extension specification and eliminate for EGL users a class of |
| potential bugs. |
| |
| 3. Should this extension define the notion of a default platform? |
| |
| RESOLVED: No. eglGetDisplay() can be used if a default platform is |
| needed. |
| |
| 4. Rather than define the new functions |
| eglCreatePlatform{Window,Pixmap}SurfaceEXT(), should we instead |
| redefine the EGLNative* types in eglplatform.h as void*? |
| |
| RESOLVED: No, this introduces problems for X11 applications. |
| |
| Suppose that a 64-bit X11 application is compiled against an old EGL |
| library (where EGLNativeWindowType is a typedef for XID, which is in |
| turn a typedef for a 64-bit unsigned integer on Fedora 18) and then |
| attempts to run against a new EGL library (where EGLNativeType is |
| a typedef for void*). To preserve the ABI of eglCreateWindowSurface() |
| in this situation, the new EGL library must re-interpret the |
| <native_window> parameter as an integer. |
| |
| However, this preservation of the ABI breaks source compatibility for |
| existing X11 applications. To successfully compile, each call to |
| |
| eglCreateWindowSurface(dpy, window, attribs) |
| |
| in existing X11 application source code would need to be replaced with |
| |
| eglCreateWindowSurface(dpy, (void*) window, attribs) . |
| |
| Requiring such widespread code modifications would be an unnecessary |
| burden to developers and Linux package maintainers. |
| |
| Revision History |
| |
| Version 9, 2014.01.09 (Jon Leech) |
| - Fix typo eglGetDisplayPlatformEXT -> eglGetPlatformDisplayEXT |
| |
| Version 8, 2013.07.03 (Chad Versace) |
| - Add "Extension Type" section, required by EGL_EXT_client_extensions v9. |
| |
| Version 7, 2013.06.07 (Chad Versace) |
| - Fix some awkward text (s/the EGL/EGL/). |
| - Remove text "attribute names are defined by platform-specific |
| extensions". |
| |
| Version 6, 2013.06.07 (Chad Versace) |
| - To "Dependencies" section, expand text that discusses |
| EGL_EXT_client_extensions. |
| |
| Version 5, 2013.05.18 (Chad Versace) |
| - Removed restriction that "attribute names are defined only by |
| platform-specific extensions". |
| - Resolve issue 3 as NO. |
| - Clarified some text and fixed grammatical errors. |
| |
| Version 4, 2013.05.14 (Chad Versace) |
| - Add <attrib_list> parameter to eglGetPlatformDisplayEXT, per |
| feedback at the April Khronos F2F. |
| |
| Version 3, 2013.04.26 (Chad Versace) |
| - Add issues 2, 3, 4. |
| |
| Version 2, 2013.03.24 (Chad Versace) |
| - Complete draft by adding text for pixmaps. |
| - The footnotes regarding undefined behavior, simplify them by |
| simply referring to section 3.1.0.2. |
| - Add issue 1 from Eric Anholt <eric@anholt.net>. |
| - Fix spelling and formatting errors. |
| |
| Version 1, 2013.03.13 (Chad Versace) |
| - Incomplete draft posted for review |