102f4aeb0Sopenharmony_ciName
202f4aeb0Sopenharmony_ci
302f4aeb0Sopenharmony_ci    EXT_platform_xcb
402f4aeb0Sopenharmony_ci
502f4aeb0Sopenharmony_ciName Strings
602f4aeb0Sopenharmony_ci
702f4aeb0Sopenharmony_ci    EGL_EXT_platform_xcb
802f4aeb0Sopenharmony_ci
902f4aeb0Sopenharmony_ciContributors
1002f4aeb0Sopenharmony_ci
1102f4aeb0Sopenharmony_ci    Yuxuan Shui <yshuiv7@gmail.com>
1202f4aeb0Sopenharmony_ci
1302f4aeb0Sopenharmony_ciContacts
1402f4aeb0Sopenharmony_ci
1502f4aeb0Sopenharmony_ci    Yuxuan Shui <yshuiv7@gmail.com>
1602f4aeb0Sopenharmony_ci
1702f4aeb0Sopenharmony_ciStatus
1802f4aeb0Sopenharmony_ci
1902f4aeb0Sopenharmony_ci    Complete
2002f4aeb0Sopenharmony_ci
2102f4aeb0Sopenharmony_ciVersion
2202f4aeb0Sopenharmony_ci
2302f4aeb0Sopenharmony_ci    Version 1, 2020-08-28
2402f4aeb0Sopenharmony_ci
2502f4aeb0Sopenharmony_ciNumber
2602f4aeb0Sopenharmony_ci
2702f4aeb0Sopenharmony_ci    EGL Extension #141
2802f4aeb0Sopenharmony_ci
2902f4aeb0Sopenharmony_ciExtension Type
3002f4aeb0Sopenharmony_ci
3102f4aeb0Sopenharmony_ci    EGL client extension
3202f4aeb0Sopenharmony_ci
3302f4aeb0Sopenharmony_ciDependencies
3402f4aeb0Sopenharmony_ci
3502f4aeb0Sopenharmony_ci    Requires EGL_EXT_client_extensions to query its existence without
3602f4aeb0Sopenharmony_ci    a display.
3702f4aeb0Sopenharmony_ci
3802f4aeb0Sopenharmony_ci    Requires EGL_EXT_platform_base.
3902f4aeb0Sopenharmony_ci
4002f4aeb0Sopenharmony_ci    This extension is written against the wording of version 9 of the
4102f4aeb0Sopenharmony_ci    EGL_EXT_platform_base specification.
4202f4aeb0Sopenharmony_ci
4302f4aeb0Sopenharmony_ciOverview
4402f4aeb0Sopenharmony_ci
4502f4aeb0Sopenharmony_ci    This extension defines how to create EGL resources from native X11
4602f4aeb0Sopenharmony_ci    resources using the functions defined by EGL_EXT_platform_base.
4702f4aeb0Sopenharmony_ci
4802f4aeb0Sopenharmony_ci    The native X11 resources required by this extension are xcb resources.
4902f4aeb0Sopenharmony_ci    All X11 types discussed here are defined by the header `xcb.h`.
5002f4aeb0Sopenharmony_ci
5102f4aeb0Sopenharmony_ciNew Types
5202f4aeb0Sopenharmony_ci
5302f4aeb0Sopenharmony_ci    None
5402f4aeb0Sopenharmony_ci
5502f4aeb0Sopenharmony_ciNew Procedures and Functions
5602f4aeb0Sopenharmony_ci
5702f4aeb0Sopenharmony_ci    None
5802f4aeb0Sopenharmony_ci
5902f4aeb0Sopenharmony_ciNew Tokens
6002f4aeb0Sopenharmony_ci
6102f4aeb0Sopenharmony_ci    Accepted as the <platform> argument of eglGetPlatformDisplayEXT:
6202f4aeb0Sopenharmony_ci
6302f4aeb0Sopenharmony_ci        EGL_PLATFORM_XCB_EXT                    0x31DC
6402f4aeb0Sopenharmony_ci
6502f4aeb0Sopenharmony_ci    Accepted as an attribute name in the <attrib_list> argument of
6602f4aeb0Sopenharmony_ci    eglGetPlatformDisplayEXT:
6702f4aeb0Sopenharmony_ci
6802f4aeb0Sopenharmony_ci        EGL_PLATFORM_XCB_SCREEN_EXT             0x31DE
6902f4aeb0Sopenharmony_ci
7002f4aeb0Sopenharmony_ciAdditions to the EGL Specification
7102f4aeb0Sopenharmony_ci
7202f4aeb0Sopenharmony_ci    None.
7302f4aeb0Sopenharmony_ci
7402f4aeb0Sopenharmony_ciNew Behavior
7502f4aeb0Sopenharmony_ci
7602f4aeb0Sopenharmony_ci    To determine if the EGL implementation supports this extension, clients
7702f4aeb0Sopenharmony_ci    should query the EGL_EXTENSIONS string of EGL_NO_DISPLAY.
7802f4aeb0Sopenharmony_ci
7902f4aeb0Sopenharmony_ci    This extension defines the same set of behaviors as EGL_EXT_platform_x11,
8002f4aeb0Sopenharmony_ci    except Xlib types are replaced with xcb types.
8102f4aeb0Sopenharmony_ci
8202f4aeb0Sopenharmony_ci    To obtain an EGLDisplay backed by an X11 screen, call
8302f4aeb0Sopenharmony_ci    eglGetPlatformDisplayEXT with <platform> set to EGL_PLATFORM_XCB_EXT. The
8402f4aeb0Sopenharmony_ci    <native_display> parameter specifies the X11 display connection to use, and
8502f4aeb0Sopenharmony_ci    must point to a valid xcb `xcb_connection_t` or be EGL_DEFAULT_DISPLAY.  If
8602f4aeb0Sopenharmony_ci    <native_display> is EGL_DEFAULT_DISPLAY, then EGL will create [1] a
8702f4aeb0Sopenharmony_ci    connection to the default X11 display. The environment variable DISPLAY
8802f4aeb0Sopenharmony_ci    determines the default X11 display, and, unless overridden by the
8902f4aeb0Sopenharmony_ci    EGL_PLATFORM_XCB_SCREEN_EXT attribute, the default X11 screen - as
9002f4aeb0Sopenharmony_ci    described in the documentation of `xcb_connect`.  If the environment
9102f4aeb0Sopenharmony_ci    variable DISPLAY is not present in this case, the result is undefined. The
9202f4aeb0Sopenharmony_ci    value of attribute EGL_PLATFORM_XCB_SCREEN_EXT specifies the X11 screen to
9302f4aeb0Sopenharmony_ci    use. If the attribute is omitted from <attrib_list>, and <native_display>
9402f4aeb0Sopenharmony_ci    is not EGL_DEFAULT_DISPLAY, then screen 0 will be used. Otherwise, the
9502f4aeb0Sopenharmony_ci    attribute's value must be a valid screen on the display connection. If the
9602f4aeb0Sopenharmony_ci    attribute's value is not a valid screen, then an EGL_BAD_ATTRIBUTE error is
9702f4aeb0Sopenharmony_ci    generated.
9802f4aeb0Sopenharmony_ci
9902f4aeb0Sopenharmony_ci    [fn1] The method by which EGL creates a connection to the default X11
10002f4aeb0Sopenharmony_ci    display is an internal implementation detail. The implementation may use
10102f4aeb0Sopenharmony_ci    xcb_connect, or any other method.
10202f4aeb0Sopenharmony_ci
10302f4aeb0Sopenharmony_ci    To obtain an on-screen rendering surface from an X11 Window, call
10402f4aeb0Sopenharmony_ci    eglCreatePlatformWindowSurfaceEXT with a <dpy> that belongs to X11 and
10502f4aeb0Sopenharmony_ci    a <native_window> that points to an xcb_window_t.
10602f4aeb0Sopenharmony_ci
10702f4aeb0Sopenharmony_ci    To obtain an offscreen rendering surface from an X11 Pixmap, call
10802f4aeb0Sopenharmony_ci    eglCreatePlatformPixmapSurfaceEXT with a <dpy> that belongs to X11 and
10902f4aeb0Sopenharmony_ci    a <native_pixmap> that points to an xcb_pixmap_t.
11002f4aeb0Sopenharmony_ci
11102f4aeb0Sopenharmony_ciIssues
11202f4aeb0Sopenharmony_ci
11302f4aeb0Sopenharmony_ci    1. As xcb_connection_t doesn't carry a screen number, how should a screen be
11402f4aeb0Sopenharmony_ci       selected in eglGetPlatformDisplayEXT()?
11502f4aeb0Sopenharmony_ci
11602f4aeb0Sopenharmony_ci       RESOLVED. The screen will be chosen with the following logic:
11702f4aeb0Sopenharmony_ci
11802f4aeb0Sopenharmony_ci         * If EGL_PLATFORM_XCB_SCREEN_EXT is specified, it will always take
11902f4aeb0Sopenharmony_ci           precedence. Whether <native_display> is EGL_DEFAULT_DISPLAY or not.
12002f4aeb0Sopenharmony_ci
12102f4aeb0Sopenharmony_ci         * Otherwise, if <native_display> is not EGL_DEFAULT_DISPLAY, then
12202f4aeb0Sopenharmony_ci           screen 0 will be used.
12302f4aeb0Sopenharmony_ci
12402f4aeb0Sopenharmony_ci         * Otherwise, which is to say <native_display> is EGL_DEFAULT_DISPLAY.
12502f4aeb0Sopenharmony_ci           Then the DISPLAY environment variable will be used to determine the
12602f4aeb0Sopenharmony_ci           screen number. If DISPLAY contains a screen number, that will be
12702f4aeb0Sopenharmony_ci           used; if not, then 0 will be used.
12802f4aeb0Sopenharmony_ci
12902f4aeb0Sopenharmony_ci         * If the DISPLAY environment variable is not present when
13002f4aeb0Sopenharmony_ci           <native_display> is EGL_DEFAULT_DISPLAY, the result will be undefined.
13102f4aeb0Sopenharmony_ci
13202f4aeb0Sopenharmony_ciExample Code
13302f4aeb0Sopenharmony_ci
13402f4aeb0Sopenharmony_ci    // This example program creates two EGL surfaces: one from an X11 Window
13502f4aeb0Sopenharmony_ci    // and the other from an X11 Pixmap.
13602f4aeb0Sopenharmony_ci    //
13702f4aeb0Sopenharmony_ci    // Compile with `cc example.c -lxcb -lEGL`.
13802f4aeb0Sopenharmony_ci
13902f4aeb0Sopenharmony_ci    #include <stddef.h>
14002f4aeb0Sopenharmony_ci    #include <stdlib.h>
14102f4aeb0Sopenharmony_ci    #include <string.h>
14202f4aeb0Sopenharmony_ci
14302f4aeb0Sopenharmony_ci    #include <EGL/egl.h>
14402f4aeb0Sopenharmony_ci    #include <EGL/eglext.h>
14502f4aeb0Sopenharmony_ci    #include <xcb/xcb.h>
14602f4aeb0Sopenharmony_ci
14702f4aeb0Sopenharmony_ci    struct my_display {
14802f4aeb0Sopenharmony_ci        xcb_connection_t *x11;
14902f4aeb0Sopenharmony_ci        int screen;
15002f4aeb0Sopenharmony_ci        int root_of_screen;
15102f4aeb0Sopenharmony_ci        EGLDisplay egl;
15202f4aeb0Sopenharmony_ci    };
15302f4aeb0Sopenharmony_ci
15402f4aeb0Sopenharmony_ci    struct my_config {
15502f4aeb0Sopenharmony_ci        struct my_display dpy;
15602f4aeb0Sopenharmony_ci        xcb_colormap_t colormap;
15702f4aeb0Sopenharmony_ci        xcb_visualid_t visualid;
15802f4aeb0Sopenharmony_ci        int depth;
15902f4aeb0Sopenharmony_ci        EGLConfig egl;
16002f4aeb0Sopenharmony_ci    };
16102f4aeb0Sopenharmony_ci
16202f4aeb0Sopenharmony_ci    struct my_window {
16302f4aeb0Sopenharmony_ci        struct my_config config;
16402f4aeb0Sopenharmony_ci        xcb_window_t x11;
16502f4aeb0Sopenharmony_ci        EGLSurface egl;
16602f4aeb0Sopenharmony_ci    };
16702f4aeb0Sopenharmony_ci
16802f4aeb0Sopenharmony_ci    struct my_pixmap {
16902f4aeb0Sopenharmony_ci        struct my_config config;
17002f4aeb0Sopenharmony_ci        xcb_pixmap_t x11;
17102f4aeb0Sopenharmony_ci        EGLSurface egl;
17202f4aeb0Sopenharmony_ci    };
17302f4aeb0Sopenharmony_ci
17402f4aeb0Sopenharmony_ci    static void check_extensions(void) {
17502f4aeb0Sopenharmony_ci        const char *client_extensions =
17602f4aeb0Sopenharmony_ci            eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS);
17702f4aeb0Sopenharmony_ci
17802f4aeb0Sopenharmony_ci        if (!client_extensions) {
17902f4aeb0Sopenharmony_ci            // EGL_EXT_client_extensions is unsupported.
18002f4aeb0Sopenharmony_ci            abort();
18102f4aeb0Sopenharmony_ci        }
18202f4aeb0Sopenharmony_ci        if (!strstr(client_extensions, "EGL_EXT_platform_xcb")) {
18302f4aeb0Sopenharmony_ci            abort();
18402f4aeb0Sopenharmony_ci        }
18502f4aeb0Sopenharmony_ci    }
18602f4aeb0Sopenharmony_ci
18702f4aeb0Sopenharmony_ci    xcb_screen_t *get_screen(xcb_connection_t *c, int screen) {
18802f4aeb0Sopenharmony_ci        xcb_screen_iterator_t iter;
18902f4aeb0Sopenharmony_ci
19002f4aeb0Sopenharmony_ci        iter = xcb_setup_roots_iterator(xcb_get_setup(c));
19102f4aeb0Sopenharmony_ci        for (; iter.rem; --screen, xcb_screen_next(&iter))
19202f4aeb0Sopenharmony_ci            if (screen == 0)
19302f4aeb0Sopenharmony_ci                return iter.data;
19402f4aeb0Sopenharmony_ci
19502f4aeb0Sopenharmony_ci        return NULL;
19602f4aeb0Sopenharmony_ci    }
19702f4aeb0Sopenharmony_ci
19802f4aeb0Sopenharmony_ci    int get_visual_depth(xcb_connection_t *c, xcb_visualid_t visual) {
19902f4aeb0Sopenharmony_ci        const xcb_setup_t *setup = xcb_get_setup(c);
20002f4aeb0Sopenharmony_ci        for (xcb_screen_iterator_t i = xcb_setup_roots_iterator(setup); i.rem;
20102f4aeb0Sopenharmony_ci             xcb_screen_next(&i)) {
20202f4aeb0Sopenharmony_ci            for (xcb_depth_iterator_t j =
20302f4aeb0Sopenharmony_ci                     xcb_screen_allowed_depths_iterator(i.data);
20402f4aeb0Sopenharmony_ci                 j.rem; xcb_depth_next(&j)) {
20502f4aeb0Sopenharmony_ci                const int len = xcb_depth_visuals_length(j.data);
20602f4aeb0Sopenharmony_ci                const xcb_visualtype_t *visuals = xcb_depth_visuals(j.data);
20702f4aeb0Sopenharmony_ci                for (int k = 0; k < len; k++) {
20802f4aeb0Sopenharmony_ci                    if (visual == visuals[k].visual_id) {
20902f4aeb0Sopenharmony_ci                        return j.data->depth;
21002f4aeb0Sopenharmony_ci                    }
21102f4aeb0Sopenharmony_ci                }
21202f4aeb0Sopenharmony_ci            }
21302f4aeb0Sopenharmony_ci        }
21402f4aeb0Sopenharmony_ci        abort();
21502f4aeb0Sopenharmony_ci    }
21602f4aeb0Sopenharmony_ci
21702f4aeb0Sopenharmony_ci    static struct my_display get_display(void) {
21802f4aeb0Sopenharmony_ci        struct my_display dpy;
21902f4aeb0Sopenharmony_ci
22002f4aeb0Sopenharmony_ci        dpy.x11 = xcb_connect(NULL, &dpy.screen);
22102f4aeb0Sopenharmony_ci        if (!dpy.x11) {
22202f4aeb0Sopenharmony_ci            abort();
22302f4aeb0Sopenharmony_ci        }
22402f4aeb0Sopenharmony_ci
22502f4aeb0Sopenharmony_ci        dpy.egl = eglGetPlatformDisplayEXT(EGL_PLATFORM_XCB_EXT, dpy.x11,
22602f4aeb0Sopenharmony_ci                                           (const EGLint[]){
22702f4aeb0Sopenharmony_ci                                               EGL_PLATFORM_XCB_SCREEN_EXT,
22802f4aeb0Sopenharmony_ci                                               dpy.screen,
22902f4aeb0Sopenharmony_ci                                               EGL_NONE,
23002f4aeb0Sopenharmony_ci                                           });
23102f4aeb0Sopenharmony_ci
23202f4aeb0Sopenharmony_ci        if (dpy.egl == EGL_NO_DISPLAY) {
23302f4aeb0Sopenharmony_ci            abort();
23402f4aeb0Sopenharmony_ci        }
23502f4aeb0Sopenharmony_ci
23602f4aeb0Sopenharmony_ci        EGLint major, minor;
23702f4aeb0Sopenharmony_ci        if (!eglInitialize(dpy.egl, &major, &minor)) {
23802f4aeb0Sopenharmony_ci            abort();
23902f4aeb0Sopenharmony_ci        }
24002f4aeb0Sopenharmony_ci
24102f4aeb0Sopenharmony_ci        xcb_screen_t *screen = get_screen(dpy.x11, dpy.screen);
24202f4aeb0Sopenharmony_ci        dpy.root_of_screen = screen->root;
24302f4aeb0Sopenharmony_ci
24402f4aeb0Sopenharmony_ci        return dpy;
24502f4aeb0Sopenharmony_ci    }
24602f4aeb0Sopenharmony_ci
24702f4aeb0Sopenharmony_ci    static struct my_config get_config(struct my_display dpy) {
24802f4aeb0Sopenharmony_ci        struct my_config config = {
24902f4aeb0Sopenharmony_ci            .dpy = dpy,
25002f4aeb0Sopenharmony_ci        };
25102f4aeb0Sopenharmony_ci
25202f4aeb0Sopenharmony_ci        EGLint egl_config_attribs[] = {
25302f4aeb0Sopenharmony_ci            EGL_BUFFER_SIZE,
25402f4aeb0Sopenharmony_ci            32,
25502f4aeb0Sopenharmony_ci            EGL_RED_SIZE,
25602f4aeb0Sopenharmony_ci            8,
25702f4aeb0Sopenharmony_ci            EGL_GREEN_SIZE,
25802f4aeb0Sopenharmony_ci            8,
25902f4aeb0Sopenharmony_ci            EGL_BLUE_SIZE,
26002f4aeb0Sopenharmony_ci            8,
26102f4aeb0Sopenharmony_ci            EGL_ALPHA_SIZE,
26202f4aeb0Sopenharmony_ci            8,
26302f4aeb0Sopenharmony_ci
26402f4aeb0Sopenharmony_ci            EGL_DEPTH_SIZE,
26502f4aeb0Sopenharmony_ci            EGL_DONT_CARE,
26602f4aeb0Sopenharmony_ci            EGL_STENCIL_SIZE,
26702f4aeb0Sopenharmony_ci            EGL_DONT_CARE,
26802f4aeb0Sopenharmony_ci
26902f4aeb0Sopenharmony_ci            EGL_RENDERABLE_TYPE,
27002f4aeb0Sopenharmony_ci            EGL_OPENGL_ES2_BIT,
27102f4aeb0Sopenharmony_ci            EGL_SURFACE_TYPE,
27202f4aeb0Sopenharmony_ci            EGL_WINDOW_BIT | EGL_PIXMAP_BIT,
27302f4aeb0Sopenharmony_ci            EGL_NONE,
27402f4aeb0Sopenharmony_ci        };
27502f4aeb0Sopenharmony_ci
27602f4aeb0Sopenharmony_ci        EGLint num_configs;
27702f4aeb0Sopenharmony_ci        if (!eglChooseConfig(dpy.egl, egl_config_attribs, &config.egl, 1,
27802f4aeb0Sopenharmony_ci                             &num_configs)) {
27902f4aeb0Sopenharmony_ci            abort();
28002f4aeb0Sopenharmony_ci        }
28102f4aeb0Sopenharmony_ci        if (num_configs == 0) {
28202f4aeb0Sopenharmony_ci            abort();
28302f4aeb0Sopenharmony_ci        }
28402f4aeb0Sopenharmony_ci
28502f4aeb0Sopenharmony_ci        if (!eglGetConfigAttrib(dpy.egl, config.egl, EGL_NATIVE_VISUAL_ID,
28602f4aeb0Sopenharmony_ci                                (EGLint *)&config.visualid)) {
28702f4aeb0Sopenharmony_ci            abort();
28802f4aeb0Sopenharmony_ci        }
28902f4aeb0Sopenharmony_ci
29002f4aeb0Sopenharmony_ci        config.colormap = xcb_generate_id(dpy.x11);
29102f4aeb0Sopenharmony_ci        if (xcb_request_check(dpy.x11,
29202f4aeb0Sopenharmony_ci                              xcb_create_colormap_checked(
29302f4aeb0Sopenharmony_ci                                  dpy.x11, XCB_COLORMAP_ALLOC_NONE, config.colormap,
29402f4aeb0Sopenharmony_ci                                  dpy.root_of_screen, config.visualid))) {
29502f4aeb0Sopenharmony_ci            abort();
29602f4aeb0Sopenharmony_ci        }
29702f4aeb0Sopenharmony_ci
29802f4aeb0Sopenharmony_ci        config.depth = get_visual_depth(dpy.x11, config.visualid);
29902f4aeb0Sopenharmony_ci
30002f4aeb0Sopenharmony_ci        return config;
30102f4aeb0Sopenharmony_ci    }
30202f4aeb0Sopenharmony_ci
30302f4aeb0Sopenharmony_ci    static struct my_window get_window(struct my_config config) {
30402f4aeb0Sopenharmony_ci        xcb_generic_error_t *e;
30502f4aeb0Sopenharmony_ci
30602f4aeb0Sopenharmony_ci        struct my_window window = {
30702f4aeb0Sopenharmony_ci            .config = config,
30802f4aeb0Sopenharmony_ci        };
30902f4aeb0Sopenharmony_ci
31002f4aeb0Sopenharmony_ci        window.x11 = xcb_generate_id(config.dpy.x11);
31102f4aeb0Sopenharmony_ci        e = xcb_request_check(
31202f4aeb0Sopenharmony_ci            config.dpy.x11,
31302f4aeb0Sopenharmony_ci            xcb_create_window_checked(config.dpy.x11,            // connection
31402f4aeb0Sopenharmony_ci                                      XCB_COPY_FROM_PARENT,      // depth
31502f4aeb0Sopenharmony_ci                                      window.x11,                // window id
31602f4aeb0Sopenharmony_ci                                      config.dpy.root_of_screen, // root
31702f4aeb0Sopenharmony_ci                                      0, 0,                      // x, y
31802f4aeb0Sopenharmony_ci                                      256, 256,                  // width, height
31902f4aeb0Sopenharmony_ci                                      0,                         // border_width
32002f4aeb0Sopenharmony_ci                                      XCB_WINDOW_CLASS_INPUT_OUTPUT, // class
32102f4aeb0Sopenharmony_ci                                      config.visualid,               // visual
32202f4aeb0Sopenharmony_ci                                      XCB_CW_COLORMAP,               // mask
32302f4aeb0Sopenharmony_ci                                      (const int[]){
32402f4aeb0Sopenharmony_ci                                          config.colormap,
32502f4aeb0Sopenharmony_ci                                          XCB_NONE,
32602f4aeb0Sopenharmony_ci                                      }));
32702f4aeb0Sopenharmony_ci        if (e) {
32802f4aeb0Sopenharmony_ci            abort();
32902f4aeb0Sopenharmony_ci        }
33002f4aeb0Sopenharmony_ci
33102f4aeb0Sopenharmony_ci        window.egl = eglCreatePlatformWindowSurfaceEXT(config.dpy.egl, config.egl,
33202f4aeb0Sopenharmony_ci                                                       &window.x11, NULL);
33302f4aeb0Sopenharmony_ci
33402f4aeb0Sopenharmony_ci        if (window.egl == EGL_NO_SURFACE) {
33502f4aeb0Sopenharmony_ci            abort();
33602f4aeb0Sopenharmony_ci        }
33702f4aeb0Sopenharmony_ci
33802f4aeb0Sopenharmony_ci        return window;
33902f4aeb0Sopenharmony_ci    }
34002f4aeb0Sopenharmony_ci
34102f4aeb0Sopenharmony_ci    static struct my_pixmap get_pixmap(struct my_config config) {
34202f4aeb0Sopenharmony_ci        struct my_pixmap pixmap = {
34302f4aeb0Sopenharmony_ci            .config = config,
34402f4aeb0Sopenharmony_ci        };
34502f4aeb0Sopenharmony_ci
34602f4aeb0Sopenharmony_ci        pixmap.x11 = xcb_generate_id(config.dpy.x11);
34702f4aeb0Sopenharmony_ci        if (xcb_request_check(
34802f4aeb0Sopenharmony_ci                config.dpy.x11,
34902f4aeb0Sopenharmony_ci                xcb_create_pixmap(config.dpy.x11, config.depth, pixmap.x11,
35002f4aeb0Sopenharmony_ci                                  config.dpy.root_of_screen, 256, 256))) {
35102f4aeb0Sopenharmony_ci            abort();
35202f4aeb0Sopenharmony_ci        }
35302f4aeb0Sopenharmony_ci
35402f4aeb0Sopenharmony_ci        pixmap.egl = eglCreatePlatformPixmapSurfaceEXT(config.dpy.egl, config.egl,
35502f4aeb0Sopenharmony_ci                                                       &pixmap.x11, NULL);
35602f4aeb0Sopenharmony_ci
35702f4aeb0Sopenharmony_ci        if (pixmap.egl == EGL_NO_SURFACE) {
35802f4aeb0Sopenharmony_ci            abort();
35902f4aeb0Sopenharmony_ci        }
36002f4aeb0Sopenharmony_ci
36102f4aeb0Sopenharmony_ci        return pixmap;
36202f4aeb0Sopenharmony_ci    }
36302f4aeb0Sopenharmony_ci
36402f4aeb0Sopenharmony_ci    int main(void) {
36502f4aeb0Sopenharmony_ci        check_extensions();
36602f4aeb0Sopenharmony_ci
36702f4aeb0Sopenharmony_ci        struct my_display dpy = get_display();
36802f4aeb0Sopenharmony_ci        struct my_config config = get_config(dpy);
36902f4aeb0Sopenharmony_ci        struct my_window window = get_window(config);
37002f4aeb0Sopenharmony_ci        struct my_pixmap pixmap = get_pixmap(config);
37102f4aeb0Sopenharmony_ci
37202f4aeb0Sopenharmony_ci        return 0;
37302f4aeb0Sopenharmony_ci    }
37402f4aeb0Sopenharmony_ci
37502f4aeb0Sopenharmony_ciRevision History
37602f4aeb0Sopenharmony_ci
37702f4aeb0Sopenharmony_ci    Version 2, 2020.10.13 (Yuxuan Shui)
37802f4aeb0Sopenharmony_ci        - Some wording changes
37902f4aeb0Sopenharmony_ci        - Address the question about screen selection
38002f4aeb0Sopenharmony_ci
38102f4aeb0Sopenharmony_ci    Version 1, 2020.08.28 (Yuxuan Shui)
38202f4aeb0Sopenharmony_ci        - First draft
383