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