102f4aeb0Sopenharmony_ciName
202f4aeb0Sopenharmony_ci
302f4aeb0Sopenharmony_ci    KHR_platform_x11
402f4aeb0Sopenharmony_ci
502f4aeb0Sopenharmony_ciName Strings
602f4aeb0Sopenharmony_ci
702f4aeb0Sopenharmony_ci    EGL_KHR_platform_x11
802f4aeb0Sopenharmony_ci
902f4aeb0Sopenharmony_ciContributors
1002f4aeb0Sopenharmony_ci
1102f4aeb0Sopenharmony_ci    Chad Versace <chad.versace@intel.com>
1202f4aeb0Sopenharmony_ci    James Jones <jajones@nvidia.com>
1302f4aeb0Sopenharmony_ci    Jon Leech (oddhack 'at' sonic.net)
1402f4aeb0Sopenharmony_ci
1502f4aeb0Sopenharmony_ciContacts
1602f4aeb0Sopenharmony_ci
1702f4aeb0Sopenharmony_ci    Chad Versace <chad.versace@intel.com>
1802f4aeb0Sopenharmony_ci
1902f4aeb0Sopenharmony_ciStatus
2002f4aeb0Sopenharmony_ci
2102f4aeb0Sopenharmony_ci    Complete.
2202f4aeb0Sopenharmony_ci    Approved by the EGL Working Group on January 31, 2014.
2302f4aeb0Sopenharmony_ci    Ratified by the Khronos Board of Promoters on March 14, 2014. 
2402f4aeb0Sopenharmony_ci
2502f4aeb0Sopenharmony_ciVersion
2602f4aeb0Sopenharmony_ci
2702f4aeb0Sopenharmony_ci    Version 3, 2014/02/18
2802f4aeb0Sopenharmony_ci
2902f4aeb0Sopenharmony_ciNumber
3002f4aeb0Sopenharmony_ci
3102f4aeb0Sopenharmony_ci    EGL Extension #71
3202f4aeb0Sopenharmony_ci
3302f4aeb0Sopenharmony_ciExtension Type
3402f4aeb0Sopenharmony_ci
3502f4aeb0Sopenharmony_ci    EGL client extension
3602f4aeb0Sopenharmony_ci
3702f4aeb0Sopenharmony_ciDependencies
3802f4aeb0Sopenharmony_ci
3902f4aeb0Sopenharmony_ci    EGL 1.5 is required.
4002f4aeb0Sopenharmony_ci
4102f4aeb0Sopenharmony_ci    This extension is written against the EGL 1.5 Specification (draft
4202f4aeb0Sopenharmony_ci    20140122).
4302f4aeb0Sopenharmony_ci
4402f4aeb0Sopenharmony_ciOverview
4502f4aeb0Sopenharmony_ci
4602f4aeb0Sopenharmony_ci    This extension defines how to create EGL resources from native X11
4702f4aeb0Sopenharmony_ci    resources using the EGL 1.5 platform functionality.
4802f4aeb0Sopenharmony_ci
4902f4aeb0Sopenharmony_ci    This extension only defines how to create EGL resources from Xlib
5002f4aeb0Sopenharmony_ci    resources. It does not define how to do so from xcb resources. All X11
5102f4aeb0Sopenharmony_ci    types discussed here are defined by the header `Xlib.h`.
5202f4aeb0Sopenharmony_ci
5302f4aeb0Sopenharmony_ciNew Types
5402f4aeb0Sopenharmony_ci
5502f4aeb0Sopenharmony_ci    None
5602f4aeb0Sopenharmony_ci
5702f4aeb0Sopenharmony_ciNew Procedures and Functions
5802f4aeb0Sopenharmony_ci
5902f4aeb0Sopenharmony_ci    None
6002f4aeb0Sopenharmony_ci
6102f4aeb0Sopenharmony_ciNew Tokens
6202f4aeb0Sopenharmony_ci
6302f4aeb0Sopenharmony_ci    Accepted as the <platform> argument of eglGetPlatformDisplay:
6402f4aeb0Sopenharmony_ci
6502f4aeb0Sopenharmony_ci        EGL_PLATFORM_X11_KHR                    0x31D5
6602f4aeb0Sopenharmony_ci
6702f4aeb0Sopenharmony_ci    Accepted as an attribute name in the <attrib_list> argument of
6802f4aeb0Sopenharmony_ci    eglGetPlatformDisplay:
6902f4aeb0Sopenharmony_ci
7002f4aeb0Sopenharmony_ci        EGL_PLATFORM_X11_SCREEN_KHR             0x31D6
7102f4aeb0Sopenharmony_ci
7202f4aeb0Sopenharmony_ciAdditions to the EGL Specification
7302f4aeb0Sopenharmony_ci
7402f4aeb0Sopenharmony_ci    None.
7502f4aeb0Sopenharmony_ci
7602f4aeb0Sopenharmony_ciNew Behavior
7702f4aeb0Sopenharmony_ci
7802f4aeb0Sopenharmony_ci    To determine if the EGL implementation supports this extension, clients
7902f4aeb0Sopenharmony_ci    should query the EGL_EXTENSIONS string of EGL_NO_DISPLAY.
8002f4aeb0Sopenharmony_ci
8102f4aeb0Sopenharmony_ci    On the X11 platform, an EGLDisplay refers to a specific X11 screen rather
8202f4aeb0Sopenharmony_ci    than an X11 display connection. This is the case because separate X11
8302f4aeb0Sopenharmony_ci    screens, even when belonging to the same X11 display connection, may
8402f4aeb0Sopenharmony_ci    reside on different GPUs and/or be driven by different drivers. Therefore,
8502f4aeb0Sopenharmony_ci    different X11 screens may have different EGL capabilities.
8602f4aeb0Sopenharmony_ci
8702f4aeb0Sopenharmony_ci    To obtain an EGLDisplay backed by an X11 screen, call eglGetPlatformDisplay
8802f4aeb0Sopenharmony_ci    with <platform> set to EGL_PLATFORM_X11_KHR. The <native_display> parameter
8902f4aeb0Sopenharmony_ci    specifies the X11 display connection to use, and must either point to
9002f4aeb0Sopenharmony_ci    a valid X11 `Display` or be EGL_DEFAULT_DISPLAY.  If <native_display> is
9102f4aeb0Sopenharmony_ci    EGL_DEFAULT_DISPLAY, then EGL will create [1] a connection to the default
9202f4aeb0Sopenharmony_ci    X11 display. The environment variable DISPLAY determines the default X11
9302f4aeb0Sopenharmony_ci    display as described in the manual page for XOpenDisplay(3).  The value of
9402f4aeb0Sopenharmony_ci    attribute EGL_PLATFORM_X11_SCREEN_KHR specifies the X11 screen to use. If
9502f4aeb0Sopenharmony_ci    the attribute is omitted from <attrib_list>, then the display connection's
9602f4aeb0Sopenharmony_ci    default screen is used.  Otherwise, the attribute's value must be a valid
9702f4aeb0Sopenharmony_ci    screen on the display connection. If the attribute's value is not a valid
9802f4aeb0Sopenharmony_ci    screen, then an EGL_BAD_ATTRIBUTE error is generated.
9902f4aeb0Sopenharmony_ci
10002f4aeb0Sopenharmony_ci    [fn1] The method by which EGL creates a connection to the default X11
10102f4aeb0Sopenharmony_ci    display is an internal implementation detail. The implementation may use
10202f4aeb0Sopenharmony_ci    XOpenDisplay, xcb_connect, or any other method.
10302f4aeb0Sopenharmony_ci    
10402f4aeb0Sopenharmony_ci    To obtain an on-screen rendering surface from an X11 Window, call
10502f4aeb0Sopenharmony_ci    eglCreatePlatformWindowSurface with a <dpy> that belongs to X11 and
10602f4aeb0Sopenharmony_ci    a <native_window> that points to an X11 Window.
10702f4aeb0Sopenharmony_ci
10802f4aeb0Sopenharmony_ci    To obtain an offscreen rendering surface from an X11 Pixmap, call
10902f4aeb0Sopenharmony_ci    eglCreatePlatformPixmapSurface with a <dpy> that belongs to X11 and
11002f4aeb0Sopenharmony_ci    a <native_pixmap> that points to an X11 Pixmap.
11102f4aeb0Sopenharmony_ci
11202f4aeb0Sopenharmony_ciIssues
11302f4aeb0Sopenharmony_ci
11402f4aeb0Sopenharmony_ci    1. Should this extension permit EGL_DEFAULT_DISPLAY as input to
11502f4aeb0Sopenharmony_ci       eglGetPlatformDisplay()?
11602f4aeb0Sopenharmony_ci
11702f4aeb0Sopenharmony_ci       RESOLVED. Yes. When given EGL_DEFAULT_DISPLAY, eglGetPlatformDisplay
11802f4aeb0Sopenharmony_ci       returns an EGLDisplay backed by the default X11 display.
11902f4aeb0Sopenharmony_ci
12002f4aeb0Sopenharmony_ci    2. When given EGL_DEFAULT_DISPLAY, does eglGetPlatformDisplay reuse an
12102f4aeb0Sopenharmony_ci       existing X11 display connection or create a new one?
12202f4aeb0Sopenharmony_ci
12302f4aeb0Sopenharmony_ci       RESOLVED. eglGetPlatformDisplay creates a new connection because the
12402f4aeb0Sopenharmony_ci       alternative is infeasible. EGL cannot reliably detect if the client
12502f4aeb0Sopenharmony_ci       process already has a X11 display connection.
12602f4aeb0Sopenharmony_ci
12702f4aeb0Sopenharmony_ciExample Code
12802f4aeb0Sopenharmony_ci
12902f4aeb0Sopenharmony_ci    // This example program creates two EGL surfaces: one from an X11 Window
13002f4aeb0Sopenharmony_ci    // and the other from an X11 Pixmap.
13102f4aeb0Sopenharmony_ci    //
13202f4aeb0Sopenharmony_ci    // If the macro USE_EGL_KHR_PLATFORM_X11 is defined, then the program
13302f4aeb0Sopenharmony_ci    // creates the surfaces using the methods defined in this specification.
13402f4aeb0Sopenharmony_ci    // Otherwise, it uses the methods defined by the EGL 1.4 specification.
13502f4aeb0Sopenharmony_ci    //
13602f4aeb0Sopenharmony_ci    // Compile with `cc -std=c99 example.c -lX11 -lEGL`.
13702f4aeb0Sopenharmony_ci
13802f4aeb0Sopenharmony_ci    #include <stdlib.h>
13902f4aeb0Sopenharmony_ci    #include <string.h>
14002f4aeb0Sopenharmony_ci
14102f4aeb0Sopenharmony_ci    #include <EGL/egl.h>
14202f4aeb0Sopenharmony_ci    #include <X11/Xlib.h>
14302f4aeb0Sopenharmony_ci
14402f4aeb0Sopenharmony_ci    struct my_display {
14502f4aeb0Sopenharmony_ci        Display *x11;
14602f4aeb0Sopenharmony_ci        EGLDisplay egl;
14702f4aeb0Sopenharmony_ci    };
14802f4aeb0Sopenharmony_ci
14902f4aeb0Sopenharmony_ci    struct my_config {
15002f4aeb0Sopenharmony_ci        struct my_display dpy;
15102f4aeb0Sopenharmony_ci        XVisualInfo *x11;
15202f4aeb0Sopenharmony_ci        Colormap colormap;
15302f4aeb0Sopenharmony_ci        EGLConfig egl;
15402f4aeb0Sopenharmony_ci    };
15502f4aeb0Sopenharmony_ci
15602f4aeb0Sopenharmony_ci    struct my_window {
15702f4aeb0Sopenharmony_ci        struct my_config config;
15802f4aeb0Sopenharmony_ci        Window x11;
15902f4aeb0Sopenharmony_ci        EGLSurface egl;
16002f4aeb0Sopenharmony_ci    };
16102f4aeb0Sopenharmony_ci
16202f4aeb0Sopenharmony_ci    struct my_pixmap {
16302f4aeb0Sopenharmony_ci        struct my_config config;
16402f4aeb0Sopenharmony_ci        Pixmap x11;
16502f4aeb0Sopenharmony_ci        EGLSurface egl;
16602f4aeb0Sopenharmony_ci    };
16702f4aeb0Sopenharmony_ci
16802f4aeb0Sopenharmony_ci    static void
16902f4aeb0Sopenharmony_ci    check_extensions(void)
17002f4aeb0Sopenharmony_ci    {
17102f4aeb0Sopenharmony_ci    #ifdef USE_EGL_KHR_PLATFORM_X11
17202f4aeb0Sopenharmony_ci        const char *client_extensions = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
17302f4aeb0Sopenharmony_ci
17402f4aeb0Sopenharmony_ci        if (!client_extensions) {
17502f4aeb0Sopenharmony_ci            // No client extensions string available
17602f4aeb0Sopenharmony_ci            abort();
17702f4aeb0Sopenharmony_ci        }
17802f4aeb0Sopenharmony_ci        if (!strstr(client_extensions, "EGL_KHR_platform_x11")) {
17902f4aeb0Sopenharmony_ci            abort();
18002f4aeb0Sopenharmony_ci        }
18102f4aeb0Sopenharmony_ci    #endif
18202f4aeb0Sopenharmony_ci    }
18302f4aeb0Sopenharmony_ci
18402f4aeb0Sopenharmony_ci    static struct my_display
18502f4aeb0Sopenharmony_ci    get_display(void)
18602f4aeb0Sopenharmony_ci    {
18702f4aeb0Sopenharmony_ci        struct my_display dpy;
18802f4aeb0Sopenharmony_ci
18902f4aeb0Sopenharmony_ci        dpy.x11 = XOpenDisplay(NULL);
19002f4aeb0Sopenharmony_ci        if (!dpy.x11) {
19102f4aeb0Sopenharmony_ci            abort();
19202f4aeb0Sopenharmony_ci        }
19302f4aeb0Sopenharmony_ci
19402f4aeb0Sopenharmony_ci    #ifdef USE_EGL_KHR_PLATFORM_X11
19502f4aeb0Sopenharmony_ci        dpy.egl = eglGetPlatformDisplay(EGL_PLATFORM_X11_KHR, dpy.x11, NULL);
19602f4aeb0Sopenharmony_ci    #else
19702f4aeb0Sopenharmony_ci        dpy.egl = eglGetDisplay(dpy.x11);
19802f4aeb0Sopenharmony_ci    #endif
19902f4aeb0Sopenharmony_ci
20002f4aeb0Sopenharmony_ci        if (dpy.egl == EGL_NO_DISPLAY) {
20102f4aeb0Sopenharmony_ci            abort();
20202f4aeb0Sopenharmony_ci        }
20302f4aeb0Sopenharmony_ci
20402f4aeb0Sopenharmony_ci        EGLint major, minor;
20502f4aeb0Sopenharmony_ci        if (!eglInitialize(dpy.egl, &major, &minor)) {
20602f4aeb0Sopenharmony_ci            abort();
20702f4aeb0Sopenharmony_ci        }
20802f4aeb0Sopenharmony_ci
20902f4aeb0Sopenharmony_ci        return dpy;
21002f4aeb0Sopenharmony_ci    }
21102f4aeb0Sopenharmony_ci
21202f4aeb0Sopenharmony_ci    static struct my_config
21302f4aeb0Sopenharmony_ci    get_config(struct my_display dpy)
21402f4aeb0Sopenharmony_ci    {
21502f4aeb0Sopenharmony_ci        struct my_config config = {
21602f4aeb0Sopenharmony_ci            .dpy = dpy,
21702f4aeb0Sopenharmony_ci        };
21802f4aeb0Sopenharmony_ci
21902f4aeb0Sopenharmony_ci        EGLint egl_config_attribs[] = {
22002f4aeb0Sopenharmony_ci            EGL_BUFFER_SIZE,        32,
22102f4aeb0Sopenharmony_ci            EGL_RED_SIZE,            8,
22202f4aeb0Sopenharmony_ci            EGL_GREEN_SIZE,          8,
22302f4aeb0Sopenharmony_ci            EGL_BLUE_SIZE,           8,
22402f4aeb0Sopenharmony_ci            EGL_ALPHA_SIZE,          8,
22502f4aeb0Sopenharmony_ci
22602f4aeb0Sopenharmony_ci            EGL_DEPTH_SIZE,         EGL_DONT_CARE,
22702f4aeb0Sopenharmony_ci            EGL_STENCIL_SIZE,       EGL_DONT_CARE,
22802f4aeb0Sopenharmony_ci
22902f4aeb0Sopenharmony_ci            EGL_RENDERABLE_TYPE,    EGL_OPENGL_ES2_BIT,
23002f4aeb0Sopenharmony_ci            EGL_SURFACE_TYPE,       EGL_WINDOW_BIT | EGL_PIXMAP_BIT,
23102f4aeb0Sopenharmony_ci            EGL_NONE,
23202f4aeb0Sopenharmony_ci        };
23302f4aeb0Sopenharmony_ci
23402f4aeb0Sopenharmony_ci        EGLint num_configs;
23502f4aeb0Sopenharmony_ci        if (!eglChooseConfig(dpy.egl,
23602f4aeb0Sopenharmony_ci                             egl_config_attribs,
23702f4aeb0Sopenharmony_ci                             &config.egl, 1,
23802f4aeb0Sopenharmony_ci                             &num_configs)) {
23902f4aeb0Sopenharmony_ci            abort();
24002f4aeb0Sopenharmony_ci        }
24102f4aeb0Sopenharmony_ci        if (num_configs == 0) {
24202f4aeb0Sopenharmony_ci            abort();
24302f4aeb0Sopenharmony_ci        }
24402f4aeb0Sopenharmony_ci
24502f4aeb0Sopenharmony_ci        XVisualInfo x11_visual_info_template;
24602f4aeb0Sopenharmony_ci        if (!eglGetConfigAttrib(dpy.egl,
24702f4aeb0Sopenharmony_ci                                config.egl,
24802f4aeb0Sopenharmony_ci                                EGL_NATIVE_VISUAL_ID,
24902f4aeb0Sopenharmony_ci                                (EGLint*) &x11_visual_info_template.visualid)) {
25002f4aeb0Sopenharmony_ci            abort();
25102f4aeb0Sopenharmony_ci        }
25202f4aeb0Sopenharmony_ci
25302f4aeb0Sopenharmony_ci        int num_visuals;
25402f4aeb0Sopenharmony_ci        config.x11 = XGetVisualInfo(dpy.x11,
25502f4aeb0Sopenharmony_ci                                    VisualIDMask,
25602f4aeb0Sopenharmony_ci                                    &x11_visual_info_template,
25702f4aeb0Sopenharmony_ci                                    &num_visuals);
25802f4aeb0Sopenharmony_ci        if (!config.x11) {
25902f4aeb0Sopenharmony_ci            abort();
26002f4aeb0Sopenharmony_ci        }
26102f4aeb0Sopenharmony_ci
26202f4aeb0Sopenharmony_ci        config.colormap = XCreateColormap(dpy.x11,
26302f4aeb0Sopenharmony_ci                                          RootWindow(dpy.x11, 0),
26402f4aeb0Sopenharmony_ci                                          config.x11->visual,
26502f4aeb0Sopenharmony_ci                                          AllocNone);
26602f4aeb0Sopenharmony_ci        if (config.colormap == None) {
26702f4aeb0Sopenharmony_ci            abort();
26802f4aeb0Sopenharmony_ci        }
26902f4aeb0Sopenharmony_ci
27002f4aeb0Sopenharmony_ci        return config;
27102f4aeb0Sopenharmony_ci    }
27202f4aeb0Sopenharmony_ci
27302f4aeb0Sopenharmony_ci    static struct my_window
27402f4aeb0Sopenharmony_ci    get_window(struct my_config config)
27502f4aeb0Sopenharmony_ci    {
27602f4aeb0Sopenharmony_ci        XSetWindowAttributes attr;
27702f4aeb0Sopenharmony_ci        unsigned long mask;
27802f4aeb0Sopenharmony_ci
27902f4aeb0Sopenharmony_ci        struct my_window window = {
28002f4aeb0Sopenharmony_ci            .config = config,
28102f4aeb0Sopenharmony_ci        };
28202f4aeb0Sopenharmony_ci
28302f4aeb0Sopenharmony_ci        attr.colormap = config.colormap;
28402f4aeb0Sopenharmony_ci        mask = CWColormap;
28502f4aeb0Sopenharmony_ci
28602f4aeb0Sopenharmony_ci        window.x11 = XCreateWindow(config.dpy.x11,
28702f4aeb0Sopenharmony_ci                                   DefaultRootWindow(config.dpy.x11), // parent
28802f4aeb0Sopenharmony_ci                                   0, 0, // x, y
28902f4aeb0Sopenharmony_ci                                   256, 256, // width, height
29002f4aeb0Sopenharmony_ci                                   0, // border_width
29102f4aeb0Sopenharmony_ci                                   config.x11->depth,
29202f4aeb0Sopenharmony_ci                                   InputOutput, // class
29302f4aeb0Sopenharmony_ci                                   config.x11->visual,
29402f4aeb0Sopenharmony_ci                                   mask, // valuemask
29502f4aeb0Sopenharmony_ci                                   &attr); // attributes
29602f4aeb0Sopenharmony_ci        if (!window.x11) {
29702f4aeb0Sopenharmony_ci            abort();
29802f4aeb0Sopenharmony_ci        }
29902f4aeb0Sopenharmony_ci
30002f4aeb0Sopenharmony_ci    #ifdef USE_EGL_KHR_PLATFORM_X11
30102f4aeb0Sopenharmony_ci        window.egl = eglCreatePlatformWindowSurface(config.dpy.egl,
30202f4aeb0Sopenharmony_ci                                                    config.egl,
30302f4aeb0Sopenharmony_ci                                                    &window.x11,
30402f4aeb0Sopenharmony_ci                                                    NULL);
30502f4aeb0Sopenharmony_ci    #else
30602f4aeb0Sopenharmony_ci        window.egl = eglCreateWindowSurface(config.dpy.egl,
30702f4aeb0Sopenharmony_ci                                            config.egl,
30802f4aeb0Sopenharmony_ci                                            window.x11,
30902f4aeb0Sopenharmony_ci                                            NULL);
31002f4aeb0Sopenharmony_ci    #endif
31102f4aeb0Sopenharmony_ci
31202f4aeb0Sopenharmony_ci        if (window.egl == EGL_NO_SURFACE) {
31302f4aeb0Sopenharmony_ci            abort();
31402f4aeb0Sopenharmony_ci        }
31502f4aeb0Sopenharmony_ci
31602f4aeb0Sopenharmony_ci        return window;
31702f4aeb0Sopenharmony_ci    }
31802f4aeb0Sopenharmony_ci
31902f4aeb0Sopenharmony_ci    static struct my_pixmap
32002f4aeb0Sopenharmony_ci    get_pixmap(struct my_config config)
32102f4aeb0Sopenharmony_ci    {
32202f4aeb0Sopenharmony_ci        struct my_pixmap pixmap = {
32302f4aeb0Sopenharmony_ci            .config = config,
32402f4aeb0Sopenharmony_ci        };
32502f4aeb0Sopenharmony_ci
32602f4aeb0Sopenharmony_ci        pixmap.x11 = XCreatePixmap(config.dpy.x11,
32702f4aeb0Sopenharmony_ci                                   DefaultRootWindow(config.dpy.x11),
32802f4aeb0Sopenharmony_ci                                   256, 256, // width, height
32902f4aeb0Sopenharmony_ci                                   config.x11->depth);
33002f4aeb0Sopenharmony_ci        if (!pixmap.x11) {
33102f4aeb0Sopenharmony_ci            abort();
33202f4aeb0Sopenharmony_ci        }
33302f4aeb0Sopenharmony_ci
33402f4aeb0Sopenharmony_ci    #ifdef USE_EGL_KHR_PLATFORM_X11
33502f4aeb0Sopenharmony_ci        pixmap.egl = eglCreatePlatformPixmapSurface(config.dpy.egl,
33602f4aeb0Sopenharmony_ci                                                    config.egl,
33702f4aeb0Sopenharmony_ci                                                    &pixmap.x11,
33802f4aeb0Sopenharmony_ci                                                    NULL);
33902f4aeb0Sopenharmony_ci    #else
34002f4aeb0Sopenharmony_ci        pixmap.egl = eglCreatePixmapSurface(config.dpy.egl,
34102f4aeb0Sopenharmony_ci                                            config.egl,
34202f4aeb0Sopenharmony_ci                                            pixmap.x11,
34302f4aeb0Sopenharmony_ci                                            NULL);
34402f4aeb0Sopenharmony_ci    #endif
34502f4aeb0Sopenharmony_ci
34602f4aeb0Sopenharmony_ci        if (pixmap.egl == EGL_NO_SURFACE) {
34702f4aeb0Sopenharmony_ci            abort();
34802f4aeb0Sopenharmony_ci        }
34902f4aeb0Sopenharmony_ci
35002f4aeb0Sopenharmony_ci        return pixmap;
35102f4aeb0Sopenharmony_ci    }
35202f4aeb0Sopenharmony_ci
35302f4aeb0Sopenharmony_ci    int
35402f4aeb0Sopenharmony_ci    main(void)
35502f4aeb0Sopenharmony_ci    {
35602f4aeb0Sopenharmony_ci        check_extensions();
35702f4aeb0Sopenharmony_ci
35802f4aeb0Sopenharmony_ci        struct my_display dpy = get_display();
35902f4aeb0Sopenharmony_ci        struct my_config config = get_config(dpy);
36002f4aeb0Sopenharmony_ci        struct my_window window = get_window(config);
36102f4aeb0Sopenharmony_ci        struct my_pixmap pixmap = get_pixmap(config);
36202f4aeb0Sopenharmony_ci
36302f4aeb0Sopenharmony_ci        return 0;
36402f4aeb0Sopenharmony_ci    }
36502f4aeb0Sopenharmony_ci
36602f4aeb0Sopenharmony_ciRevision History
36702f4aeb0Sopenharmony_ci
36802f4aeb0Sopenharmony_ci    Version 3, 2014/02/18 (Chad Versace)
36902f4aeb0Sopenharmony_ci        - Update text to reflect resolution of issue #1. State that
37002f4aeb0Sopenharmony_ci          <native_display> may be EGL_DEFAULT_DISPLAY.
37102f4aeb0Sopenharmony_ci        - Explain in more detail how EGL connects to the default X11 display.
37202f4aeb0Sopenharmony_ci        - Add and resolve issue #2.
37302f4aeb0Sopenharmony_ci
37402f4aeb0Sopenharmony_ci    Version 2, 2014/02/11 (Chad Versace)
37502f4aeb0Sopenharmony_ci        - Fix 2nd argument to XCreatePixmap in example code.
37602f4aeb0Sopenharmony_ci
37702f4aeb0Sopenharmony_ci    Version 1, 2014/01/22 (Jon Leech)
37802f4aeb0Sopenharmony_ci        - Promote EGL_EXT_platform_x11 to KHR to go with EGL 1.5.
379