diff options
author | Matthias Clasen <mclasen@redhat.com> | 2023-04-04 03:14:21 +0000 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2023-04-04 03:14:21 +0000 |
commit | 6a2f715250b5ff15f8bbf5f805a957010f3627dd (patch) | |
tree | 71944c8a4240e17d1b51d2c10afe5f1c0c7c8b92 | |
parent | 7723045e9acf1b4785c43e44bae5883aee6b7e49 (diff) | |
parent | b1f0ca7dc4c74fb34c5c9455cae197ef1464ac82 (diff) | |
download | gtk+-6a2f715250b5ff15f8bbf5f805a957010f3627dd.tar.gz |
Merge branch 'glarea-allowed-apis' into 'main'
glarea: Add GtkGLArea::allowed-apis
Closes #5330
See merge request GNOME/gtk!5786
-rw-r--r-- | demos/gtk-demo/glarea.c | 5 | ||||
-rw-r--r-- | demos/gtk-demo/gtkgears.c | 7 | ||||
-rw-r--r-- | gtk/gtkglarea.c | 156 | ||||
-rw-r--r-- | gtk/gtkglarea.h | 13 |
4 files changed, 159 insertions, 22 deletions
diff --git a/demos/gtk-demo/glarea.c b/demos/gtk-demo/glarea.c index 430f44cde0..43942f5f7e 100644 --- a/demos/gtk-demo/glarea.c +++ b/demos/gtk-demo/glarea.c @@ -221,16 +221,13 @@ static void realize (GtkWidget *widget) { const char *vertex_path, *fragment_path; - GdkGLContext *context; gtk_gl_area_make_current (GTK_GL_AREA (widget)); if (gtk_gl_area_get_error (GTK_GL_AREA (widget)) != NULL) return; - context = gtk_gl_area_get_context (GTK_GL_AREA (widget)); - - if (gdk_gl_context_get_use_es (context)) + if (gtk_gl_area_get_api (GTK_GL_AREA (widget)) == GDK_GL_API_GLES) { vertex_path = "/glarea/glarea-gles.vs.glsl"; fragment_path = "/glarea/glarea-gles.fs.glsl"; diff --git a/demos/gtk-demo/gtkgears.c b/demos/gtk-demo/gtkgears.c index 10a80b18e8..0c0ea3398a 100644 --- a/demos/gtk-demo/gtkgears.c +++ b/demos/gtk-demo/gtkgears.c @@ -737,7 +737,6 @@ gtk_gears_realize (GtkWidget *widget) GtkGLArea *glarea = GTK_GL_AREA (widget); GtkGears *gears = GTK_GEARS (widget); GtkGearsPrivate *priv = gtk_gears_get_instance_private (gears); - GdkGLContext *context; GLuint vao, v, f, program; const char *p; char msg[512]; @@ -748,8 +747,6 @@ gtk_gears_realize (GtkWidget *widget) if (gtk_gl_area_get_error (glarea) != NULL) return; - context = gtk_gl_area_get_context (glarea); - glEnable (GL_CULL_FACE); glEnable (GL_DEPTH_TEST); @@ -759,7 +756,7 @@ gtk_gears_realize (GtkWidget *widget) priv->vao = vao; /* Compile the vertex shader */ - if (gdk_gl_context_get_use_es (context)) + if (gtk_gl_area_get_api (glarea) == GDK_GL_API_GLES) p = vertex_shader_gles; else p = vertex_shader_gl; @@ -770,7 +767,7 @@ gtk_gears_realize (GtkWidget *widget) g_debug ("vertex shader info: %s\n", msg); /* Compile the fragment shader */ - if (gdk_gl_context_get_use_es (context)) + if (gtk_gl_area_get_api (glarea) == GDK_GL_API_GLES) p = fragment_shader_gles; else p = fragment_shader_gl; diff --git a/gtk/gtkglarea.c b/gtk/gtkglarea.c index 110accdcf3..cbd18aebf7 100644 --- a/gtk/gtkglarea.c +++ b/gtk/gtkglarea.c @@ -169,6 +169,7 @@ typedef struct { gboolean needs_render; gboolean auto_render; gboolean use_es; + GdkGLAPI allowed_apis; } GtkGLAreaPrivate; enum { @@ -178,6 +179,8 @@ enum { PROP_HAS_DEPTH_BUFFER, PROP_HAS_STENCIL_BUFFER, PROP_USE_ES, + PROP_ALLOWED_APIS, + PROP_API, PROP_AUTO_RENDER, @@ -224,7 +227,13 @@ gtk_gl_area_set_property (GObject *gobject, break; case PROP_USE_ES: +G_GNUC_BEGIN_IGNORE_DEPRECATIONS gtk_gl_area_set_use_es (self, g_value_get_boolean (value)); +G_GNUC_END_IGNORE_DEPRECATIONS + break; + + case PROP_ALLOWED_APIS: + gtk_gl_area_set_allowed_apis (self, g_value_get_flags (value)); break; default: @@ -259,7 +268,17 @@ gtk_gl_area_get_property (GObject *gobject, break; case PROP_USE_ES: - g_value_set_boolean (value, priv->use_es); +G_GNUC_BEGIN_IGNORE_DEPRECATIONS + g_value_set_boolean (value, gtk_gl_area_get_use_es (GTK_GL_AREA (gobject))); +G_GNUC_END_IGNORE_DEPRECATIONS + break; + + case PROP_ALLOWED_APIS: + g_value_set_flags (value, priv->allowed_apis); + break; + + case PROP_API: + g_value_set_flags (value, gtk_gl_area_get_api (GTK_GL_AREA (gobject))); break; default: @@ -321,7 +340,7 @@ gtk_gl_area_real_create_context (GtkGLArea *area) return NULL; } - gdk_gl_context_set_allowed_apis (context, priv->use_es ? GDK_GL_API_GLES : GDK_GL_API_GL); + gdk_gl_context_set_allowed_apis (context, priv->allowed_apis); gdk_gl_context_set_required_version (context, priv->required_gl_version / 10, priv->required_gl_version % 10); @@ -502,7 +521,7 @@ gtk_gl_area_allocate_texture (GtkGLArea *area) glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - if (gdk_gl_context_get_use_es (priv->context)) + if (gdk_gl_context_get_api (priv->context) == GDK_GL_API_GLES) glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); else glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL); @@ -859,6 +878,8 @@ gtk_gl_area_class_init (GtkGLAreaClass *klass) * * If set to %TRUE the widget will try to create a `GdkGLContext` using * OpenGL ES instead of OpenGL. + * + * Deprecated: 4.12: Use [property@Gtk.GLArea:allowed-apis] */ obj_props[PROP_USE_ES] = g_param_spec_boolean ("use-es", NULL, NULL, @@ -867,6 +888,36 @@ gtk_gl_area_class_init (GtkGLAreaClass *klass) G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + /** + * GdkGLArea:allowed-apis: (attributes org.gtk.Property.get=gtk_gl_area_get_allowed_apis org.gtk.Property.set=gtk_gl_area_set_allowed_apis) + * + * The allowed APIs. + * + * Since: 4.12 + */ + obj_props[PROP_ALLOWED_APIS] = + g_param_spec_flags ("allowed-apis", NULL, NULL, + GDK_TYPE_GL_API, + GDK_GL_API_GL | GDK_GL_API_GLES, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS | + G_PARAM_EXPLICIT_NOTIFY); + + /** + * GdkGLArea:api: (attributes org.gtk.Property.get=gtk_gl_area_get_api) + * + * The API currently in use. + * + * Since: 4.12 + */ + obj_props[PROP_API] = + g_param_spec_flags ("api", NULL, NULL, + GDK_TYPE_GL_API, + 0, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS | + G_PARAM_EXPLICIT_NOTIFY); + gobject_class->set_property = gtk_gl_area_set_property; gobject_class->get_property = gtk_gl_area_get_property; gobject_class->notify = gtk_gl_area_notify; @@ -968,6 +1019,7 @@ gtk_gl_area_init (GtkGLArea *area) priv->auto_render = TRUE; priv->needs_render = TRUE; priv->required_gl_version = 0; + priv->allowed_apis = GDK_GL_API_GL | GDK_GL_API_GLES; } /** @@ -1034,6 +1086,8 @@ gtk_gl_area_get_error (GtkGLArea *area) * * You should check the capabilities of the `GdkGLContext` before drawing * with either API. + * + * Deprecated: 4.12: Use [method@Gtk.GLArea.set_allowed_apis] */ void gtk_gl_area_set_use_es (GtkGLArea *area, @@ -1044,14 +1098,10 @@ gtk_gl_area_set_use_es (GtkGLArea *area, g_return_if_fail (GTK_IS_GL_AREA (area)); g_return_if_fail (!gtk_widget_get_realized (GTK_WIDGET (area))); - use_es = !!use_es; + priv->allowed_apis = use_es ? GDK_GL_API_GLES : GDK_GL_API_GL; - if (priv->use_es != use_es) - { - priv->use_es = use_es; - - g_object_notify_by_pspec (G_OBJECT (area), obj_props[PROP_USE_ES]); - } + g_object_notify_by_pspec (G_OBJECT (area), obj_props[PROP_USE_ES]); + g_object_notify_by_pspec (G_OBJECT (area), obj_props[PROP_ALLOWED_APIS]); } /** @@ -1064,6 +1114,8 @@ gtk_gl_area_set_use_es (GtkGLArea *area, * * Returns: %TRUE if the `GtkGLArea` should create an OpenGL ES context * and %FALSE otherwise + * + * Deprecated: 4.12: Use [method@Gtk.GLArea.get_api] */ gboolean gtk_gl_area_get_use_es (GtkGLArea *area) @@ -1072,7 +1124,89 @@ gtk_gl_area_get_use_es (GtkGLArea *area) g_return_val_if_fail (GTK_IS_GL_AREA (area), FALSE); - return priv->use_es; + if (priv->context) + return gdk_gl_context_get_api (priv->context) == GDK_GL_API_GLES; + else + return priv->allowed_apis == GDK_GL_API_GLES; +} + +/** + * gtk_gl_area_set_allowed_apis: + * @area: a `GtkGLArea` + * @apis: the allowed APIs + * + * Sets the allowed APIs to create a context with. + * + * You should check [property@Gtk.GLArea:api] before drawing + * with either API. + * + * By default, all APIs are allowed. + * + * Since: 4.12 + */ +void +gtk_gl_area_set_allowed_apis (GtkGLArea *area, + GdkGLAPI apis) +{ + GtkGLAreaPrivate *priv = gtk_gl_area_get_instance_private (area); + + g_return_if_fail (GTK_IS_GL_AREA (area)); + g_return_if_fail (!gtk_widget_get_realized (GTK_WIDGET (area))); + + if (priv->allowed_apis == apis) + return; + + priv->allowed_apis = apis; + + g_object_notify_by_pspec (G_OBJECT (area), obj_props[PROP_USE_ES]); + g_object_notify_by_pspec (G_OBJECT (area), obj_props[PROP_ALLOWED_APIS]); +} + +/** + * gtk_gl_area_get_allowed_apis: + * @area: a `GtkGLArea` + * + * Gets the allowed APIs. + * + * See [method@Gtk.GLArea.set_allowed_apis]. + * + * Returns: the allowed APIs + * + * Since: 4.12 + */ +GdkGLAPI +gtk_gl_area_get_allowed_apis (GtkGLArea *area) +{ + GtkGLAreaPrivate *priv = gtk_gl_area_get_instance_private (area); + + g_return_val_if_fail (GTK_IS_GL_AREA (area), 0); + + return priv->allowed_apis; +} + +/** + * gtk_gl_area_get_api: + * @area: a `GtkGLArea` + * + * Gets the API that is currently in use. + * + * If the GL area has not been realized yet, 0 is returned. + * + * Returns: the currently used API + * + * Since: 4.12 + */ +GdkGLAPI +gtk_gl_area_get_api (GtkGLArea *area) +{ + GtkGLAreaPrivate *priv = gtk_gl_area_get_instance_private (area); + + g_return_val_if_fail (GTK_IS_GL_AREA (area), 0); + + if (priv->context) + return gdk_gl_context_get_api (priv->context); + else + return 0; } /** diff --git a/gtk/gtkglarea.h b/gtk/gtkglarea.h index 3458746b81..4bf1adc8de 100644 --- a/gtk/gtkglarea.h +++ b/gtk/gtkglarea.h @@ -75,11 +75,20 @@ GType gtk_gl_area_get_type (void) G_GNUC_CONST; GDK_AVAILABLE_IN_ALL GtkWidget * gtk_gl_area_new (void); -GDK_AVAILABLE_IN_ALL +GDK_AVAILABLE_IN_4_12 +void gtk_gl_area_set_allowed_apis (GtkGLArea *area, + GdkGLAPI apis); +GDK_AVAILABLE_IN_4_12 +GdkGLAPI gtk_gl_area_get_allowed_apis (GtkGLArea *area); +GDK_AVAILABLE_IN_4_12 +GdkGLAPI gtk_gl_area_get_api (GtkGLArea *area); + +GDK_DEPRECATED_IN_4_12_FOR(gtk_gl_area_set_allowed_apis) void gtk_gl_area_set_use_es (GtkGLArea *area, gboolean use_es); -GDK_AVAILABLE_IN_ALL +GDK_DEPRECATED_IN_4_12_FOR(gtk_gl_area_get_api) gboolean gtk_gl_area_get_use_es (GtkGLArea *area); + GDK_AVAILABLE_IN_ALL void gtk_gl_area_set_required_version (GtkGLArea *area, int major, |