[gtk] gdk: Split out GL texture
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk] gdk: Split out GL texture
- Date: Wed, 7 Mar 2018 15:22:53 +0000 (UTC)
commit 160e6ad6f6fcc9c2819b2f8378763771f14c5320
Author: Benjamin Otte <otte redhat com>
Date: Mon Mar 5 14:38:38 2018 +0100
gdk: Split out GL texture
Put GdkGLTexture into its own file and rename the API to
gdk_gl_texture_foo() instead of gdk_texture_foo_for_gl().
Apart from naming, no actual code changes.
gdk/gdk.h | 1 +
gdk/gdkgltexture.c | 223 ++++++++++++++++++++++++++++++++++++++++++++++
gdk/gdkgltexture.h | 46 ++++++++++
gdk/gdkgltextureprivate.h | 19 ++++
gdk/gdktexture.c | 203 +----------------------------------------
gdk/gdktexture.h | 12 ---
gdk/gdktextureprivate.h | 7 --
gdk/meson.build | 2 +
gsk/gl/gskgldriver.c | 1 +
gsk/gl/gskglrenderer.c | 11 +--
gtk/gtkglarea.c | 12 +--
11 files changed, 305 insertions(+), 232 deletions(-)
---
diff --git a/gdk/gdk.h b/gdk/gdk.h
index d1ee1b55ec..88656a4ca0 100644
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -51,6 +51,7 @@
#include <gdk/gdkframeclock.h>
#include <gdk/gdkframetimings.h>
#include <gdk/gdkglcontext.h>
+#include <gdk/gdkgltexture.h>
#include <gdk/gdkkeys.h>
#include <gdk/gdkkeysyms.h>
#include <gdk/gdkmonitor.h>
diff --git a/gdk/gdkgltexture.c b/gdk/gdkgltexture.c
new file mode 100644
index 0000000000..e2f51c12d6
--- /dev/null
+++ b/gdk/gdkgltexture.c
@@ -0,0 +1,223 @@
+/* gdkgltexture.c
+ *
+ * Copyright 2016 Benjamin Otte
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include "gdkgltextureprivate.h"
+
+#include "gdkcairo.h"
+#include "gdktextureprivate.h"
+
+#include <epoxy/gl.h>
+
+struct _GdkGLTexture {
+ GdkTexture parent_instance;
+
+ GdkGLContext *context;
+ guint id;
+
+ cairo_surface_t *saved;
+
+ GDestroyNotify destroy;
+ gpointer data;
+};
+
+struct _GdkGLTextureClass {
+ GdkTextureClass parent_class;
+};
+
+G_DEFINE_TYPE (GdkGLTexture, gdk_gl_texture, GDK_TYPE_TEXTURE)
+
+static void
+gdk_gl_texture_dispose (GObject *object)
+{
+ GdkGLTexture *self = GDK_GL_TEXTURE (object);
+
+ if (self->destroy)
+ {
+ self->destroy (self->data);
+ self->destroy = NULL;
+ self->data = NULL;
+ }
+
+ g_clear_object (&self->context);
+ self->id = 0;
+
+ if (self->saved)
+ {
+ cairo_surface_destroy (self->saved);
+ self->saved = NULL;
+ }
+
+ G_OBJECT_CLASS (gdk_gl_texture_parent_class)->dispose (object);
+}
+
+static void
+gdk_gl_texture_download (GdkTexture *texture,
+ guchar *data,
+ gsize stride)
+{
+ GdkGLTexture *self = GDK_GL_TEXTURE (texture);
+ cairo_surface_t *surface;
+ cairo_t *cr;
+
+ surface = cairo_image_surface_create_for_data (data,
+ CAIRO_FORMAT_ARGB32,
+ texture->width, texture->height,
+ stride);
+
+ cr = cairo_create (surface);
+
+ if (self->saved)
+ {
+ cairo_set_source_surface (cr, self->saved, 0, 0);
+ cairo_paint (cr);
+ }
+ else
+ {
+ GdkWindow *window;
+
+ window = gdk_gl_context_get_window (self->context);
+ gdk_cairo_draw_from_gl (cr, window, self->id, GL_TEXTURE, 1, 0, 0,
+ texture->width, texture->height);
+ }
+
+ cairo_destroy (cr);
+ cairo_surface_finish (surface);
+ cairo_surface_destroy (surface);
+}
+
+static void
+gdk_gl_texture_class_init (GdkGLTextureClass *klass)
+{
+ GdkTextureClass *texture_class = GDK_TEXTURE_CLASS (klass);
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+ texture_class->download = gdk_gl_texture_download;
+ gobject_class->dispose = gdk_gl_texture_dispose;
+}
+
+static void
+gdk_gl_texture_init (GdkGLTexture *self)
+{
+}
+
+GdkGLContext *
+gdk_gl_texture_get_context (GdkGLTexture *self)
+{
+ return self->context;
+}
+
+guint
+gdk_gl_texture_get_id (GdkGLTexture *self)
+{
+ return self->id;
+}
+
+/**
+ * gdk_gl_texture_release:
+ * @texture: a #GdkTexture wrapping a GL texture
+ *
+ * Releases the GL resources held by a #GdkTexture that
+ * was created with gdk_texture_new_for_gl().
+ *
+ * The texture contents are still available via the
+ * gdk_texture_download() function, after this function
+ * has been called.
+ */
+void
+gdk_gl_texture_release (GdkTexture *texture)
+{
+ GdkGLTexture *self;
+ GdkWindow *window;
+ cairo_t *cr;
+
+ g_return_if_fail (GDK_IS_GL_TEXTURE (texture));
+
+ self = GDK_GL_TEXTURE (texture);
+
+ g_return_if_fail (self->saved == NULL);
+
+ self->saved = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
+ texture->width, texture->height);
+
+ cr = cairo_create (self->saved);
+
+ window = gdk_gl_context_get_window (self->context);
+ gdk_cairo_draw_from_gl (cr, window, self->id, GL_TEXTURE, 1, 0, 0,
+ texture->width, texture->height);
+
+ cairo_destroy (cr);
+
+ if (self->destroy)
+ {
+ self->destroy (self->data);
+ self->destroy = NULL;
+ self->data = NULL;
+ }
+
+ g_clear_object (&self->context);
+ self->id = 0;
+}
+
+/**
+ * gdk_gl_texture_new:
+ * @context: a #GdkGLContext
+ * @id: the ID of a texture that was created with @context
+ * @width: the nominal width of the texture
+ * @height: the nominal height of the texture
+ * @destroy: a destroy notify that will be called when the GL resources
+ * are released
+ * @data: data that gets passed to @destroy
+ *
+ * Creates a new texture for an existing GL texture.
+ *
+ * Note that the GL texture must not be modified until @destroy is called,
+ * which will happen when the GdkTexture object is finalized, or due to
+ * an explicit call of gdk_texture_release_gl().
+ *
+ * Return value: A newly-created #GdkTexture
+ **/
+GdkTexture *
+gdk_gl_texture_new (GdkGLContext *context,
+ guint id,
+ int width,
+ int height,
+ GDestroyNotify destroy,
+ gpointer data)
+{
+ GdkGLTexture *self;
+
+ g_return_val_if_fail (GDK_IS_GL_CONTEXT (context), NULL);
+ g_return_val_if_fail (id != 0, NULL);
+ g_return_val_if_fail (width > 0, NULL);
+ g_return_val_if_fail (height > 0, NULL);
+
+ self = g_object_new (GDK_TYPE_GL_TEXTURE,
+ "width", width,
+ "height", height,
+ NULL);
+
+ self->context = g_object_ref (context);
+ self->id = id;
+ self->destroy = destroy;
+ self->data = data;
+
+ return GDK_TEXTURE (self);
+}
+
diff --git a/gdk/gdkgltexture.h b/gdk/gdkgltexture.h
new file mode 100644
index 0000000000..e5d24bd605
--- /dev/null
+++ b/gdk/gdkgltexture.h
@@ -0,0 +1,46 @@
+/* gdktexture.h
+ *
+ * Copyright 2016 Benjamin Otte
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __GDK_GL_TEXTURE_H__
+#define __GDK_GL_TEXTURE_H__
+
+#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
+#error "Only <gdk/gdk.h> can be included directly."
+#endif
+
+#include <gdk/gdktypes.h>
+#include <gdk/gdkglcontext.h>
+
+G_BEGIN_DECLS
+
+
+GDK_AVAILABLE_IN_ALL
+GdkTexture * gdk_gl_texture_new (GdkGLContext *context,
+ guint id,
+ int width,
+ int height,
+ GDestroyNotify destroy,
+ gpointer data);
+
+GDK_AVAILABLE_IN_ALL
+void gdk_gl_texture_release (GdkTexture *texture);
+
+
+G_END_DECLS
+
+#endif /* __GDK_GL_TEXTURE_H__ */
diff --git a/gdk/gdkgltextureprivate.h b/gdk/gdkgltextureprivate.h
new file mode 100644
index 0000000000..180a99d064
--- /dev/null
+++ b/gdk/gdkgltextureprivate.h
@@ -0,0 +1,19 @@
+#ifndef __GDK_GL_TEXTURE_PRIVATE_H__
+#define __GDK_GL_TEXTURE_PRIVATE_H__
+
+#include "gdkgltexture.h"
+
+#include "gdktextureprivate.h"
+
+G_BEGIN_DECLS
+
+#define GDK_TYPE_GL_TEXTURE (gdk_gl_texture_get_type ())
+
+G_DECLARE_FINAL_TYPE (GdkGLTexture, gdk_gl_texture, GDK, GL_TEXTURE, GdkTexture)
+
+GdkGLContext * gdk_gl_texture_get_context (GdkGLTexture *self);
+guint gdk_gl_texture_get_id (GdkGLTexture *self);
+
+G_END_DECLS
+
+#endif /* __GDK_GL_TEXTURE_PRIVATE_H__ */
diff --git a/gdk/gdktexture.c b/gdk/gdktexture.c
index dd3d0d7b60..8cfd0abc60 100644
--- a/gdk/gdktexture.c
+++ b/gdk/gdktexture.c
@@ -36,10 +36,8 @@
#include "gdktextureprivate.h"
-#include "gdkinternals.h"
#include "gdkcairo.h"
-
-#include <epoxy/gl.h>
+#include "gdkinternals.h"
/**
* SECTION:gdktexture
@@ -429,159 +427,6 @@ gdk_pixbuf_texture_init (GdkPixbufTexture *self)
{
}
-/* GdkGLTexture */
-
-
-struct _GdkGLTexture {
- GdkTexture parent_instance;
-
- GdkGLContext *context;
- guint id;
-
- cairo_surface_t *saved;
-
- GDestroyNotify destroy;
- gpointer data;
-};
-
-struct _GdkGLTextureClass {
- GdkTextureClass parent_class;
-};
-
-G_DEFINE_TYPE (GdkGLTexture, gdk_gl_texture, GDK_TYPE_TEXTURE)
-
-static void
-gdk_gl_texture_dispose (GObject *object)
-{
- GdkGLTexture *self = GDK_GL_TEXTURE (object);
-
- if (self->destroy)
- {
- self->destroy (self->data);
- self->destroy = NULL;
- self->data = NULL;
- }
-
- g_clear_object (&self->context);
- self->id = 0;
-
- if (self->saved)
- {
- cairo_surface_destroy (self->saved);
- self->saved = NULL;
- }
-
- G_OBJECT_CLASS (gdk_gl_texture_parent_class)->dispose (object);
-}
-
-static void
-gdk_gl_texture_download (GdkTexture *texture,
- guchar *data,
- gsize stride)
-{
- GdkGLTexture *self = GDK_GL_TEXTURE (texture);
- cairo_surface_t *surface;
- cairo_t *cr;
-
- surface = cairo_image_surface_create_for_data (data,
- CAIRO_FORMAT_ARGB32,
- texture->width, texture->height,
- stride);
-
- cr = cairo_create (surface);
-
- if (self->saved)
- {
- cairo_set_source_surface (cr, self->saved, 0, 0);
- cairo_paint (cr);
- }
- else
- {
- GdkWindow *window;
-
- window = gdk_gl_context_get_window (self->context);
- gdk_cairo_draw_from_gl (cr, window, self->id, GL_TEXTURE, 1, 0, 0,
- texture->width, texture->height);
- }
-
- cairo_destroy (cr);
- cairo_surface_finish (surface);
- cairo_surface_destroy (surface);
-}
-
-static void
-gdk_gl_texture_class_init (GdkGLTextureClass *klass)
-{
- GdkTextureClass *texture_class = GDK_TEXTURE_CLASS (klass);
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- texture_class->download = gdk_gl_texture_download;
- gobject_class->dispose = gdk_gl_texture_dispose;
-}
-
-static void
-gdk_gl_texture_init (GdkGLTexture *self)
-{
-}
-
-GdkGLContext *
-gdk_gl_texture_get_context (GdkGLTexture *self)
-{
- return self->context;
-}
-
-guint
-gdk_gl_texture_get_id (GdkGLTexture *self)
-{
- return self->id;
-}
-
-/**
- * gdk_texture_release_gl:
- * @texture: a #GdkTexture wrapping a GL texture
- *
- * Releases the GL resources held by a #GdkTexture that
- * was created with gdk_texture_new_for_gl().
- *
- * The texture contents are still available via the
- * gdk_texture_download() function, after this function
- * has been called.
- */
-void
-gdk_texture_release_gl (GdkTexture *texture)
-{
- GdkGLTexture *self;
- GdkWindow *window;
- cairo_t *cr;
-
- g_return_if_fail (GDK_IS_GL_TEXTURE (texture));
-
- self = GDK_GL_TEXTURE (texture);
-
- g_return_if_fail (self->saved == NULL);
-
- self->saved = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
- texture->width, texture->height);
-
- cr = cairo_create (self->saved);
-
- window = gdk_gl_context_get_window (self->context);
- gdk_cairo_draw_from_gl (cr, window, self->id, GL_TEXTURE, 1, 0, 0,
- texture->width, texture->height);
-
- cairo_destroy (cr);
-
- if (self->destroy)
- {
- self->destroy (self->data);
- self->destroy = NULL;
- self->data = NULL;
- }
-
- g_clear_object (&self->context);
- self->id = 0;
-}
-
/**
* gdk_texture_new_for_pixbuf:
* @pixbuf: a #GdkPixbuf
@@ -676,52 +521,6 @@ gdk_texture_new_from_file (GFile *file,
return texture;
}
-/**
- * gdk_texture_new_for_gl:
- * @context: a #GdkGLContext
- * @id: the ID of a texture that was created with @context
- * @width: the nominal width of the texture
- * @height: the nominal height of the texture
- * @destroy: a destroy notify that will be called when the GL resources
- * are released
- * @data: data that gets passed to @destroy
- *
- * Creates a new texture for an existing GL texture.
- *
- * Note that the GL texture must not be modified until @destroy is called,
- * which will happen when the GdkTexture object is finalized, or due to
- * an explicit call of gdk_texture_release_gl().
- *
- * Return value: A newly-created #GdkTexture
- **/
-GdkTexture *
-gdk_texture_new_for_gl (GdkGLContext *context,
- guint id,
- int width,
- int height,
- GDestroyNotify destroy,
- gpointer data)
-{
- GdkGLTexture *self;
-
- g_return_val_if_fail (GDK_IS_GL_CONTEXT (context), NULL);
- g_return_val_if_fail (id != 0, NULL);
- g_return_val_if_fail (width > 0, NULL);
- g_return_val_if_fail (height > 0, NULL);
-
- self = g_object_new (GDK_TYPE_GL_TEXTURE,
- "width", width,
- "height", height,
- NULL);
-
- self->context = g_object_ref (context);
- self->id = id;
- self->destroy = destroy;
- self->data = data;
-
- return GDK_TEXTURE (self);
-}
-
/**
* gdk_texture_get_width:
* @texture: a #GdkTexture
diff --git a/gdk/gdktexture.h b/gdk/gdktexture.h
index ea04fc17cb..43bd9663e3 100644
--- a/gdk/gdktexture.h
+++ b/gdk/gdktexture.h
@@ -26,7 +26,6 @@
#include <gdk/gdkversionmacros.h>
#include <gdk/gdktypes.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
-#include <gdk/gdkglcontext.h>
G_BEGIN_DECLS
@@ -56,17 +55,6 @@ GDK_AVAILABLE_IN_ALL
GdkTexture * gdk_texture_new_from_file (GFile *file,
GError **error);
-GDK_AVAILABLE_IN_ALL
-GdkTexture * gdk_texture_new_for_gl (GdkGLContext *context,
- guint id,
- int width,
- int height,
- GDestroyNotify destroy,
- gpointer data);
-
-GDK_AVAILABLE_IN_ALL
-void gdk_texture_release_gl (GdkTexture *texture);
-
GDK_AVAILABLE_IN_ALL
int gdk_texture_get_width (GdkTexture *texture);
GDK_AVAILABLE_IN_ALL
diff --git a/gdk/gdktextureprivate.h b/gdk/gdktextureprivate.h
index c6cab7801d..f9e5fbe908 100644
--- a/gdk/gdktextureprivate.h
+++ b/gdk/gdktextureprivate.h
@@ -44,13 +44,6 @@ void gdk_texture_clear_render_data (GdkTexture
gpointer gdk_texture_get_render_data (GdkTexture *self,
gpointer key);
-#define GDK_TYPE_GL_TEXTURE (gdk_gl_texture_get_type ())
-
-G_DECLARE_FINAL_TYPE (GdkGLTexture, gdk_gl_texture, GDK, GL_TEXTURE, GdkTexture)
-
-GdkGLContext * gdk_gl_texture_get_context (GdkGLTexture *self);
-guint gdk_gl_texture_get_id (GdkGLTexture *self);
-
G_END_DECLS
#endif /* __GDK_TEXTURE_PRIVATE_H__ */
diff --git a/gdk/meson.build b/gdk/meson.build
index 466e11ff41..760cad8b64 100644
--- a/gdk/meson.build
+++ b/gdk/meson.build
@@ -24,6 +24,7 @@ gdk_public_sources = files([
'gdkgl.c',
'gdkglcontext.c',
'gdkglobals.c',
+ 'gdkgltexture.c',
'gdkkeys.c',
'gdkkeyuni.c',
'gdkmonitor.c',
@@ -66,6 +67,7 @@ gdk_public_headers = files([
'gdkframeclock.h',
'gdkframetimings.h',
'gdkglcontext.h',
+ 'gdkgltexture.h',
'gdkkeys.h',
'gdkkeysyms.h',
'gdkmonitor.h',
diff --git a/gsk/gl/gskgldriver.c b/gsk/gl/gskgldriver.c
index 6d1c417b77..a7a62a49e1 100644
--- a/gsk/gl/gskgldriver.c
+++ b/gsk/gl/gskgldriver.c
@@ -5,6 +5,7 @@
#include "gskdebugprivate.h"
#include "gskprofilerprivate.h"
#include "gdk/gdktextureprivate.h"
+#include "gdk/gdkgltextureprivate.h"
#include <gdk/gdk.h>
#include <epoxy/gl.h>
diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c
index c805fe7c76..ca8fe4a30e 100644
--- a/gsk/gl/gskglrenderer.c
+++ b/gsk/gl/gskglrenderer.c
@@ -11,12 +11,13 @@
#include "gskrendernodeprivate.h"
#include "gskshaderbuilderprivate.h"
#include "gskglglyphcacheprivate.h"
-#include "gdk/gdktextureprivate.h"
#include "gskglrenderopsprivate.h"
#include "gskcairoblurprivate.h"
#include "gskprivate.h"
+#include "gdk/gdkgltextureprivate.h"
+
#include <epoxy/gl.h>
#include <cairo-ft.h>
@@ -2573,10 +2574,10 @@ gsk_gl_renderer_render_texture (GskRenderer *renderer,
/* Render the actual scene */
gsk_gl_renderer_do_render (renderer, root, viewport, texture_id, 1);
- texture = gdk_texture_new_for_gl (self->gl_context,
- texture_id,
- width, height,
- NULL, NULL);
+ texture = gdk_gl_texture_new (self->gl_context,
+ texture_id,
+ width, height,
+ NULL, NULL);
gsk_gl_renderer_clear_tree (self);
return texture;
diff --git a/gtk/gtkglarea.c b/gtk/gtkglarea.c
index d7ad09c2d0..e44c68ef66 100644
--- a/gtk/gtkglarea.c
+++ b/gtk/gtkglarea.c
@@ -386,7 +386,7 @@ delete_one_texture (gpointer data)
Texture *texture = data;
if (texture->holder)
- gdk_texture_release_gl (texture->holder);
+ gdk_gl_texture_release (texture->holder);
if (texture->id != 0)
{
@@ -735,11 +735,11 @@ gtk_gl_area_snapshot (GtkWidget *widget,
priv->texture = NULL;
priv->textures = g_list_prepend (priv->textures, texture);
- texture->holder = gdk_texture_new_for_gl (priv->context,
- texture->id,
- texture->width,
- texture->height,
- release_texture, texture);
+ texture->holder = gdk_gl_texture_new (priv->context,
+ texture->id,
+ texture->width,
+ texture->height,
+ release_texture, texture);
gtk_snapshot_append_texture (snapshot,
texture->holder,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]