[gtk/wip/otte/memoryformat] texture: Make format a property of GdkTexture
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/otte/memoryformat] texture: Make format a property of GdkTexture
- Date: Thu, 7 Oct 2021 00:44:11 +0000 (UTC)
commit 8950c0dc960da50e7e38bcb5984b74286a9f178c
Author: Benjamin Otte <otte redhat com>
Date: Thu Oct 7 02:41:30 2021 +0200
texture: Make format a property of GdkTexture
For MemoryTexture, this is a simple change.
For GLTexture, we need to query the format at texture creation. This
sounds like a bad idea and extra work until one realizes that we'd
need to do that anyway when using the texure the first time - either
when downloading, or when trying to use it in a rendernode, where we
will soon need that information to determine if the texture prefers high
depth.
gdk/gdkgltexture.c | 133 +++++++++++++++++++++---------------------
gdk/gdkmemorytexture.c | 14 +----
gdk/gdkmemorytextureprivate.h | 1 -
gdk/gdktexture.c | 7 ++-
gdk/gdktextureprivate.h | 4 ++
gdk/loaders/gdkpng.c | 2 +-
gdk/loaders/gdktiff.c | 2 +-
gsk/ngl/gsknglcommandqueue.c | 2 +-
8 files changed, 83 insertions(+), 82 deletions(-)
---
diff --git a/gdk/gdkgltexture.c b/gdk/gdkgltexture.c
index 1a321fa879..e39fcd3fbb 100644
--- a/gdk/gdkgltexture.c
+++ b/gdk/gdkgltexture.c
@@ -140,82 +140,29 @@ gdk_gl_texture_get_tex_image (GdkGLTexture *self,
data);
}
}
+
static void
gdk_gl_texture_do_download_texture (gpointer texture_,
gpointer result_)
{
GdkTexture *texture = texture_;
GdkTexture **result = result_;
- GdkMemoryFormat format;
- GLint internal_format, gl_format, gl_type;
+ guint gl_internalformat, gl_format, gl_type;
guchar *data;
gsize stride;
GBytes *bytes;
- glGetTexLevelParameteriv (GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT, &internal_format);
-
- switch (internal_format)
- {
- case GL_RGB8:
- format = GDK_MEMORY_R8G8B8;
- gl_format = GL_RGB;
- gl_type = GL_UNSIGNED_BYTE;
- break;
-
- case GL_RGBA8:
- format = GDK_MEMORY_R8G8B8A8_PREMULTIPLIED;
- gl_format = GL_RGBA;
- gl_type = GL_UNSIGNED_BYTE;
- break;
-
- case GL_RGB16:
- format = GDK_MEMORY_R16G16B16;
- gl_format = GL_RGB;
- gl_type = GL_UNSIGNED_SHORT;
- break;
-
- case GL_RGBA16:
- format = GDK_MEMORY_R16G16B16A16_PREMULTIPLIED;
- gl_format = GL_RGBA;
- gl_type = GL_UNSIGNED_SHORT;
- break;
-
- case GL_RGB16F:
- format = GDK_MEMORY_R16G16B16_FLOAT;
- gl_format = GL_RGB;
- gl_type = GL_HALF_FLOAT;
- break;
-
- case GL_RGBA16F:
- format = GDK_MEMORY_R16G16B16A16_FLOAT_PREMULTIPLIED;
- gl_format = GL_RGBA;
- gl_type = GL_HALF_FLOAT;
- break;
-
- case GL_RGB32F:
- format = GDK_MEMORY_R32G32B32_FLOAT;
- gl_format = GL_RGB;
- gl_type = GL_FLOAT;
- break;
-
- case GL_RGBA32F:
- format = GDK_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED;
- gl_format = GL_RGBA;
- gl_type = GL_FLOAT;
- break;
-
- default:
- g_warning ("Texture in unexpected format 0x%X (%d). File a bug about adding it to GTK",
internal_format, internal_format);
- /* fallback to the dumbest possible format
- * so that even age old GLES can do it */
- format = GDK_MEMORY_R8G8B8A8_PREMULTIPLIED;
- gl_format = GL_RGBA;
- gl_type = GL_UNSIGNED_BYTE;
- break;
- }
+ if (!gdk_memory_format_gl_format (texture->format,
+ gdk_gl_context_get_use_es (gdk_gl_context_get_current ()),
+ &gl_internalformat,
+ &gl_format,
+ &gl_type))
+ {
+ g_assert_not_reached ();
+ }
- stride = gdk_memory_format_bytes_per_pixel (format) * texture->width;
- data = g_malloc (stride * texture->height);
+ stride = gdk_memory_format_bytes_per_pixel (texture->format) * texture->width;
+ data = g_malloc_n (stride, texture->height);
gdk_gl_texture_get_tex_image (texture_,
gl_format,
@@ -225,7 +172,7 @@ gdk_gl_texture_do_download_texture (gpointer texture_,
bytes = g_bytes_new_take (data, stride * texture->height);
*result = gdk_memory_texture_new (texture->width,
texture->height,
- format,
+ texture->format,
bytes,
stride);
@@ -378,6 +325,58 @@ gdk_gl_texture_release (GdkGLTexture *self)
self->id = 0;
}
+static void
+gdk_gl_texture_do_determine_format (gpointer texture_,
+ gpointer unused)
+{
+ GdkTexture *texture = texture_;
+ GLint internal_format;
+
+ glGetTexLevelParameteriv (GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT, &internal_format);
+
+ switch (internal_format)
+ {
+ case GL_RGB8:
+ texture->format = GDK_MEMORY_R8G8B8;
+ break;
+
+ case GL_RGBA8:
+ texture->format = GDK_MEMORY_R8G8B8A8_PREMULTIPLIED;
+ break;
+
+ case GL_RGB16:
+ texture->format = GDK_MEMORY_R16G16B16;
+ break;
+
+ case GL_RGBA16:
+ texture->format = GDK_MEMORY_R16G16B16A16_PREMULTIPLIED;
+ break;
+
+ case GL_RGB16F:
+ texture->format = GDK_MEMORY_R16G16B16_FLOAT;
+ break;
+
+ case GL_RGBA16F:
+ texture->format = GDK_MEMORY_R16G16B16A16_FLOAT_PREMULTIPLIED;
+ break;
+
+ case GL_RGB32F:
+ texture->format = GDK_MEMORY_R32G32B32_FLOAT;
+ break;
+
+ case GL_RGBA32F:
+ texture->format = GDK_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED;
+ break;
+
+ default:
+ g_warning ("Texture in unexpected format 0x%X (%d). File a bug about adding it to GTK",
internal_format, internal_format);
+ /* fallback to the dumbest possible format
+ * so that even age old GLES can do it */
+ texture->format = GDK_MEMORY_R8G8B8A8_PREMULTIPLIED;
+ break;
+ }
+}
+
/**
* gdk_gl_texture_new:
* @context: a `GdkGLContext`
@@ -421,6 +420,8 @@ gdk_gl_texture_new (GdkGLContext *context,
self->destroy = destroy;
self->data = data;
+ gdk_gl_texture_run (self, gdk_gl_texture_do_determine_format, NULL);
+
return GDK_TEXTURE (self);
}
diff --git a/gdk/gdkmemorytexture.c b/gdk/gdkmemorytexture.c
index 33ba90fe5c..52723ef805 100644
--- a/gdk/gdkmemorytexture.c
+++ b/gdk/gdkmemorytexture.c
@@ -34,8 +34,6 @@ struct _GdkMemoryTexture
{
GdkTexture parent_instance;
- GdkMemoryFormat format;
-
GBytes *bytes;
gsize stride;
};
@@ -74,7 +72,7 @@ gdk_memory_texture_download (GdkTexture *texture,
GDK_MEMORY_DEFAULT,
(guchar *) g_bytes_get_data (self->bytes, NULL),
self->stride,
- self->format,
+ texture->format,
gdk_texture_get_width (texture),
gdk_texture_get_height (texture));
}
@@ -91,7 +89,7 @@ gdk_memory_texture_download_float (GdkTexture *texture,
GDK_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED,
(guchar *) g_bytes_get_data (self->bytes, NULL),
self->stride,
- self->format,
+ texture->format,
gdk_texture_get_width (texture),
gdk_texture_get_height (texture));
}
@@ -184,19 +182,13 @@ gdk_memory_texture_new (int width,
"height", height,
NULL);
- self->format = format;
+ GDK_TEXTURE (self)->format = format;
self->bytes = bytes;
self->stride = stride;
return GDK_TEXTURE (self);
}
-GdkMemoryFormat
-gdk_memory_texture_get_format (GdkMemoryTexture *self)
-{
- return self->format;
-}
-
const guchar *
gdk_memory_texture_get_data (GdkMemoryTexture *self)
{
diff --git a/gdk/gdkmemorytextureprivate.h b/gdk/gdkmemorytextureprivate.h
index f61cccb9ef..0cd5e91f27 100644
--- a/gdk/gdkmemorytextureprivate.h
+++ b/gdk/gdkmemorytextureprivate.h
@@ -29,7 +29,6 @@ G_BEGIN_DECLS
#define GDK_MEMORY_GDK_PIXBUF_OPAQUE GDK_MEMORY_R8G8B8
#define GDK_MEMORY_GDK_PIXBUF_ALPHA GDK_MEMORY_R8G8B8A8
-GdkMemoryFormat gdk_memory_texture_get_format (GdkMemoryTexture *self);
const guchar * gdk_memory_texture_get_data (GdkMemoryTexture *self);
gsize gdk_memory_texture_get_stride (GdkMemoryTexture *self);
diff --git a/gdk/gdktexture.c b/gdk/gdktexture.c
index b79b671a53..f4c5928c8d 100644
--- a/gdk/gdktexture.c
+++ b/gdk/gdktexture.c
@@ -808,6 +808,12 @@ gdk_texture_download_texture (GdkTexture *texture)
return texture;
}
+GdkMemoryFormat
+gdk_texture_get_format (GdkTexture *self)
+{
+ return self->format;
+}
+
gboolean
gdk_texture_set_render_data (GdkTexture *self,
gpointer key,
@@ -972,4 +978,3 @@ gdk_texture_save_to_tiff_bytes (GdkTexture *texture)
return gdk_save_tiff (texture);
}
-
diff --git a/gdk/gdktextureprivate.h b/gdk/gdktextureprivate.h
index 814ed5d92c..994c9901f8 100644
--- a/gdk/gdktextureprivate.h
+++ b/gdk/gdktextureprivate.h
@@ -3,6 +3,8 @@
#include "gdktexture.h"
+#include "gdkmemorytexture.h"
+
G_BEGIN_DECLS
#define GDK_TEXTURE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_TEXTURE,
GdkTextureClass))
@@ -13,6 +15,7 @@ struct _GdkTexture
{
GObject parent_instance;
+ GdkMemoryFormat format;
int width;
int height;
@@ -42,6 +45,7 @@ cairo_surface_t * gdk_texture_download_surface (GdkTexture
/* NB: GdkMemoryTexture */
GdkTexture * gdk_texture_download_texture (GdkTexture *texture);
+GdkMemoryFormat gdk_texture_get_format (GdkTexture *self);
gboolean gdk_texture_set_render_data (GdkTexture *self,
gpointer key,
gpointer data,
diff --git a/gdk/loaders/gdkpng.c b/gdk/loaders/gdkpng.c
index df453fc6a3..9bdc5e3a43 100644
--- a/gdk/loaders/gdkpng.c
+++ b/gdk/loaders/gdkpng.c
@@ -481,7 +481,7 @@ gdk_save_png (GdkTexture *texture)
height = gdk_texture_get_height (texture);
mtexture = gdk_texture_download_texture (texture);
- format = gdk_memory_texture_get_format (GDK_MEMORY_TEXTURE (mtexture));
+ format = gdk_texture_get_format (mtexture);
switch (format)
{
diff --git a/gdk/loaders/gdktiff.c b/gdk/loaders/gdktiff.c
index ed1b0e566b..d2d8dfdbde 100644
--- a/gdk/loaders/gdktiff.c
+++ b/gdk/loaders/gdktiff.c
@@ -284,7 +284,7 @@ gdk_save_tiff (GdkTexture *texture)
height = gdk_texture_get_height (texture);
memory_texture = gdk_texture_download_texture (texture);
- format = gdk_memory_texture_get_format (GDK_MEMORY_TEXTURE (memory_texture));
+ format = gdk_texture_get_format (memory_texture);
for (int i = 0; i < G_N_ELEMENTS (format_data); i++)
{
diff --git a/gsk/ngl/gsknglcommandqueue.c b/gsk/ngl/gsknglcommandqueue.c
index b2a474cf59..29cbb551d0 100644
--- a/gsk/ngl/gsknglcommandqueue.c
+++ b/gsk/ngl/gsknglcommandqueue.c
@@ -1362,7 +1362,7 @@ gsk_ngl_command_queue_upload_texture (GskNglCommandQueue *self,
{
GdkMemoryTexture *memory_texture = GDK_MEMORY_TEXTURE (texture);
data = gdk_memory_texture_get_data (memory_texture);
- data_format = gdk_memory_texture_get_format (memory_texture);
+ data_format = gdk_texture_get_format (texture);
data_stride = gdk_memory_texture_get_stride (memory_texture);
}
else
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]