diff options
author | Matthias Clasen <mclasen@redhat.com> | 2019-06-05 12:10:24 +0000 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2019-06-05 12:10:24 +0000 |
commit | c168116e6405f2de8974d5180549982ee7ee31a3 (patch) | |
tree | 8636a279a4232f74b5226686af306c0d93547911 /gdk | |
parent | e7cb88b710726c2692715d230d358ab133c7638a (diff) | |
parent | 0dcb71722a6cb274b4698b8aa6626d33041fe130 (diff) | |
download | gtk+-c168116e6405f2de8974d5180549982ee7ee31a3.tar.gz |
Merge branch 'wip/matthiasc/shared-glyph-cache' into 'master'
Share the glyph cache
See merge request GNOME/gtk!912
Diffstat (limited to 'gdk')
-rw-r--r-- | gdk/gdkinternals.h | 2 | ||||
-rw-r--r-- | gdk/gdksurface.c | 40 | ||||
-rw-r--r-- | gdk/wayland/gdkglcontext-wayland.c | 7 | ||||
-rw-r--r-- | gdk/x11/gdkglcontext-x11.c | 8 |
4 files changed, 52 insertions, 5 deletions
diff --git a/gdk/gdkinternals.h b/gdk/gdkinternals.h index 143ed59529..13b139f5ce 100644 --- a/gdk/gdkinternals.h +++ b/gdk/gdkinternals.h @@ -274,6 +274,8 @@ void gdk_surface_move_resize (GdkSurface *surface, gint width, gint height); +GdkGLContext *gdk_surface_get_shared_data_gl_context (GdkSurface *surface); + G_END_DECLS #endif /* __GDK_INTERNALS_H__ */ diff --git a/gdk/gdksurface.c b/gdk/gdksurface.c index 6f0358d0cc..3beff1e9cf 100644 --- a/gdk/gdksurface.c +++ b/gdk/gdksurface.c @@ -1107,6 +1107,46 @@ gdk_surface_get_state (GdkSurface *surface) } GdkGLContext * +gdk_surface_get_shared_data_gl_context (GdkSurface *surface) +{ + static int in_shared_data_creation; + GdkDisplay *display; + GdkGLContext *context; + + if (in_shared_data_creation) + return NULL; + + in_shared_data_creation = 1; + + display = gdk_surface_get_display (surface); + context = (GdkGLContext *)g_object_get_data (G_OBJECT (display), "gdk-gl-shared-data-context"); + if (context == NULL) + { + GError *error = NULL; + context = GDK_SURFACE_GET_CLASS (surface)->create_gl_context (surface, FALSE, NULL, &error); + if (context == NULL) + { + g_warning ("Failed to create shared context: %s", error->message); + g_clear_error (&error); + } + + gdk_gl_context_realize (context, &error); + if (context == NULL) + { + g_warning ("Failed to realize shared context: %s", error->message); + g_clear_error (&error); + } + + + g_object_set_data (G_OBJECT (display), "gdk-gl-shared-data-context", context); + } + + in_shared_data_creation = 0; + + return context; +} + +GdkGLContext * gdk_surface_get_paint_gl_context (GdkSurface *surface, GError **error) { diff --git a/gdk/wayland/gdkglcontext-wayland.c b/gdk/wayland/gdkglcontext-wayland.c index 79751cb8fc..edeca4916c 100644 --- a/gdk/wayland/gdkglcontext-wayland.c +++ b/gdk/wayland/gdkglcontext-wayland.c @@ -47,6 +47,7 @@ gdk_wayland_gl_context_realize (GdkGLContext *context, GdkWaylandGLContext *context_wayland = GDK_WAYLAND_GL_CONTEXT (context); GdkDisplay *display = gdk_gl_context_get_display (context); GdkGLContext *share = gdk_gl_context_get_shared_context (context); + GdkGLContext *shared_data_context = gdk_surface_get_shared_data_gl_context (gdk_gl_context_get_surface (context)); GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display); EGLContext ctx; EGLint context_attribs[N_EGL_ATTRS]; @@ -114,7 +115,8 @@ gdk_wayland_gl_context_realize (GdkGLContext *context, ctx = eglCreateContext (display_wayland->egl_display, context_wayland->egl_config, share != NULL ? GDK_WAYLAND_GL_CONTEXT (share)->egl_context - : EGL_NO_CONTEXT, + : shared_data_context != NULL ? GDK_WAYLAND_GL_CONTEXT (shared_data_context)->egl_context + : EGL_NO_CONTEXT, context_attribs); /* If context creation failed without the legacy bit, let's try again with it */ @@ -136,7 +138,8 @@ gdk_wayland_gl_context_realize (GdkGLContext *context, ctx = eglCreateContext (display_wayland->egl_display, context_wayland->egl_config, share != NULL ? GDK_WAYLAND_GL_CONTEXT (share)->egl_context - : EGL_NO_CONTEXT, + : shared_data_context != NULL ? GDK_WAYLAND_GL_CONTEXT (shared_data_context)->egl_context + : EGL_NO_CONTEXT, context_attribs); } diff --git a/gdk/x11/gdkglcontext-x11.c b/gdk/x11/gdkglcontext-x11.c index b95a18517c..1385713609 100644 --- a/gdk/x11/gdkglcontext-x11.c +++ b/gdk/x11/gdkglcontext-x11.c @@ -576,6 +576,7 @@ gdk_x11_gl_context_realize (GdkGLContext *context, Display *dpy; DrawableInfo *info; GdkGLContext *share; + GdkGLContext *shared_data_context; GdkSurface *surface; gboolean debug_bit, compat_bit, legacy_bit, es_bit; int major, minor, flags; @@ -586,6 +587,7 @@ gdk_x11_gl_context_realize (GdkGLContext *context, context_x11 = GDK_X11_GL_CONTEXT (context); display_x11 = GDK_X11_DISPLAY (display); share = gdk_gl_context_get_shared_context (context); + shared_data_context = gdk_surface_get_shared_data_gl_context (surface); gdk_gl_context_get_required_version (context, &major, &minor); debug_bit = gdk_gl_context_get_debug_enabled (context); @@ -625,7 +627,7 @@ gdk_x11_gl_context_realize (GdkGLContext *context, if (legacy_bit && !GDK_X11_DISPLAY (display)->has_glx_create_context) { GDK_DISPLAY_NOTE (display, OPENGL, g_message ("Creating legacy GL context on request")); - context_x11->glx_context = create_legacy_context (display, context_x11->glx_config, share); + context_x11->glx_context = create_legacy_context (display, context_x11->glx_config, share ? share : shared_data_context); } else { @@ -650,14 +652,14 @@ gdk_x11_gl_context_realize (GdkGLContext *context, GDK_DISPLAY_NOTE (display, OPENGL, g_message ("Creating GL3 context")); context_x11->glx_context = create_gl3_context (display, context_x11->glx_config, - share, + share ? share : shared_data_context, profile, flags, major, minor); /* Fall back to legacy in case the GL3 context creation failed */ if (context_x11->glx_context == NULL) { GDK_DISPLAY_NOTE (display, OPENGL, g_message ("Creating fallback legacy context")); - context_x11->glx_context = create_legacy_context (display, context_x11->glx_config, share); + context_x11->glx_context = create_legacy_context (display, context_x11->glx_config, share ? share : shared_data_context); legacy_bit = TRUE; es_bit = FALSE; } |