Failed to create GL context with glXCreateContextAttribsARB

217 views Asked by At

I'm encountering an issue while trying to run a PyQt6 program which uses PyQtWebEngine on my WSL2 instance (Ubuntu 22.04) within Windows 11. When executing the following code:

import sys
from PyQt6.QtCore import *
from PyQt6.QtWidgets import *
from PyQt6.QtGui import QAction
from PyQt6.QtWebEngineWidgets import QWebEngineView

class BrowserApp(QMainWindow):

    def __init__(self):
        super().__init__()

        # Set up the browser
        self.browser = QWebEngineView()
        self.browser.setUrl(QUrl("https://www.google.com"))

        self.setCentralWidget(self.browser)
        self.showMaximized()

        # navigation bar
        navbar = QToolBar()
        self.addToolBar(navbar)

        back_btn = QAction("Back", self)
        back_btn.triggered.connect(self.browser.back)
        navbar.addAction(back_btn)

        forward_btn = QAction("Forward", self)
        forward_btn.triggered.connect(self.browser.forward)
        navbar.addAction(forward_btn)

        reload_btn = QAction("Reload", self)
        reload_btn.triggered.connect(self.browser.reload)
        navbar.addAction(reload_btn)

        home_btn = QAction("Home", self)
        home_btn.triggered.connect(self.navigate_home)
        navbar.addAction(home_btn)

        self.url_bar = QLineEdit()
        self.url_bar.returnPressed.connect(self.navigate_to_url)
        navbar.addWidget(self.url_bar)

        self.browser.urlChanged.connect(self.update_url)

    def navigate_home(self):
        self.browser.setUrl(QUrl("https://www.google.com"))

    def navigate_to_url(self):
        url = self.url_bar.text()
        self.browser.setUrl(QUrl(url))

    def update_url(self, q: QUrl):
        self.url_bar.setText(q.toString())

app = QApplication(sys.argv)
window = BrowserApp()
sys.exit(app.exec())

I'm greeted with this error:

D3D12: Removing Device.
[68941:68967:0907/170452.006866:ERROR:gl_context_egl.cc(370)] eglCreateContext failed with error EGL_BAD_ALLOC
[68941:68967:0907/170452.006913:ERROR:gpu_channel_manager.cc(888)] Failed to create GLES3 context, fallback to GLES2.
Segmentation fault

My system specifications are:

  • OS: Microsoft Windows 11
  • CPU: 13th Gen Intel(R) Core(TM) i7-13700 at 2100 Mhz
  • GPU: Intel(R) UHD Graphics 770

As mentioned, this code is executed within WSL2 (Ubuntu 22.04) and I am using WSLg as the X server.

I'm a bit lost as to what might be the root cause of this issue. It could be related to the GPU, the GPU driver, the X server used by WSL, or something entirely different. Any insights or advice on how to approach this problem would be appreciated.

Update: Now I can reproduce this error with:

#include <iostream>
#include <GL/glx.h>
#include <X11/Xlib.h>

int IgnoreX11Errors(Display *display, XErrorEvent *error) {
    return 0;  // Ignore errors
}

int main() {
    Display* display = XOpenDisplay(nullptr);
    if (!display) {
        std::cerr << "Unable to open X display." << std::endl;
        return -1;
    }

    static int visualAttribs[] = {
        GLX_X_RENDERABLE, True,
        GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT,
        GLX_RENDER_TYPE, GLX_RGBA_BIT,
        GLX_X_VISUAL_TYPE, GLX_TRUE_COLOR,
        GLX_RED_SIZE, 8,
        GLX_GREEN_SIZE, 8,
        GLX_BLUE_SIZE, 8,
        GLX_ALPHA_SIZE, 8,
        GLX_DEPTH_SIZE, 24,
        GLX_STENCIL_SIZE, 8,
        GLX_DOUBLEBUFFER, True,
        None
    };

    int numConfigs;
    GLXFBConfig* fbConfigs = glXChooseFBConfig(display, DefaultScreen(display), visualAttribs, &numConfigs);
    if (!fbConfigs) {
        std::cerr << "Failed to retrieve framebuffer configs." << std::endl;
        XCloseDisplay(display);
        return -1;
    }

    GLXFBConfig config = fbConfigs[0];
    XFree(fbConfigs);

    PFNGLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribsARB = 
        (PFNGLXCREATECONTEXTATTRIBSARBPROC) glXGetProcAddressARB((const GLubyte*) "glXCreateContextAttribsARB");

    if (!glXCreateContextAttribsARB) {
        std::cerr << "glXCreateContextAttribsARB is not available." << std::endl;
        XCloseDisplay(display);
        return -1;
    }

    int contextAttribs[] = {
        GLX_CONTEXT_MAJOR_VERSION_ARB, 4,
        GLX_CONTEXT_MINOR_VERSION_ARB, 5,
        None
    };

    auto old_error_handler = XSetErrorHandler(IgnoreX11Errors);
    GLXContext context = glXCreateContextAttribsARB(display, config, 0, True, contextAttribs);
    XSetErrorHandler(old_error_handler);

    if (!context) {
        std::cerr << "Failed to create GL context with glXCreateContextAttribsARB." << std::endl;
        XCloseDisplay(display);
        return -1;
    }

    std::cout << "GL context created successfully." << std::endl;

    glXDestroyContext(display, context);
    XCloseDisplay(display);
    return 0;
}

compile with:

g++ tmp.cpp -o tmp  -lGL -lX11

The error message is:

Failed to create GL context with glXCreateContextAttribsARB.
0

There are 0 answers