gtk2/gdk/x11/gdkglcontext-x11.c
Benjamin Otte 74288eceaf x11: Properly record the error when initializing GL
That way, we can give a useful error message when things break down for
users.

These error messages could still be improved in places (like looking at
the actual EGL error codes), but that seemed overkill.
2021-07-22 16:23:56 +02:00

147 lines
3.8 KiB
C

/* GDK - The GIMP Drawing Kit
*
* gdkglcontext-x11.c: X11 specific OpenGL wrappers
*
* Copyright © 2014 Emmanuele Bassi
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
#include "config.h"
#include "gdkglcontext-x11.h"
#include "gdkdisplay-x11.h"
#include "gdkprivate-x11.h"
#include "gdkscreen-x11.h"
#include "gdkx11display.h"
#include "gdkx11glcontext.h"
#include "gdkx11screen.h"
#include "gdkx11surface.h"
#include "gdkx11property.h"
#include <X11/Xatom.h>
#include "gdkinternals.h"
#include "gdkintl.h"
#include <cairo-xlib.h>
#include <epoxy/glx.h>
G_DEFINE_ABSTRACT_TYPE (GdkX11GLContext, gdk_x11_gl_context, GDK_TYPE_GL_CONTEXT)
static void
gdk_x11_gl_context_class_init (GdkX11GLContextClass *klass)
{
}
static void
gdk_x11_gl_context_init (GdkX11GLContext *self)
{
self->do_frame_sync = TRUE;
}
GdkGLContext *
gdk_x11_surface_create_gl_context (GdkSurface *surface,
gboolean attached,
GdkGLContext *share,
GError **error)
{
GdkX11GLContext *context = NULL;
GdkX11Display *display_x11;
GdkDisplay *display;
display = gdk_surface_get_display (surface);
display_x11 = GDK_X11_DISPLAY (display);
if (display_x11->egl_display)
context = gdk_x11_gl_context_egl_new (surface, attached, share, error);
else if (display_x11->glx_config != NULL)
context = gdk_x11_gl_context_glx_new (surface, attached, share, error);
else
{
g_assert (display_x11->gl_error);
if (error)
*error = g_error_copy (display_x11->gl_error);
return NULL;
}
if (context == NULL)
return NULL;
context->is_attached = attached;
return GDK_GL_CONTEXT (context);
}
gboolean
gdk_x11_display_make_gl_context_current (GdkDisplay *display,
GdkGLContext *context)
{
GdkX11Display *display_x11 = GDK_X11_DISPLAY (display);
if (display_x11->egl_display)
return gdk_x11_gl_context_egl_make_current (display, context);
else if (display_x11->glx_config)
return gdk_x11_gl_context_glx_make_current (display, context);
else
g_assert_not_reached ();
return FALSE;
}
gboolean
gdk_x11_display_init_gl (GdkX11Display *self,
Visual **out_visual,
int *out_depth,
GError **error)
{
GdkDisplay *display G_GNUC_UNUSED = GDK_DISPLAY (self);
GError *egl_error = NULL;
GError *glx_error = NULL;
if (GDK_DISPLAY_DEBUG_CHECK (display, GL_DISABLE))
{
g_set_error_literal (error, GDK_GL_ERROR,
GDK_GL_ERROR_NOT_AVAILABLE,
_("GL support disabled via GDK_DEBUG=gl-disable"));
return FALSE;
}
if (!GDK_DISPLAY_DEBUG_CHECK (display, GL_GLX))
{
/* We favour EGL */
if (gdk_x11_display_init_egl (self, out_visual, out_depth, &egl_error))
return TRUE;
}
if (gdk_x11_display_init_glx (self, out_visual, out_depth, &glx_error))
{
g_clear_error (&egl_error);
return TRUE;
}
if (egl_error)
{
*error = egl_error;
g_clear_error (&glx_error);
}
else
*error = glx_error;
return FALSE;
}