1From 4a0716f04fb25b51b08e994bd5a900b2e7f7fed5 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 | 10 ++++++++++ 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(+), 13 deletions(-) 41 42diff --git a/demos/gtk-demo/meson.build b/demos/gtk-demo/meson.build 43index 252da16d05..4b57cff6ac 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 05621ee7ed..3d0a333b32 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 932daf1746..348807e133 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 7db19e0470..088651bafa 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 748f54860c..04ef2c09d4 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 9690077cc2..55f85ef605 100644 142--- a/gdk/gdkgl.c 143+++ b/gdk/gdkgl.c 144@@ -26,7 +26,9 @@ 145 # include "win32/gdkwin32.h" 146 #endif 147 148+#ifdef HAVE_OPENGL 149 #include <epoxy/gl.h> 150+#endif 151 #include <math.h> 152 #include <string.h> 153 154@@ -40,6 +42,7 @@ gdk_cairo_surface_mark_as_direct (cairo_surface_t *surface, 155 g_object_ref (window), g_object_unref); 156 } 157 158+#ifdef HAVE_OPENGL 159 static const char * 160 get_vertex_type_name (int type) 161 { 162@@ -212,6 +215,7 @@ use_texture_rect_program (GdkGLContextPaintData *paint_data) 163 glUseProgram (paint_data->current_program->program); 164 } 165 } 166+#endif 167 168 void 169 gdk_gl_texture_quads (GdkGLContext *paint_context, 170@@ -220,6 +224,7 @@ gdk_gl_texture_quads (GdkGLContext *paint_context, 171 GdkTexturedQuad *quads, 172 gboolean flip_colors) 173 { 174+#ifdef HAVE_OPENGL 175 GdkGLContextPaintData *paint_data = gdk_gl_context_get_paint_data (paint_context); 176 GdkGLContextProgram *program; 177 GdkWindow *window = gdk_gl_context_get_window (paint_context); 178@@ -293,6 +298,7 @@ gdk_gl_texture_quads (GdkGLContext *paint_context, 179 180 glDisableVertexAttribArray (program->position_location); 181 glDisableVertexAttribArray (program->uv_location); 182+#endif 183 } 184 185 /* x,y,width,height describes a rectangle in the gl render buffer 186@@ -341,6 +347,7 @@ gdk_cairo_draw_from_gl (cairo_t *cr, 187 int width, 188 int height) 189 { 190+#ifdef HAVE_OPENGL 191 GdkGLContext *paint_context; 192 cairo_surface_t *image; 193 cairo_matrix_t matrix; 194@@ -718,6 +725,7 @@ out: 195 if (clip_region) 196 cairo_region_destroy (clip_region); 197 198+#endif 199 } 200 201 /* This is always called with the paint context current */ 202@@ -725,6 +733,7 @@ void 203 gdk_gl_texture_from_surface (cairo_surface_t *surface, 204 cairo_region_t *region) 205 { 206+#ifdef HAVE_OPENGL 207 GdkGLContext *paint_context; 208 cairo_surface_t *image; 209 double device_x_offset, device_y_offset; 210@@ -825,4 +834,5 @@ gdk_gl_texture_from_surface (cairo_surface_t *surface, 211 212 glDisable (GL_SCISSOR_TEST); 213 glDeleteTextures (1, &texture_id); 214+#endif 215 } 216diff --git a/gdk/gdkglcontext.c b/gdk/gdkglcontext.c 217index 3b23639e1c..1f04f8e0b2 100644 218--- a/gdk/gdkglcontext.c 219+++ b/gdk/gdkglcontext.c 220@@ -85,7 +85,9 @@ 221 #include "gdkintl.h" 222 #include "gdk-private.h" 223 224+#ifdef HAVE_OPENGL 225 #include <epoxy/gl.h> 226+#endif 227 228 typedef struct { 229 GdkDisplay *display; 230@@ -243,6 +245,7 @@ gdk_gl_context_upload_texture (GdkGLContext *context, 231 int height, 232 guint texture_target) 233 { 234+#ifdef HAVE_OPENGL 235 GdkGLContextPrivate *priv = gdk_gl_context_get_instance_private (context); 236 237 g_return_if_fail (GDK_IS_GL_CONTEXT (context)); 238@@ -286,6 +289,7 @@ gdk_gl_context_upload_texture (GdkGLContext *context, 239 glTexSubImage2D (texture_target, 0, 0, i, width, 1, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, (unsigned char*) data + (i * stride)); 240 } 241 } 242+#endif 243 } 244 245 static gboolean 246@@ -774,6 +778,7 @@ gdk_gl_context_realize (GdkGLContext *context, 247 static void 248 gdk_gl_context_check_extensions (GdkGLContext *context) 249 { 250+#ifdef HAVE_OPENGL 251 GdkGLContextPrivate *priv = gdk_gl_context_get_instance_private (context); 252 gboolean has_npot, has_texture_rectangle; 253 254@@ -853,6 +858,7 @@ gdk_gl_context_check_extensions (GdkGLContext *context) 255 priv->use_texture_rectangle ? "yes" : "no")); 256 257 priv->extensions_checked = TRUE; 258+#endif 259 } 260 261 /** 262diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c 263index 727b0cf1f4..d4d91b0d16 100644 264--- a/gdk/gdkwindow.c 265+++ b/gdk/gdkwindow.c 266@@ -45,7 +45,9 @@ 267 268 #include <math.h> 269 270+#ifdef HAVE_OPENGL 271 #include <epoxy/gl.h> 272+#endif 273 274 /* for the use of round() */ 275 #include "fallback-c89.c" 276@@ -2844,6 +2846,13 @@ gdk_window_get_paint_gl_context (GdkWindow *window, 277 { 278 GError *internal_error = NULL; 279 280+#ifndef HAVE_OPENGL 281+ g_set_error_literal (error, GDK_GL_ERROR, 282+ GDK_GL_ERROR_NOT_AVAILABLE, 283+ _("GL support disabled with --disable-opengl")); 284+ return NULL; 285+#endif 286+ 287 if (_gdk_gl_flags & GDK_GL_DISABLE) 288 { 289 g_set_error_literal (error, GDK_GL_ERROR, 290@@ -2979,6 +2988,7 @@ gdk_window_begin_paint_internal (GdkWindow *window, 291 } 292 else 293 { 294+#ifdef HAVE_OPENGL 295 gdk_gl_context_make_current (context); 296 /* With gl we always need a surface to combine the gl 297 drawing with the native drawing. */ 298@@ -2993,6 +3003,7 @@ gdk_window_begin_paint_internal (GdkWindow *window, 299 glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 300 301 glViewport (0, 0, ww, wh); 302+#endif 303 } 304 } 305 306@@ -3056,6 +3067,7 @@ gdk_window_end_paint_internal (GdkWindow *window) 307 308 gdk_gl_context_make_current (window->gl_paint_context); 309 310+#ifdef HAVE_OPENGL 311 if (!cairo_region_is_empty (opaque_region)) 312 gdk_gl_texture_from_surface (window->current_paint.surface, 313 opaque_region); 314@@ -3066,6 +3078,7 @@ gdk_window_end_paint_internal (GdkWindow *window) 315 window->current_paint.need_blend_region); 316 glDisable(GL_BLEND); 317 } 318+#endif 319 320 cairo_region_destroy (opaque_region); 321 322diff --git a/gdk/meson.build b/gdk/meson.build 323index 4bb1bf2b6c..64172b8d3e 100644 324--- a/gdk/meson.build 325+++ b/gdk/meson.build 326@@ -56,7 +56,6 @@ gdk_gir_public_headers = files( 327 'gdkdrawingcontext.h', 328 'gdkevents.h', 329 'gdkframetimings.h', 330- 'gdkglcontext.h', 331 'gdkkeys.h', 332 'gdkkeysyms.h', 333 'gdkmain.h', 334@@ -78,6 +77,12 @@ gdk_gir_public_headers = files( 335 'gdkwindow.h', 336 ) 337 gdk_nogir_public_headers = [files('gdkkeysyms-compat.h')] 338+if opengl_enabled 339+gdk_gir_public_headers += files('gdkglcontext.h') 340+else 341+gdk_nogir_public_headers += files('gdkglcontext.h') 342+endif 343+ 344 gdk_public_headers = gdk_gir_public_headers + gdk_nogir_public_headers 345 install_headers(gdk_public_headers, subdir : 'gtk-3.0/gdk') 346 347@@ -166,6 +171,7 @@ gdkconfig_cdata.set('GDK_WINDOWING_WAYLAND', wayland_enabled) 348 gdkconfig_cdata.set('GDK_WINDOWING_WIN32', win32_enabled) 349 gdkconfig_cdata.set('GDK_WINDOWING_BROADWAY', broadway_enabled) 350 gdkconfig_cdata.set('GDK_WINDOWING_QUARTZ', quartz_enabled) 351+gdkconfig_cdata.set('GDK_WITH_OPENGL', opengl_enabled) 352 353 gdkconfig = configure_file( 354 input : 'gdkconfig.h.meson', 355diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c 356index 7e08f472cc..30fd7b6089 100644 357--- a/gdk/x11/gdkdisplay-x11.c 358+++ b/gdk/x11/gdkdisplay-x11.c 359@@ -37,7 +37,9 @@ 360 #include "gdkdisplay-x11.h" 361 #include "gdkprivate-x11.h" 362 #include "gdkscreen-x11.h" 363+#ifdef HAVE_OPENGL 364 #include "gdkglcontext-x11.h" 365+#endif 366 #include "gdk-private.h" 367 #include "gdkprofilerprivate.h" 368 369@@ -3191,7 +3193,9 @@ gdk_x11_display_class_init (GdkX11DisplayClass * class) 370 display_class->text_property_to_utf8_list = _gdk_x11_display_text_property_to_utf8_list; 371 display_class->utf8_to_string_target = _gdk_x11_display_utf8_to_string_target; 372 373- display_class->make_gl_context_current = gdk_x11_display_make_gl_context_current; 374+#ifdef HAVE_OPENGL 375+ display_class->make_gl_context_current = gdk_x11_display_make_gl_context_current; 376+#endif 377 378 display_class->get_default_seat = gdk_x11_display_get_default_seat; 379 380diff --git a/gdk/x11/gdkvisual-x11.c b/gdk/x11/gdkvisual-x11.c 381index 81479d81f4..3c8c5c02ff 100644 382--- a/gdk/x11/gdkvisual-x11.c 383+++ b/gdk/x11/gdkvisual-x11.c 384@@ -306,7 +306,12 @@ _gdk_x11_screen_init_visuals (GdkScreen *screen) 385 /* If GL is available we want to pick better default/rgba visuals, 386 as we care about glx details such as alpha/depth/stencil depth, 387 stereo and double buffering */ 388+ /* update_visuals_for_gl() will end up calling epoxy GLX api which 389+ will exit if libgl is not there: so only do this if we know GL 390+ is available */ 391+#ifdef HAVE_GLX 392 _gdk_x11_screen_update_visuals_for_gl (screen); 393+#endif 394 } 395 396 gint 397diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c 398index 194bc82e29..0302bb68d4 100644 399--- a/gdk/x11/gdkwindow-x11.c 400+++ b/gdk/x11/gdkwindow-x11.c 401@@ -36,7 +36,9 @@ 402 #include "gdkasync.h" 403 #include "gdkeventsource.h" 404 #include "gdkdisplay-x11.h" 405+#ifdef HAVE_OPENGL 406 #include "gdkglcontext-x11.h" 407+#endif 408 #include "gdkprivate-x11.h" 409 #include "gdk-private.h" 410 411@@ -5888,7 +5890,9 @@ gdk_window_impl_x11_class_init (GdkWindowImplX11Class *klass) 412 impl_class->set_opaque_region = gdk_x11_window_set_opaque_region; 413 impl_class->set_shadow_width = gdk_x11_window_set_shadow_width; 414 impl_class->show_window_menu = gdk_x11_window_show_window_menu; 415+#ifdef HAVE_OPENGL 416 impl_class->create_gl_context = gdk_x11_window_create_gl_context; 417 impl_class->invalidate_for_new_frame = gdk_x11_window_invalidate_for_new_frame; 418+#endif 419 impl_class->get_unscaled_size = gdk_x11_window_get_unscaled_size; 420 } 421diff --git a/gdk/x11/gdkx-autocleanups.h b/gdk/x11/gdkx-autocleanups.h 422index edb0ea7dbf..a317d61cca 100644 423--- a/gdk/x11/gdkx-autocleanups.h 424+++ b/gdk/x11/gdkx-autocleanups.h 425@@ -30,7 +30,9 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(GdkX11DeviceXI2, g_object_unref) 426 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GdkX11Display, g_object_unref) 427 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GdkX11DisplayManager, g_object_unref) 428 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GdkX11DragContext, g_object_unref) 429+#ifdef HAVE_OPENGL 430 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GdkX11GLContext, g_object_unref) 431+#endif 432 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GdkX11Keymap, g_object_unref) 433 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GdkX11Screen, g_object_unref) 434 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GdkX11Visual, g_object_unref) 435diff --git a/gdk/x11/gdkx.h b/gdk/x11/gdkx.h 436index 1f64bccb6d..4db6c18351 100644 437--- a/gdk/x11/gdkx.h 438+++ b/gdk/x11/gdkx.h 439@@ -43,7 +43,9 @@ 440 #include <gdk/x11/gdkx11display.h> 441 #include <gdk/x11/gdkx11displaymanager.h> 442 #include <gdk/x11/gdkx11dnd.h> 443+#ifdef GDK_WITH_OPENGL 444 #include <gdk/x11/gdkx11glcontext.h> 445+#endif 446 #include <gdk/x11/gdkx11keys.h> 447 #include <gdk/x11/gdkx11monitor.h> 448 #include <gdk/x11/gdkx11property.h> 449diff --git a/gdk/x11/meson.build b/gdk/x11/meson.build 450index 754ae0a615..0318c83877 100644 451--- a/gdk/x11/meson.build 452+++ b/gdk/x11/meson.build 453@@ -14,7 +14,6 @@ gdk_x11_sources = files( 454 'gdkeventsource.c', 455 'gdkeventtranslator.c', 456 'gdkgeometry-x11.c', 457- 'gdkglcontext-x11.c', 458 'gdkkeys-x11.c', 459 'gdkmain-x11.c', 460 'gdkproperty-x11.c', 461@@ -42,7 +41,6 @@ gdk_x11_public_headers = files( 462 'gdkx11display.h', 463 'gdkx11displaymanager.h', 464 'gdkx11dnd.h', 465- 'gdkx11glcontext.h', 466 'gdkx11keys.h', 467 'gdkx11monitor.h', 468 'gdkx11property.h', 469@@ -53,6 +51,11 @@ gdk_x11_public_headers = files( 470 'gdkx11window.h', 471 ) 472 473+if opengl_enabled 474+ gdk_x11_sources += files('gdkglcontext-x11.c') 475+ gdk_x11_public_headers += files('gdkx11glcontext.h') 476+endif 477+ 478 install_headers(gdk_x11_public_headers, subdir: 'gtk-3.0/gdk/x11/') 479 install_headers('gdkx.h', subdir: 'gtk-3.0/gdk/') 480 481diff --git a/gtk/gtkglarea.c b/gtk/gtkglarea.c 482index 802303ea9f..6439d7745d 100644 483--- a/gtk/gtkglarea.c 484+++ b/gtk/gtkglarea.c 485@@ -29,7 +29,9 @@ 486 #include "gtkprivate.h" 487 #include "gtkrender.h" 488 489+#ifdef HAVE_OPENGL 490 #include <epoxy/gl.h> 491+#endif 492 493 /** 494 * SECTION:gtkglarea 495@@ -369,9 +371,12 @@ gtk_gl_area_real_create_context (GtkGLArea *area) 496 static void 497 gtk_gl_area_resize (GtkGLArea *area, int width, int height) 498 { 499+#ifdef HAVE_OPENGL 500 glViewport (0, 0, width, height); 501+#endif 502 } 503 504+#ifdef HAVE_OPENGL 505 /* 506 * Creates all the buffer objects needed for rendering the scene 507 */ 508@@ -483,6 +488,7 @@ gtk_gl_area_allocate_buffers (GtkGLArea *area) 509 510 priv->needs_render = TRUE; 511 } 512+#endif 513 514 /** 515 * gtk_gl_area_attach_buffers: 516@@ -501,6 +507,7 @@ gtk_gl_area_allocate_buffers (GtkGLArea *area) 517 void 518 gtk_gl_area_attach_buffers (GtkGLArea *area) 519 { 520+#ifdef HAVE_OPENGL 521 GtkGLAreaPrivate *priv = gtk_gl_area_get_instance_private (area); 522 523 g_return_if_fail (GTK_IS_GL_AREA (area)); 524@@ -533,11 +540,13 @@ gtk_gl_area_attach_buffers (GtkGLArea *area) 525 glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, 526 GL_RENDERBUFFER, priv->depth_stencil_buffer); 527 } 528+#endif 529 } 530 531 static void 532 gtk_gl_area_delete_buffers (GtkGLArea *area) 533 { 534+#ifdef HAVE_OPENGL 535 GtkGLAreaPrivate *priv = gtk_gl_area_get_instance_private (area); 536 537 if (priv->context == NULL) 538@@ -569,6 +578,7 @@ gtk_gl_area_delete_buffers (GtkGLArea *area) 539 glDeleteFramebuffers (1, &priv->frame_buffer); 540 priv->frame_buffer = 0; 541 } 542+#endif 543 } 544 545 static void 546@@ -679,6 +689,7 @@ gtk_gl_area_draw (GtkWidget *widget, 547 GtkGLArea *area = GTK_GL_AREA (widget); 548 GtkGLAreaPrivate *priv = gtk_gl_area_get_instance_private (area); 549 gboolean unused; 550+#ifdef HAVE_OPENGL 551 int w, h, scale; 552 GLenum status; 553 554@@ -736,6 +747,14 @@ gtk_gl_area_draw (GtkWidget *widget, 555 } 556 557 return TRUE; 558+#else 559+ if (priv->error != NULL) 560+ gtk_gl_area_draw_error_screen (area, 561+ cr, 562+ gtk_widget_get_allocated_width (widget), 563+ gtk_widget_get_allocated_height (widget)); 564+ return FALSE; 565+#endif 566 } 567 568 static gboolean 569diff --git a/gtk/inspector/general.c b/gtk/inspector/general.c 570index 4fd0c3039c..a8e59ed077 100644 571--- a/gtk/inspector/general.c 572+++ b/gtk/inspector/general.c 573@@ -33,8 +33,10 @@ 574 575 #ifdef GDK_WINDOWING_X11 576 #include "x11/gdkx.h" 577+#ifdef HAVE_OPENGL 578 #include <epoxy/glx.h> 579 #endif 580+#endif 581 582 #ifdef GDK_WINDOWING_WIN32 583 #include "win32/gdkwin32.h" 584@@ -217,6 +219,7 @@ add_label_row (GtkInspectorGeneral *gen, 585 gtk_size_group_add_widget (GTK_SIZE_GROUP (gen->priv->labels), label); 586 } 587 588+#ifdef HAVE_OPENGL 589 #ifdef GDK_WINDOWING_X11 590 static void 591 append_glx_extension_row (GtkInspectorGeneral *gen, 592@@ -226,6 +229,7 @@ append_glx_extension_row (GtkInspectorGeneral *gen, 593 add_check_row (gen, GTK_LIST_BOX (gen->priv->gl_box), ext, epoxy_has_glx_extension (dpy, 0, ext), 0); 594 } 595 #endif 596+#endif 597 598 #ifdef GDK_WINDOWING_WAYLAND 599 static void 600@@ -275,6 +279,7 @@ wayland_get_display (struct wl_display *wl_display) 601 static void 602 init_gl (GtkInspectorGeneral *gen) 603 { 604+#ifdef HAVE_OPENGL 605 #ifdef GDK_WINDOWING_X11 606 if (GDK_IS_X11_DISPLAY (gdk_display_get_default ())) 607 { 608@@ -301,6 +306,7 @@ init_gl (GtkInspectorGeneral *gen) 609 } 610 else 611 #endif 612+#endif 613 #ifdef GDK_WINDOWING_WAYLAND 614 if (GDK_IS_WAYLAND_DISPLAY (gdk_display_get_default ())) 615 { 616diff --git a/meson.build b/meson.build 617index aed48fc3f6..bfc33af0f6 100644 618--- a/meson.build 619+++ b/meson.build 620@@ -137,6 +137,7 @@ wayland_enabled = get_option('wayland_backend') 621 broadway_enabled = get_option('broadway_backend') 622 quartz_enabled = get_option('quartz_backend') 623 win32_enabled = get_option('win32_backend') 624+opengl_enabled = get_option('opengl') 625 626 os_unix = false 627 os_linux = false 628@@ -430,7 +431,7 @@ pangocairo_dep = dependency('pangocairo', version: cairo_req, 629 fallback : ['pango', 'libpangocairo_dep']) 630 pixbuf_dep = dependency('gdk-pixbuf-2.0', version: gdk_pixbuf_req, 631 fallback : ['gdk-pixbuf', 'gdkpixbuf_dep']) 632-epoxy_dep = dependency('epoxy', version: epoxy_req, 633+epoxy_dep = dependency('epoxy', version: epoxy_req, required: opengl_enabled, 634 fallback: ['libepoxy', 'libepoxy_dep']) 635 atk_dep = dependency('atk', version: atk_req, 636 fallback : ['atk', 'libatk_dep']) 637@@ -476,6 +477,10 @@ if tracker3_enabled 638 endif 639 endif 640 641+if opengl_enabled 642+ cdata.set('HAVE_OPENGL', 1) 643+endif 644+ 645 if iso_codes_dep.found() 646 cdata.set_quoted('ISO_CODES_PREFIX', iso_codes_dep.get_variable(pkgconfig: 'prefix')) 647 else 648@@ -912,9 +917,15 @@ else 649 gio_packages = ['gio-2.0', glib_req] 650 endif 651 652+if opengl_enabled 653+ epoxy_packages = ['epoxy', epoxy_req] 654+else 655+ epoxy_packages = [] 656+endif 657+ 658 pkgconf.set('GDK_PRIVATE_PACKAGES', 659 ' '.join(gio_packages + x11_pkgs + wayland_pkgs + cairo_backends + 660- ['epoxy', epoxy_req] + cloudproviders_packages + 661+ epoxy_packages + cloudproviders_packages + 662 ['fribidi', fribidi_req])) 663 664 gtk_packages = ' '.join([ 665@@ -928,7 +939,7 @@ pkgconf.set('GTK_PACKAGES', gtk_packages) 666 # Requires.private 667 pc_gdk_extra_libs += cairo_libs 668 669-gtk_private_packages = atk_pkgs + wayland_pkgs + ['epoxy', epoxy_req, 'fribidi', fribidi_req] 670+gtk_private_packages = atk_pkgs + wayland_pkgs + epoxy_packages + ['fribidi', fribidi_req] 671 if wayland_enabled or x11_enabled 672 gtk_private_packages += ['pangoft2'] 673 endif 674diff --git a/meson_options.txt b/meson_options.txt 675index 94099aa01e..8bd096896d 100644 676--- a/meson_options.txt 677+++ b/meson_options.txt 678@@ -19,6 +19,8 @@ option('profiler', type: 'boolean', value: false, 679 description : 'Enable profiler support') 680 option('tracker3', type: 'boolean', value: false, 681 description : 'Enable Tracker3 filechooser search') 682+option('opengl', type: 'boolean', value: true, 683+ description : 'Enable use of GL') 684 685 # Print backends 686 option('print_backends', type : 'string', value : 'auto', 687diff --git a/tests/meson.build b/tests/meson.build 688index 586fe2f45e..6ecf317dde 100644 689--- a/tests/meson.build 690+++ b/tests/meson.build 691@@ -5,7 +5,6 @@ gtk_tests = [ 692 ['scrolling-performance', ['frame-stats.c', 'variable.c']], 693 ['blur-performance', ['../gtk/gtkcairoblur.c']], 694 ['flicker'], 695- ['gdkgears', ['gtkgears.c']], 696 ['listmodel'], 697 ['motion-compression'], 698 ['styleexamples'], 699@@ -54,7 +53,6 @@ gtk_tests = [ 700 ['testfullscreen'], 701 ['testgeometry'], 702 ['testgiconpixbuf'], 703- ['testglblending', ['gtkgears.c']], 704 ['testgmenu'], 705 ['testgrid'], 706 ['testgrouping'], 707@@ -137,6 +135,13 @@ if x11_enabled 708 ] 709 endif 710 711+if opengl_enabled 712+ gtk_tests += [ 713+ ['gdkgears', ['gtkgears.c']], 714+ ['testglblending', ['gtkgears.c']], 715+ ] 716+endif 717+ 718 if os_linux 719 gtk_tests += [['testfontchooserdialog']] 720 endif 721diff --git a/testsuite/gtk/objects-finalize.c b/testsuite/gtk/objects-finalize.c 722index 24540e313f..e0f863ab6a 100644 723--- a/testsuite/gtk/objects-finalize.c 724+++ b/testsuite/gtk/objects-finalize.c 725@@ -116,7 +116,9 @@ main (int argc, char **argv) 726 all_types[i] != GDK_TYPE_X11_DEVICE_MANAGER_CORE && 727 all_types[i] != GDK_TYPE_X11_DEVICE_MANAGER_XI2 && 728 all_types[i] != GDK_TYPE_X11_DISPLAY_MANAGER && 729+#ifdef HAVE_OPENGL 730 all_types[i] != GDK_TYPE_X11_GL_CONTEXT && 731+#endif 732 #endif 733 /* Not allowed to finalize a GdkPixbufLoader without calling gdk_pixbuf_loader_close() */ 734 all_types[i] != GDK_TYPE_PIXBUF_LOADER && 735-- 7362.30.2 737 738