如何为GPGPU创建不可见的X11窗口?

问题描述 投票:0回答:2

是否可以创建一个不可见的X窗口?为了初始化 OpenGL ES 2.0 上下文,必须手动创建一个 X 窗口,但我找不到一种方法让它不可见。因为我只做 GPGPU,所以不需要输出窗口。事实上,就我而言,这相当烦人。

我知道来自早期问题的解决方案,其中指出在

InputOnly
中使用
XCreateWindow()
。然而,这会导致 X 错误
GLXBadDrawable
。可能是因为EGL需要窗口响应图形请求。还有别的办法吗?也许将其最小化?但我也找不到任何相关内容。另外,将窗口尺寸设置得非常小也没有帮助,因为它总是占据我的设备(诺基亚 N9)上的整个屏幕。

x11 opengl-es-2.0 gpgpu egl
2个回答
3
投票

当您创建 X 窗口时,它是在未映射的情况下创建的,那么创建一个 InputOutput 窗口并使其保持未映射状态又如何呢?另一种选择是将其移出屏幕(如果窗口必须保持映射状态)。


0
投票
  1. 创建一个具有属性
    _NET_WM_STATE_SKIP_TASKBAR
    的窗口。
  2. 将其图标化。

#include <stdio.h>
#include <stdlib.h>
#include <X11/Xatom.h>
#include <X11/Xlib.h>


Window createWindow(Display* display, int screen) {
    Window window = XCreateSimpleWindow(
        display,
        RootWindow(display, screen),
        0, 0, 100, 100, 4,
        BlackPixel(display, screen),
        WhitePixel(display, screen)
    );

    return window;
}


Display* openDisplay() {
    Display *display = XOpenDisplay(NULL);

    if (!display) {
        fprintf(stderr, "No display\n");
        exit(EXIT_FAILURE);
    }

    return display;
}


int setWindowProperties(Display* display, Window window) {
    Atom skipTaskbar = XInternAtom(display, "_NET_WM_STATE_SKIP_TASKBAR", False);

    XChangeProperty(
        display,
        window,
        XInternAtom(display, "_NET_WM_STATE", False),
        XA_ATOM, 32,
        PropModeReplace,
        (unsigned char *) &skipTaskbar, 1
    );
}


int waitWindowClose(Display* display, Window window) {
    XEvent event;
    Atom delete = XInternAtom(display, "WM_DELETE_WINDOW", False);
    XSetWMProtocols(display, window, &delete, 1);

    while (event.type != ClientMessage && event.xclient.data.l[0] != delete) {
        XNextEvent(display, &event);
    }
}


int main() {
    Display* display = openDisplay();
    int screen = DefaultScreen(display);

    Window window = createWindow(display, screen);
    setWindowProperties(display, window);

    XMapWindow(display, window);
    XIconifyWindow(display, window, screen);
    XFlush(display);

    waitWindowClose(display, window);
}

© www.soinside.com 2019 - 2024. All rights reserved.