aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolker RĂ¼melin <vr_qemu@t-online.de>2022-06-05 10:51:31 +0200
committerGerd Hoffmann <kraxel@redhat.com>2022-06-14 10:34:36 +0200
commit09053670c9b83f1f4759f37e62a6f2b1a5bbd105 (patch)
tree8caae2f522e8a625cb530405cac2c0952f3d5812
parente561b3b7df11875d7bd3b8670598cae5601a7f70 (diff)
downloadqemu-09053670c9b83f1f4759f37e62a6f2b1a5bbd105.zip
qemu-09053670c9b83f1f4759f37e62a6f2b1a5bbd105.tar.gz
qemu-09053670c9b83f1f4759f37e62a6f2b1a5bbd105.tar.bz2
ui/gtk-gl-area: create the requested GL context version
Since about 2018 virglrenderer (commit fa835b0f88 "vrend: don't hardcode context version") tries to open the highest available GL context version. This is done by creating the known GL context versions from the highest to the lowest until (*create_gl_context) returns a context != NULL. This does not work properly with the current QEMU gd_gl_area_create_context() function, because gdk_gl_context_realize() on Wayland creates a version 3.0 legacy context if the requested GL context version can't be created. In order for virglrenderer to find the highest available GL context version, return NULL if the created context version is lower than the requested version. This fixes the following error: QEMU started with -device virtio-vga-gl -display gtk,gl=on. Under Wayland, the guest window remains black and the following information can be seen on the host. gl_version 30 - compat profile (qemu:5978): Gdk-WARNING **: 16:19:01.533: gdk_gl_context_set_required_version - GL context versions less than 3.2 are not supported. (qemu:5978): Gdk-WARNING **: 16:19:01.537: gdk_gl_context_set_required_version - GL context versions less than 3.2 are not supported. (qemu:5978): Gdk-WARNING **: 16:19:01.554: gdk_gl_context_set_required_version - GL context versions less than 3.2 are not supported. vrend_renderer_fill_caps: Entering with stale GL error: 1282 To reproduce this error, an OpenGL driver is required on the host that doesn't have the latest OpenGL extensions fully implemented. An example for this is the Intel i965 driver on a Haswell processor. Signed-off-by: Volker RĂ¼melin <vr_qemu@t-online.de> Message-Id: <20220605085131.7711-2-vr_qemu@t-online.de> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
-rw-r--r--ui/gtk-gl-area.c31
-rw-r--r--ui/trace-events1
2 files changed, 31 insertions, 1 deletions
diff --git a/ui/gtk-gl-area.c b/ui/gtk-gl-area.c
index 0e20ea0..2e0129c 100644
--- a/ui/gtk-gl-area.c
+++ b/ui/gtk-gl-area.c
@@ -170,6 +170,23 @@ void gd_gl_area_switch(DisplayChangeListener *dcl,
}
}
+static int gd_cmp_gl_context_version(int major, int minor, QEMUGLParams *params)
+{
+ if (major > params->major_ver) {
+ return 1;
+ }
+ if (major < params->major_ver) {
+ return -1;
+ }
+ if (minor > params->minor_ver) {
+ return 1;
+ }
+ if (minor < params->minor_ver) {
+ return -1;
+ }
+ return 0;
+}
+
QEMUGLContext gd_gl_area_create_context(DisplayGLCtx *dgc,
QEMUGLParams *params)
{
@@ -177,8 +194,8 @@ QEMUGLContext gd_gl_area_create_context(DisplayGLCtx *dgc,
GdkWindow *window;
GdkGLContext *ctx;
GError *err = NULL;
+ int major, minor;
- gtk_gl_area_make_current(GTK_GL_AREA(vc->gfx.drawing_area));
window = gtk_widget_get_window(vc->gfx.drawing_area);
ctx = gdk_window_create_gl_context(window, &err);
if (err) {
@@ -196,6 +213,18 @@ QEMUGLContext gd_gl_area_create_context(DisplayGLCtx *dgc,
g_clear_object(&ctx);
return NULL;
}
+
+ gdk_gl_context_make_current(ctx);
+ gdk_gl_context_get_version(ctx, &major, &minor);
+ gdk_gl_context_clear_current();
+ gtk_gl_area_make_current(GTK_GL_AREA(vc->gfx.drawing_area));
+
+ if (gd_cmp_gl_context_version(major, minor, params) == -1) {
+ /* created ctx version < requested version */
+ g_clear_object(&ctx);
+ }
+
+ trace_gd_gl_area_create_context(ctx, params->major_ver, params->minor_ver);
return ctx;
}
diff --git a/ui/trace-events b/ui/trace-events
index 1040ba0..a922f00 100644
--- a/ui/trace-events
+++ b/ui/trace-events
@@ -26,6 +26,7 @@ gd_key_event(const char *tab, int gdk_keycode, int qkeycode, const char *action)
gd_grab(const char *tab, const char *device, const char *reason) "tab=%s, dev=%s, reason=%s"
gd_ungrab(const char *tab, const char *device) "tab=%s, dev=%s"
gd_keymap_windowing(const char *name) "backend=%s"
+gd_gl_area_create_context(void *ctx, int major, int minor) "ctx=%p, major=%d, minor=%d"
gd_gl_area_destroy_context(void *ctx, void *current_ctx) "ctx=%p, current_ctx=%p"
# vnc-auth-sasl.c