From: Benjamin Otte Date: Thu, 7 Oct 2021 15:59:17 +0000 (+0200) Subject: glcontext: Add GdkGLContext::allowed-apis X-Git-Tag: archive/raspbian/4.6.5+ds-1+rpi1~1^2~19^2~5^2~250^2~3 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=c6dd3c11fa03acfa87c61ad82c67cfec179c9041;p=gtk4.git glcontext: Add GdkGLContext::allowed-apis This allows specifying the GL APIs in a more comprehensive way than gdk_gl_context_set_use_es(). --- 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 #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 */ @@ -1142,6 +1176,57 @@ gdk_gl_context_is_shared (GdkGLContext *self, return GDK_GL_CONTEXT_GET_CLASS (self)->is_shared (self, other); } +/** + * 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` 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);