diff options
author | Benjamin Otte <otte@redhat.com> | 2021-10-07 17:59:17 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2021-10-08 03:31:07 +0200 |
commit | c6dd3c11fa03acfa87c61ad82c67cfec179c9041 (patch) | |
tree | f67d3005e0963e434acfbf5dfaa24d21a049e217 | |
parent | 76420d71461c1aa4f65e6d7ae186be8a8647d81a (diff) | |
download | gtk+-c6dd3c11fa03acfa87c61ad82c67cfec179c9041.tar.gz |
glcontext: Add GdkGLContext::allowed-apis
This allows specifying the GL APIs in a more comprehensive way than
gdk_gl_context_set_use_es().
-rw-r--r-- | gdk/gdkglcontext.c | 101 | ||||
-rw-r--r-- | gdk/gdkglcontext.h | 19 |
2 files changed, 112 insertions, 8 deletions
diff --git a/gdk/gdkglcontext.c b/gdk/gdkglcontext.c index 5ea41cdeec..8f932df84f 100644 --- a/gdk/gdkglcontext.c +++ b/gdk/gdkglcontext.c @@ -94,6 +94,8 @@ #include <epoxy/egl.h> #endif +#define DEFAULT_ALLOWED_APIS GDK_GL_API_GL | GDK_GL_API_GLES + typedef struct { int major; int minor; @@ -109,6 +111,7 @@ typedef struct { guint forward_compatible : 1; guint is_legacy : 1; + GdkGLAPI allowed_apis; int use_es; int max_debug_label_length; @@ -121,12 +124,13 @@ typedef struct { enum { PROP_0, + PROP_ALLOWED_APIS, PROP_SHARED_CONTEXT, LAST_PROP }; -static GParamSpec *obj_pspecs[LAST_PROP] = { NULL, }; +static GParamSpec *properties[LAST_PROP] = { NULL, }; G_DEFINE_QUARK (gdk-gl-error-quark, gdk_gl_error) @@ -195,36 +199,49 @@ gdk_gl_context_dispose (GObject *gobject) } static void -gdk_gl_context_set_property (GObject *gobject, +gdk_gl_context_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { + GdkGLContext *self = GDK_GL_CONTEXT (object); + switch (prop_id) { + case PROP_ALLOWED_APIS: + gdk_gl_context_set_allowed_apis (self, g_value_get_flags (value)); + break; + case PROP_SHARED_CONTEXT: g_assert (g_value_get_object (value) == NULL); break; default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void -gdk_gl_context_get_property (GObject *gobject, +gdk_gl_context_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { + GdkGLContext *self = GDK_GL_CONTEXT (object); + GdkGLContextPrivate *priv = gdk_gl_context_get_instance_private (self); + switch (prop_id) { + case PROP_ALLOWED_APIS: + g_value_set_flags (value, priv->allowed_apis); + break; + case PROP_SHARED_CONTEXT: g_value_set_object (value, NULL); break; default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } @@ -716,7 +733,7 @@ gdk_gl_context_class_init (GdkGLContextClass *klass) * Deprecated: 4.4: Use [method@Gdk.GLContext.is_shared] to check if contexts * can be shared. */ - obj_pspecs[PROP_SHARED_CONTEXT] = + properties[PROP_SHARED_CONTEXT] = g_param_spec_object ("shared-context", P_("Shared context"), P_("The GL context this context shares data with"), @@ -726,11 +743,28 @@ gdk_gl_context_class_init (GdkGLContextClass *klass) G_PARAM_STATIC_STRINGS | G_PARAM_DEPRECATED); + /** + * GdkGLContext:allowed-apis: (attributes org.gtk.Property.get=gdk_gl_context_get_allowed_apis org.gtk.Property.gdk_gl_context_set_allowed_apis) + * + * The allowed APIs. + * + * Since: 4.6 + */ + properties[PROP_ALLOWED_APIS] = + g_param_spec_flags ("allowed-apis", + P_("Allowed APIs"), + P_("The list of allowed APIs for this context"), + GDK_TYPE_GL_API, + DEFAULT_ALLOWED_APIS, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS | + G_PARAM_EXPLICIT_NOTIFY); + gobject_class->set_property = gdk_gl_context_set_property; gobject_class->get_property = gdk_gl_context_get_property; gobject_class->dispose = gdk_gl_context_dispose; - g_object_class_install_properties (gobject_class, LAST_PROP, obj_pspecs); + g_object_class_install_properties (gobject_class, LAST_PROP, properties); } static void @@ -738,7 +772,7 @@ gdk_gl_context_init (GdkGLContext *self) { GdkGLContextPrivate *priv = gdk_gl_context_get_instance_private (self); - priv->use_es = -1; + priv->allowed_apis = DEFAULT_ALLOWED_APIS; } /* Must have called gdk_display_prepare_gl() before */ @@ -1143,6 +1177,57 @@ gdk_gl_context_is_shared (GdkGLContext *self, } /** + * gdk_gl_context_set_allowed_apis: (attributes org.gtk.Method.set_property=allowed-apis) + * @self: a GL context + * @apis: the allowed APIs + * + * Sets the allowed APIs. When gdk_gl_context_realize() is called, only the + * allowed APIs will be tried. If you set this to 0, realizing will always fail. + * + * If you set it on a realized context, the property will not have any effect. + * It is only relevant during gdk_gl_context_realize(). + * + * By default, all APIs are allowed. + * + * Since: 4.6 + **/ +void +gdk_gl_context_set_allowed_apis (GdkGLContext *self, + GdkGLAPI apis) +{ + GdkGLContextPrivate *priv = gdk_gl_context_get_instance_private (self); + + g_return_if_fail (GDK_IS_GL_CONTEXT (self)); + + if (priv->allowed_apis == apis) + return; + + priv->allowed_apis = apis; + + g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_ALLOWED_APIS]); +} + +/** + * gdk_gl_context_get_allowed_apis: (attributes org.gtk.Method.get_property=allowed-apis) + * @self: a GL context + * + * Gets the allowed APIs set via gdk_gl_context_set_allowed_apis(). + * + * Returns: the allowed APIs + * + * Since: 4.6 + **/ +GdkGLAPI +gdk_gl_context_get_allowed_apis (GdkGLContext *self) +{ + GdkGLContextPrivate *priv = gdk_gl_context_get_instance_private (self); + + g_return_val_if_fail (GDK_IS_GL_CONTEXT (self), 0); + + return priv->allowed_apis; +} + +/** * gdk_gl_context_set_use_es: * @context: a `GdkGLContext` * @use_es: whether the context should use OpenGL ES instead of OpenGL, diff --git a/gdk/gdkglcontext.h b/gdk/gdkglcontext.h index dab3319429..8205d85339 100644 --- a/gdk/gdkglcontext.h +++ b/gdk/gdkglcontext.h @@ -30,6 +30,20 @@ G_BEGIN_DECLS +/** + * GdkGLAPI: + * @GDK_GL_API_GL: The OpenGL API + * @GDK_GL_API_GLES: The OpenGL ES API + * + * The list of the different APIs that GdkGLContext can potentially support. + * + * Since: 4.6 + */ +typedef enum { /*< underscore_name=GDK_GL_API >*/ + GDK_GL_API_GL = 1 << 0, + GDK_GL_API_GLES = 1 << 1 +} GdkGLAPI; + #define GDK_TYPE_GL_CONTEXT (gdk_gl_context_get_type ()) #define GDK_GL_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GDK_TYPE_GL_CONTEXT, GdkGLContext)) #define GDK_IS_GL_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GDK_TYPE_GL_CONTEXT)) @@ -76,6 +90,11 @@ void gdk_gl_context_set_forward_compatible (GdkGLContext * gboolean compatible); GDK_AVAILABLE_IN_ALL gboolean gdk_gl_context_get_forward_compatible (GdkGLContext *context); +GDK_AVAILABLE_IN_4_6 +void gdk_gl_context_set_allowed_apis (GdkGLContext *self, + GdkGLAPI apis); +GDK_AVAILABLE_IN_4_6 +GdkGLAPI gdk_gl_context_get_allowed_apis (GdkGLContext *self); GDK_AVAILABLE_IN_ALL void gdk_gl_context_set_use_es (GdkGLContext *context, int use_es); |