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.