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