1From 24a0d767251b81810767e03aa1db8cc497408db3 Mon Sep 17 00:00:00 2001 2From: Jussi Kukkonen <jussi.kukkonen@intel.com> 3Date: Fri, 16 Oct 2015 16:35:16 +0300 4Subject: [PATCH] Do not try to initialize GL without libGL 5 6_gdk_x11_screen_update_visuals_for_gl() will end up calling epoxys 7GLX api which will exit() if libGL.so.1 is not present. We do not 8want that to happen and we don't want every app to have to set 9"GDK_GL=disabled" environment variable: so use #ifdef set based on 10opengl distro feature. 11 12Upstream is not interested in the fix as it is: Either epoxy should be 13fixed (to not exit) or GTK+ possibly could do some additional probing 14before calling epoxy APIs. 15 16Upstream-Status: Denied 17Signed-off-by: Jussi Kukkonen <jussi.kukkonen@intel.com> 18--- 19 demos/gtk-demo/meson.build | 5 ++++- 20 docs/tools/meson.build | 7 +++++-- 21 docs/tools/widgets.c | 6 +++++- 22 gdk/gdkconfig.h.meson | 1 + 23 gdk/gdkdisplay.c | 4 ++++ 24 gdk/gdkgl.c | 11 ++++++++++- 25 gdk/gdkglcontext.c | 6 ++++++ 26 gdk/gdkwindow.c | 13 +++++++++++++ 27 gdk/meson.build | 8 +++++++- 28 gdk/x11/gdkdisplay-x11.c | 6 +++++- 29 gdk/x11/gdkvisual-x11.c | 5 +++++ 30 gdk/x11/gdkwindow-x11.c | 4 ++++ 31 gdk/x11/gdkx-autocleanups.h | 2 ++ 32 gdk/x11/gdkx.h | 2 ++ 33 gdk/x11/meson.build | 7 +++++-- 34 gtk/gtkglarea.c | 19 +++++++++++++++++++ 35 gtk/inspector/general.c | 6 ++++++ 36 meson.build | 17 ++++++++++++++--- 37 meson_options.txt | 2 ++ 38 tests/meson.build | 9 +++++++-- 39 testsuite/gtk/objects-finalize.c | 2 ++ 40 21 files changed, 128 insertions(+), 14 deletions(-) 41 42diff --git a/demos/gtk-demo/meson.build b/demos/gtk-demo/meson.build 43index 252da16..4b57cff 100644 44--- a/demos/gtk-demo/meson.build 45+++ b/demos/gtk-demo/meson.build 46@@ -28,7 +28,6 @@ demos = files([ 47 'fishbowl.c', 48 'foreigndrawing.c', 49 'gestures.c', 50- 'glarea.c', 51 'headerbar.c', 52 'hypertext.c', 53 'iconview.c', 54@@ -87,6 +86,10 @@ elif harfbuzz_dep.found() and pangoft_dep.found() 55 gtkdemo_deps += [harfbuzz_dep, pangoft_dep] 56 endif 57 58+if opengl_enabled 59+ demos += files('glarea.c') 60+endif 61+ 62 if os_unix 63 demos += files('pagesetup.c') 64 endif 65diff --git a/docs/tools/meson.build b/docs/tools/meson.build 66index 05621ee..3d0a333 100644 67--- a/docs/tools/meson.build 68+++ b/docs/tools/meson.build 69@@ -2,10 +2,13 @@ if x11_enabled 70 doc_shooter_sources = [ 71 'shadow.c', 72 'shooter.c', 73- 'widgets.c', 74- '../../tests/gtkgears.c', 75+ 'widgets.c' 76 ] 77 78+ if opengl_enabled 79+ doc_shooter_sources += ['../../tests/gtkgears.c'] 80+ endif 81+ 82 doc_shooter = executable('doc-shooter', doc_shooter_sources, 83 include_directories: [ confinc, gdkinc, gtkinc, testinc, ], 84 dependencies: libgtk_dep) 85diff --git a/docs/tools/widgets.c b/docs/tools/widgets.c 86index 932daf1..348807e 100644 87--- a/docs/tools/widgets.c 88+++ b/docs/tools/widgets.c 89@@ -8,7 +8,9 @@ 90 #include <X11/Xatom.h> 91 #include <gdkx.h> 92 #include "widgets.h" 93+#ifdef HAVE_OPENGL 94 #include "gtkgears.h" 95+#endif 96 97 #define SMALL_WIDTH 240 98 #define SMALL_HEIGHT 75 99@@ -1526,9 +1528,11 @@ create_gl_area (void) 100 widget = gtk_frame_new (NULL); 101 gtk_frame_set_shadow_type (GTK_FRAME (widget), GTK_SHADOW_IN); 102 103+#ifdef HAVE_OPENGL 104 gears = gtk_gears_new (); 105 gtk_container_add (GTK_CONTAINER (widget), gears); 106- 107+#endif 108+ 109 info = new_widget_info ("glarea", widget, MEDIUM); 110 111 return info; 112diff --git a/gdk/gdkconfig.h.meson b/gdk/gdkconfig.h.meson 113index 7db19e0..088651b 100644 114--- a/gdk/gdkconfig.h.meson 115+++ b/gdk/gdkconfig.h.meson 116@@ -15,6 +15,7 @@ G_BEGIN_DECLS 117 #mesondefine GDK_WINDOWING_WAYLAND 118 #mesondefine GDK_WINDOWING_WIN32 119 #mesondefine GDK_WINDOWING_QUARTZ 120+#mesondefine GDK_WITH_OPENGL 121 122 G_END_DECLS 123 124diff --git a/gdk/gdkdisplay.c b/gdk/gdkdisplay.c 125index fd5e9ea..87b45e7 100644 126--- a/gdk/gdkdisplay.c 127+++ b/gdk/gdkdisplay.c 128@@ -2420,7 +2420,11 @@ gboolean 129 gdk_display_make_gl_context_current (GdkDisplay *display, 130 GdkGLContext *context) 131 { 132+#ifdef HAVE_OPENGL 133 return GDK_DISPLAY_GET_CLASS (display)->make_gl_context_current (display, context); 134+#else 135+ return FALSE; 136+#endif 137 } 138 139 GdkRenderingMode 140diff --git a/gdk/gdkgl.c b/gdk/gdkgl.c 141index 0940c06..4b56614 100644 142--- a/gdk/gdkgl.c 143+++ b/gdk/gdkgl.c 144@@ -21,8 +21,9 @@ 145 #include "gdkglcontextprivate.h" 146 147 #include "gdkinternals.h" 148- 149+#ifdef HAVE_OPENGL 150 #include <epoxy/gl.h> 151+#endif 152 #include <math.h> 153 #include <string.h> 154 155@@ -36,6 +37,7 @@ gdk_cairo_surface_mark_as_direct (cairo_surface_t *surface, 156 g_object_ref (window), g_object_unref); 157 } 158 159+#ifdef HAVE_OPENGL 160 static const char * 161 get_vertex_type_name (int type) 162 { 163@@ -208,6 +210,7 @@ use_texture_rect_program (GdkGLContextPaintData *paint_data) 164 glUseProgram (paint_data->current_program->program); 165 } 166 } 167+#endif 168 169 void 170 gdk_gl_texture_quads (GdkGLContext *paint_context, 171@@ -216,6 +219,7 @@ gdk_gl_texture_quads (GdkGLContext *paint_context, 172 GdkTexturedQuad *quads, 173 gboolean flip_colors) 174 { 175+#ifdef HAVE_OPENGL 176 GdkGLContextPaintData *paint_data = gdk_gl_context_get_paint_data (paint_context); 177 GdkGLContextProgram *program; 178 GdkWindow *window = gdk_gl_context_get_window (paint_context); 179@@ -289,6 +293,7 @@ gdk_gl_texture_quads (GdkGLContext *paint_context, 180 181 glDisableVertexAttribArray (program->position_location); 182 glDisableVertexAttribArray (program->uv_location); 183+#endif 184 } 185 186 /* x,y,width,height describes a rectangle in the gl render buffer 187@@ -337,6 +342,7 @@ gdk_cairo_draw_from_gl (cairo_t *cr, 188 int width, 189 int height) 190 { 191+#ifdef HAVE_OPENGL 192 GdkGLContext *paint_context, *current_context; 193 cairo_surface_t *image; 194 cairo_matrix_t matrix; 195@@ -727,6 +733,7 @@ out: 196 if (clip_region) 197 cairo_region_destroy (clip_region); 198 199+#endif 200 } 201 202 /* This is always called with the paint context current */ 203@@ -734,6 +741,7 @@ void 204 gdk_gl_texture_from_surface (cairo_surface_t *surface, 205 cairo_region_t *region) 206 { 207+#ifdef HAVE_OPENGL 208 GdkGLContext *paint_context; 209 cairo_surface_t *image; 210 double device_x_offset, device_y_offset; 211@@ -834,4 +842,5 @@ gdk_gl_texture_from_surface (cairo_surface_t *surface, 212 213 glDisable (GL_SCISSOR_TEST); 214 glDeleteTextures (1, &texture_id); 215+#endif 216 } 217diff --git a/gdk/gdkglcontext.c b/gdk/gdkglcontext.c 218index cb0ed90..7ed74f3 100644 219--- a/gdk/gdkglcontext.c 220+++ b/gdk/gdkglcontext.c 221@@ -85,7 +85,9 @@ 222 #include "gdkintl.h" 223 #include "gdk-private.h" 224 225+#ifdef HAVE_OPENGL 226 #include <epoxy/gl.h> 227+#endif 228 229 typedef struct { 230 GdkDisplay *display; 231@@ -246,6 +248,7 @@ gdk_gl_context_upload_texture (GdkGLContext *context, 232 int height, 233 guint texture_target) 234 { 235+#ifdef HAVE_OPENGL 236 GdkGLContextPrivate *priv = gdk_gl_context_get_instance_private (context); 237 238 g_return_if_fail (GDK_IS_GL_CONTEXT (context)); 239@@ -289,6 +292,7 @@ gdk_gl_context_upload_texture (GdkGLContext *context, 240 glTexSubImage2D (texture_target, 0, 0, i, width, 1, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, (unsigned char*) data + (i * stride)); 241 } 242 } 243+#endif 244 } 245 246 static gboolean 247@@ -801,6 +805,7 @@ gdk_gl_context_realize (GdkGLContext *context, 248 static void 249 gdk_gl_context_check_extensions (GdkGLContext *context) 250 { 251+#ifdef HAVE_OPENGL 252 GdkGLContextPrivate *priv = gdk_gl_context_get_instance_private (context); 253 gboolean has_npot, has_texture_rectangle; 254 255@@ -888,6 +893,7 @@ gdk_gl_context_check_extensions (GdkGLContext *context) 256 priv->use_texture_rectangle ? "yes" : "no")); 257 258 priv->extensions_checked = TRUE; 259+#endif 260 } 261 262 /** 263diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c 264index 62e0cf8..b8bda71 100644 265--- a/gdk/gdkwindow.c 266+++ b/gdk/gdkwindow.c 267@@ -45,7 +45,9 @@ 268 269 #include <math.h> 270 271+#ifdef HAVE_OPENGL 272 #include <epoxy/gl.h> 273+#endif 274 275 /* for the use of round() */ 276 #include "fallback-c89.c" 277@@ -2844,6 +2846,13 @@ gdk_window_get_paint_gl_context (GdkWindow *window, 278 { 279 GError *internal_error = NULL; 280 281+#ifndef HAVE_OPENGL 282+ g_set_error_literal (error, GDK_GL_ERROR, 283+ GDK_GL_ERROR_NOT_AVAILABLE, 284+ _("GL support disabled with --disable-opengl")); 285+ return NULL; 286+#endif 287+ 288 if (_gdk_gl_flags & GDK_GL_DISABLE) 289 { 290 g_set_error_literal (error, GDK_GL_ERROR, 291@@ -2979,6 +2988,7 @@ gdk_window_begin_paint_internal (GdkWindow *window, 292 } 293 else 294 { 295+#ifdef HAVE_OPENGL 296 gdk_gl_context_make_current (context); 297 /* With gl we always need a surface to combine the gl 298 drawing with the native drawing. */ 299@@ -2993,6 +3003,7 @@ gdk_window_begin_paint_internal (GdkWindow *window, 300 glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 301 302 glViewport (0, 0, ww, wh); 303+#endif 304 } 305 } 306 307@@ -3056,6 +3067,7 @@ gdk_window_end_paint_internal (GdkWindow *window) 308 309 gdk_gl_context_make_current (window->gl_paint_context); 310 311+#ifdef HAVE_OPENGL 312 if (!cairo_region_is_empty (opaque_region)) 313 gdk_gl_texture_from_surface (window->current_paint.surface, 314 opaque_region); 315@@ -3066,6 +3078,7 @@ gdk_window_end_paint_internal (GdkWindow *window) 316 window->current_paint.need_blend_region); 317 glDisable(GL_BLEND); 318 } 319+#endif 320 321 cairo_region_destroy (opaque_region); 322 323diff --git a/gdk/meson.build b/gdk/meson.build 324index 297c38c..fc71f8f 100644 325--- a/gdk/meson.build 326+++ b/gdk/meson.build 327@@ -56,7 +56,6 @@ gdk_gir_public_headers = files( 328 'gdkdrawingcontext.h', 329 'gdkevents.h', 330 'gdkframetimings.h', 331- 'gdkglcontext.h', 332 'gdkkeys.h', 333 'gdkkeysyms.h', 334 'gdkmain.h', 335@@ -78,6 +77,12 @@ gdk_gir_public_headers = files( 336 'gdkwindow.h', 337 ) 338 gdk_nogir_public_headers = [files('gdkkeysyms-compat.h')] 339+if opengl_enabled 340+gdk_gir_public_headers += files('gdkglcontext.h') 341+else 342+gdk_nogir_public_headers += files('gdkglcontext.h') 343+endif 344+ 345 gdk_public_headers = gdk_gir_public_headers + gdk_nogir_public_headers 346 install_headers(gdk_public_headers, subdir : 'gtk-3.0/gdk') 347 348@@ -166,6 +171,7 @@ gdkconfig_cdata.set('GDK_WINDOWING_WAYLAND', wayland_enabled) 349 gdkconfig_cdata.set('GDK_WINDOWING_WIN32', win32_enabled) 350 gdkconfig_cdata.set('GDK_WINDOWING_BROADWAY', broadway_enabled) 351 gdkconfig_cdata.set('GDK_WINDOWING_QUARTZ', quartz_enabled) 352+gdkconfig_cdata.set('GDK_WITH_OPENGL', opengl_enabled) 353 354 gdkconfig = configure_file( 355 input : 'gdkconfig.h.meson', 356diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c 357index 7e08f47..30fd7b6 100644 358--- a/gdk/x11/gdkdisplay-x11.c 359+++ b/gdk/x11/gdkdisplay-x11.c 360@@ -37,7 +37,9 @@ 361 #include "gdkdisplay-x11.h" 362 #include "gdkprivate-x11.h" 363 #include "gdkscreen-x11.h" 364+#ifdef HAVE_OPENGL 365 #include "gdkglcontext-x11.h" 366+#endif 367 #include "gdk-private.h" 368 #include "gdkprofilerprivate.h" 369 370@@ -3191,7 +3193,9 @@ gdk_x11_display_class_init (GdkX11DisplayClass * class) 371 display_class->text_property_to_utf8_list = _gdk_x11_display_text_property_to_utf8_list; 372 display_class->utf8_to_string_target = _gdk_x11_display_utf8_to_string_target; 373 374- display_class->make_gl_context_current = gdk_x11_display_make_gl_context_current; 375+#ifdef HAVE_OPENGL 376+ display_class->make_gl_context_current = gdk_x11_display_make_gl_context_current; 377+#endif 378 379 display_class->get_default_seat = gdk_x11_display_get_default_seat; 380 381diff --git a/gdk/x11/gdkvisual-x11.c b/gdk/x11/gdkvisual-x11.c 382index 81479d8..3c8c5c0 100644 383--- a/gdk/x11/gdkvisual-x11.c 384+++ b/gdk/x11/gdkvisual-x11.c 385@@ -306,7 +306,12 @@ _gdk_x11_screen_init_visuals (GdkScreen *screen) 386 /* If GL is available we want to pick better default/rgba visuals, 387 as we care about glx details such as alpha/depth/stencil depth, 388 stereo and double buffering */ 389+ /* update_visuals_for_gl() will end up calling epoxy GLX api which 390+ will exit if libgl is not there: so only do this if we know GL 391+ is available */ 392+#ifdef HAVE_GLX 393 _gdk_x11_screen_update_visuals_for_gl (screen); 394+#endif 395 } 396 397 gint 398diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c 399index 89f0666..d3e1440 100644 400--- a/gdk/x11/gdkwindow-x11.c 401+++ b/gdk/x11/gdkwindow-x11.c 402@@ -36,7 +36,9 @@ 403 #include "gdkasync.h" 404 #include "gdkeventsource.h" 405 #include "gdkdisplay-x11.h" 406+#ifdef HAVE_OPENGL 407 #include "gdkglcontext-x11.h" 408+#endif 409 #include "gdkprivate-x11.h" 410 #include "gdk-private.h" 411 412@@ -5906,7 +5908,9 @@ gdk_window_impl_x11_class_init (GdkWindowImplX11Class *klass) 413 impl_class->set_opaque_region = gdk_x11_window_set_opaque_region; 414 impl_class->set_shadow_width = gdk_x11_window_set_shadow_width; 415 impl_class->show_window_menu = gdk_x11_window_show_window_menu; 416+#ifdef HAVE_OPENGL 417 impl_class->create_gl_context = gdk_x11_window_create_gl_context; 418 impl_class->invalidate_for_new_frame = gdk_x11_window_invalidate_for_new_frame; 419+#endif 420 impl_class->get_unscaled_size = gdk_x11_window_get_unscaled_size; 421 } 422diff --git a/gdk/x11/gdkx-autocleanups.h b/gdk/x11/gdkx-autocleanups.h 423index edb0ea7..a317d61 100644 424--- a/gdk/x11/gdkx-autocleanups.h 425+++ b/gdk/x11/gdkx-autocleanups.h 426@@ -30,7 +30,9 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(GdkX11DeviceXI2, g_object_unref) 427 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GdkX11Display, g_object_unref) 428 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GdkX11DisplayManager, g_object_unref) 429 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GdkX11DragContext, g_object_unref) 430+#ifdef HAVE_OPENGL 431 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GdkX11GLContext, g_object_unref) 432+#endif 433 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GdkX11Keymap, g_object_unref) 434 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GdkX11Screen, g_object_unref) 435 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GdkX11Visual, g_object_unref) 436diff --git a/gdk/x11/gdkx.h b/gdk/x11/gdkx.h 437index 1f64bcc..4db6c18 100644 438--- a/gdk/x11/gdkx.h 439+++ b/gdk/x11/gdkx.h 440@@ -43,7 +43,9 @@ 441 #include <gdk/x11/gdkx11display.h> 442 #include <gdk/x11/gdkx11displaymanager.h> 443 #include <gdk/x11/gdkx11dnd.h> 444+#ifdef GDK_WITH_OPENGL 445 #include <gdk/x11/gdkx11glcontext.h> 446+#endif 447 #include <gdk/x11/gdkx11keys.h> 448 #include <gdk/x11/gdkx11monitor.h> 449 #include <gdk/x11/gdkx11property.h> 450diff --git a/gdk/x11/meson.build b/gdk/x11/meson.build 451index 754ae0a..0318c83 100644 452--- a/gdk/x11/meson.build 453+++ b/gdk/x11/meson.build 454@@ -14,7 +14,6 @@ gdk_x11_sources = files( 455 'gdkeventsource.c', 456 'gdkeventtranslator.c', 457 'gdkgeometry-x11.c', 458- 'gdkglcontext-x11.c', 459 'gdkkeys-x11.c', 460 'gdkmain-x11.c', 461 'gdkproperty-x11.c', 462@@ -42,7 +41,6 @@ gdk_x11_public_headers = files( 463 'gdkx11display.h', 464 'gdkx11displaymanager.h', 465 'gdkx11dnd.h', 466- 'gdkx11glcontext.h', 467 'gdkx11keys.h', 468 'gdkx11monitor.h', 469 'gdkx11property.h', 470@@ -53,6 +51,11 @@ gdk_x11_public_headers = files( 471 'gdkx11window.h', 472 ) 473 474+if opengl_enabled 475+ gdk_x11_sources += files('gdkglcontext-x11.c') 476+ gdk_x11_public_headers += files('gdkx11glcontext.h') 477+endif 478+ 479 install_headers(gdk_x11_public_headers, subdir: 'gtk-3.0/gdk/x11/') 480 install_headers('gdkx.h', subdir: 'gtk-3.0/gdk/') 481 482diff --git a/gtk/gtkglarea.c b/gtk/gtkglarea.c 483index 802303e..6439d77 100644 484--- a/gtk/gtkglarea.c 485+++ b/gtk/gtkglarea.c 486@@ -29,7 +29,9 @@ 487 #include "gtkprivate.h" 488 #include "gtkrender.h" 489 490+#ifdef HAVE_OPENGL 491 #include <epoxy/gl.h> 492+#endif 493 494 /** 495 * SECTION:gtkglarea 496@@ -369,9 +371,12 @@ gtk_gl_area_real_create_context (GtkGLArea *area) 497 static void 498 gtk_gl_area_resize (GtkGLArea *area, int width, int height) 499 { 500+#ifdef HAVE_OPENGL 501 glViewport (0, 0, width, height); 502+#endif 503 } 504 505+#ifdef HAVE_OPENGL 506 /* 507 * Creates all the buffer objects needed for rendering the scene 508 */ 509@@ -483,6 +488,7 @@ gtk_gl_area_allocate_buffers (GtkGLArea *area) 510 511 priv->needs_render = TRUE; 512 } 513+#endif 514 515 /** 516 * gtk_gl_area_attach_buffers: 517@@ -501,6 +507,7 @@ gtk_gl_area_allocate_buffers (GtkGLArea *area) 518 void 519 gtk_gl_area_attach_buffers (GtkGLArea *area) 520 { 521+#ifdef HAVE_OPENGL 522 GtkGLAreaPrivate *priv = gtk_gl_area_get_instance_private (area); 523 524 g_return_if_fail (GTK_IS_GL_AREA (area)); 525@@ -533,11 +540,13 @@ gtk_gl_area_attach_buffers (GtkGLArea *area) 526 glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, 527 GL_RENDERBUFFER, priv->depth_stencil_buffer); 528 } 529+#endif 530 } 531 532 static void 533 gtk_gl_area_delete_buffers (GtkGLArea *area) 534 { 535+#ifdef HAVE_OPENGL 536 GtkGLAreaPrivate *priv = gtk_gl_area_get_instance_private (area); 537 538 if (priv->context == NULL) 539@@ -569,6 +578,7 @@ gtk_gl_area_delete_buffers (GtkGLArea *area) 540 glDeleteFramebuffers (1, &priv->frame_buffer); 541 priv->frame_buffer = 0; 542 } 543+#endif 544 } 545 546 static void 547@@ -679,6 +689,7 @@ gtk_gl_area_draw (GtkWidget *widget, 548 GtkGLArea *area = GTK_GL_AREA (widget); 549 GtkGLAreaPrivate *priv = gtk_gl_area_get_instance_private (area); 550 gboolean unused; 551+#ifdef HAVE_OPENGL 552 int w, h, scale; 553 GLenum status; 554 555@@ -736,6 +747,14 @@ gtk_gl_area_draw (GtkWidget *widget, 556 } 557 558 return TRUE; 559+#else 560+ if (priv->error != NULL) 561+ gtk_gl_area_draw_error_screen (area, 562+ cr, 563+ gtk_widget_get_allocated_width (widget), 564+ gtk_widget_get_allocated_height (widget)); 565+ return FALSE; 566+#endif 567 } 568 569 static gboolean 570diff --git a/gtk/inspector/general.c b/gtk/inspector/general.c 571index a3a3419..274600e 100644 572--- a/gtk/inspector/general.c 573+++ b/gtk/inspector/general.c 574@@ -35,8 +35,10 @@ 575 576 #ifdef GDK_WINDOWING_X11 577 #include "x11/gdkx.h" 578+#ifdef HAVE_OPENGL 579 #include <epoxy/glx.h> 580 #endif 581+#endif 582 583 #ifdef GDK_WINDOWING_WIN32 584 #include "win32/gdkwin32.h" 585@@ -221,6 +223,7 @@ add_label_row (GtkInspectorGeneral *gen, 586 gtk_size_group_add_widget (GTK_SIZE_GROUP (gen->priv->labels), label); 587 } 588 589+#ifdef HAVE_OPENGL 590 #ifdef GDK_WINDOWING_X11 591 static void 592 append_glx_extension_row (GtkInspectorGeneral *gen, 593@@ -230,6 +233,7 @@ append_glx_extension_row (GtkInspectorGeneral *gen, 594 add_check_row (gen, GTK_LIST_BOX (gen->priv->gl_box), ext, epoxy_has_glx_extension (dpy, 0, ext), 0); 595 } 596 #endif 597+#endif 598 599 #ifdef GDK_WINDOWING_WAYLAND 600 static void 601@@ -279,6 +283,7 @@ wayland_get_display (struct wl_display *wl_display) 602 static void 603 init_gl (GtkInspectorGeneral *gen) 604 { 605+#ifdef HAVE_OPENGL 606 #ifdef GDK_WINDOWING_X11 607 if (GDK_IS_X11_DISPLAY (gdk_display_get_default ())) 608 { 609@@ -305,6 +310,7 @@ init_gl (GtkInspectorGeneral *gen) 610 } 611 else 612 #endif 613+#endif 614 #ifdef GDK_WINDOWING_WAYLAND 615 if (GDK_IS_WAYLAND_DISPLAY (gdk_display_get_default ())) 616 { 617diff --git a/meson.build b/meson.build 618index 67b24e5..c1cc09a 100644 619--- a/meson.build 620+++ b/meson.build 621@@ -137,6 +137,7 @@ wayland_enabled = get_option('wayland_backend') 622 broadway_enabled = get_option('broadway_backend') 623 quartz_enabled = get_option('quartz_backend') 624 win32_enabled = get_option('win32_backend') 625+opengl_enabled = get_option('opengl') 626 627 os_unix = false 628 os_linux = false 629@@ -430,7 +431,7 @@ pangocairo_dep = dependency('pangocairo', version: cairo_req, 630 fallback : ['pango', 'libpangocairo_dep']) 631 pixbuf_dep = dependency('gdk-pixbuf-2.0', version: gdk_pixbuf_req, 632 fallback : ['gdk-pixbuf', 'gdkpixbuf_dep']) 633-epoxy_dep = dependency('epoxy', version: epoxy_req, 634+epoxy_dep = dependency('epoxy', version: epoxy_req, required: opengl_enabled, 635 fallback: ['libepoxy', 'libepoxy_dep']) 636 atk_dep = dependency('atk', version: atk_req, 637 fallback : ['atk', 'libatk_dep']) 638@@ -476,6 +477,10 @@ if tracker3_enabled 639 endif 640 endif 641 642+if opengl_enabled 643+ cdata.set('HAVE_OPENGL', 1) 644+endif 645+ 646 if iso_codes_dep.found() 647 cdata.set_quoted('ISO_CODES_PREFIX', iso_codes_dep.get_variable(pkgconfig: 'prefix')) 648 else 649@@ -914,9 +919,15 @@ else 650 gio_packages = ['gio-2.0', glib_req] 651 endif 652 653+if opengl_enabled 654+ epoxy_packages = ['epoxy', epoxy_req] 655+else 656+ epoxy_packages = [] 657+endif 658+ 659 pkgconf.set('GDK_PRIVATE_PACKAGES', 660 ' '.join(gio_packages + x11_pkgs + wayland_pkgs + cairo_backends + 661- ['epoxy', epoxy_req] + cloudproviders_packages + 662+ epoxy_packages + cloudproviders_packages + 663 ['fribidi', fribidi_req])) 664 665 gtk_packages = ' '.join([ 666@@ -930,7 +941,7 @@ pkgconf.set('GTK_PACKAGES', gtk_packages) 667 # Requires.private 668 pc_gdk_extra_libs += cairo_libs 669 670-gtk_private_packages = atk_pkgs + wayland_pkgs + ['epoxy', epoxy_req, 'fribidi', fribidi_req] 671+gtk_private_packages = atk_pkgs + wayland_pkgs + epoxy_packages + ['fribidi', fribidi_req] 672 if wayland_enabled or x11_enabled 673 gtk_private_packages += ['pangoft2'] 674 endif 675diff --git a/meson_options.txt b/meson_options.txt 676index 94099aa..8bd0968 100644 677--- a/meson_options.txt 678+++ b/meson_options.txt 679@@ -19,6 +19,8 @@ option('profiler', type: 'boolean', value: false, 680 description : 'Enable profiler support') 681 option('tracker3', type: 'boolean', value: false, 682 description : 'Enable Tracker3 filechooser search') 683+option('opengl', type: 'boolean', value: true, 684+ description : 'Enable use of GL') 685 686 # Print backends 687 option('print_backends', type : 'string', value : 'auto', 688diff --git a/tests/meson.build b/tests/meson.build 689index 6ff249f..f2a9fba 100644 690--- a/tests/meson.build 691+++ b/tests/meson.build 692@@ -5,7 +5,6 @@ gtk_tests = [ 693 ['scrolling-performance', ['frame-stats.c', 'variable.c']], 694 ['blur-performance', ['../gtk/gtkcairoblur.c']], 695 ['flicker'], 696- ['gdkgears', ['gtkgears.c']], 697 ['listmodel'], 698 ['motion-compression'], 699 ['styleexamples'], 700@@ -55,7 +54,6 @@ gtk_tests = [ 701 ['testfullscreen'], 702 ['testgeometry'], 703 ['testgiconpixbuf'], 704- ['testglblending', ['gtkgears.c']], 705 ['testgmenu'], 706 ['testgrid'], 707 ['testgrouping'], 708@@ -138,6 +136,13 @@ if x11_enabled 709 ] 710 endif 711 712+if opengl_enabled 713+ gtk_tests += [ 714+ ['gdkgears', ['gtkgears.c']], 715+ ['testglblending', ['gtkgears.c']], 716+ ] 717+endif 718+ 719 if os_linux 720 gtk_tests += [['testfontchooserdialog']] 721 endif 722diff --git a/testsuite/gtk/objects-finalize.c b/testsuite/gtk/objects-finalize.c 723index 95b565c..7f340c3 100644 724--- a/testsuite/gtk/objects-finalize.c 725+++ b/testsuite/gtk/objects-finalize.c 726@@ -109,7 +109,9 @@ main (int argc, char **argv) 727 all_types[i] != GDK_TYPE_X11_DEVICE_MANAGER_CORE && 728 all_types[i] != GDK_TYPE_X11_DEVICE_MANAGER_XI2 && 729 all_types[i] != GDK_TYPE_X11_DISPLAY_MANAGER && 730+#ifdef HAVE_OPENGL 731 all_types[i] != GDK_TYPE_X11_GL_CONTEXT && 732+#endif 733 #endif 734 /* Not allowed to finalize a GdkPixbufLoader without calling gdk_pixbuf_loader_close() */ 735 all_types[i] != GDK_TYPE_PIXBUF_LOADER && 736