[gtk/wip/chergert/glproto: 192/526] stub out some texture api in driver
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/chergert/glproto: 192/526] stub out some texture api in driver
- Date: Tue, 16 Feb 2021 01:14:29 +0000 (UTC)
commit 5d1bb9d1ed3689246f52200fc5e2ee1c12eae99e
Author: Christian Hergert <chergert redhat com>
Date: Mon Jan 4 14:50:41 2021 -0800
stub out some texture api in driver
gsk/next/gskgldriver.c | 101 ++++++++++++++++++++++++++++++++++++++++++
gsk/next/gskgldriverprivate.h | 50 ++++++++++++++-------
2 files changed, 136 insertions(+), 15 deletions(-)
---
diff --git a/gsk/next/gskgldriver.c b/gsk/next/gskgldriver.c
index aff92d06c9..d564c6bd5d 100644
--- a/gsk/next/gskgldriver.c
+++ b/gsk/next/gskgldriver.c
@@ -36,6 +36,55 @@
G_DEFINE_TYPE (GskNextDriver, gsk_next_driver, G_TYPE_OBJECT)
+typedef struct _GskGLTexture
+{
+ GLuint texture_id;
+ int width;
+ int height;
+ GLuint min_filter;
+ GLuint mag_filter;
+ GdkTexture *user;
+ guint64 last_used_in_frame;
+ guint permanent : 1;
+} GskGLTexture;
+
+static guint
+texture_key_hash (gconstpointer v)
+{
+ const GskTextureKey *k = (const GskTextureKey *)v;
+
+ return GPOINTER_TO_UINT (k->pointer)
+ + (guint)(k->scale_x * 100)
+ + (guint)(k->scale_y * 100)
+ + (guint)k->filter * 2 +
+ + (guint)k->pointer_is_child;
+}
+
+static gboolean
+texture_key_equal (gconstpointer v1, gconstpointer v2)
+{
+ const GskTextureKey *k1 = (const GskTextureKey *)v1;
+ const GskTextureKey *k2 = (const GskTextureKey *)v2;
+
+ return k1->pointer == k2->pointer &&
+ k1->scale_x == k2->scale_x &&
+ k1->scale_y == k2->scale_y &&
+ k1->filter == k2->filter &&
+ k1->pointer_is_child == k2->pointer_is_child &&
+ (!k1->pointer_is_child || graphene_rect_equal (&k1->parent_rect, &k2->parent_rect));
+}
+
+static void
+gsk_gl_texture_free (gpointer data)
+{
+ GskGLTexture *texture = data;
+
+ if (texture != NULL)
+ {
+ g_slice_free (GskGLTexture, texture);
+ }
+}
+
static void
gsk_next_driver_dispose (GObject *object)
{
@@ -57,6 +106,8 @@ gsk_next_driver_dispose (GObject *object)
g_clear_object (&self->command_queue);
g_clear_pointer (&self->autorelease_framebuffers, g_array_unref);
g_clear_pointer (&self->autorelease_textures, g_array_unref);
+ g_clear_pointer (&self->textures_by_key, g_hash_table_unref);
+ g_clear_pointer (&self->textures, g_hash_table_unref);
G_OBJECT_CLASS (gsk_next_driver_parent_class)->dispose (object);
}
@@ -74,6 +125,11 @@ gsk_next_driver_init (GskNextDriver *self)
{
self->autorelease_framebuffers = g_array_new (FALSE, FALSE, sizeof (guint));
self->autorelease_textures = g_array_new (FALSE, FALSE, sizeof (guint));
+ self->textures = g_hash_table_new_full (NULL, NULL, NULL, gsk_gl_texture_free);
+ self->textures_by_key = g_hash_table_new_full (texture_key_hash,
+ texture_key_equal,
+ g_free,
+ NULL);
}
static gboolean
@@ -182,6 +238,7 @@ gsk_next_driver_begin_frame (GskNextDriver *self)
g_return_if_fail (self->in_frame == FALSE);
self->in_frame = TRUE;
+ self->current_frame_id++;
gsk_gl_command_queue_make_current (self->command_queue);
gsk_gl_command_queue_begin_frame (self->command_queue);
@@ -265,3 +322,47 @@ gsk_next_driver_autorelease_framebuffer (GskNextDriver *self,
g_array_append_val (self->autorelease_framebuffers, framebuffer_id);
}
+
+gboolean
+gsk_next_driver_lookup_texture (GskNextDriver *self,
+ const GskTextureKey *key,
+ guint *texture_id)
+{
+ gpointer id;
+
+ g_return_val_if_fail (GSK_IS_NEXT_DRIVER (self), FALSE);
+ g_return_val_if_fail (key != NULL, FALSE);
+
+ if (g_hash_table_lookup_extended (self->textures_by_key, key, NULL, &id))
+ {
+ GskGLTexture *texture;
+
+ g_assert (id != NULL);
+
+ if (texture_id != NULL)
+ *texture_id = GPOINTER_TO_UINT (id);
+
+ texture = g_hash_table_lookup (self->textures, id);
+
+ if (texture != NULL)
+ texture->last_used_in_frame = self->current_frame_id;
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void
+gsk_next_driver_insert_texture (GskNextDriver *self,
+ const GskTextureKey *key,
+ guint texture_id)
+{
+ g_return_if_fail (GSK_IS_NEXT_DRIVER (self));
+ g_return_if_fail (key != NULL);
+ g_return_if_fail (texture_id > 0);
+
+ g_hash_table_insert (self->textures_by_key,
+ g_memdup (key, sizeof *key),
+ GUINT_TO_POINTER (texture_id));
+}
diff --git a/gsk/next/gskgldriverprivate.h b/gsk/next/gskgldriverprivate.h
index e63bc607ae..beee357df1 100644
--- a/gsk/next/gskgldriverprivate.h
+++ b/gsk/next/gskgldriverprivate.h
@@ -36,6 +36,15 @@ enum {
UNIFORM_SHARED_LAST
};
+typedef struct {
+ gpointer pointer;
+ float scale_x;
+ float scale_y;
+ int filter;
+ int pointer_is_child;
+ graphene_rect_t parent_rect; /* Valid when pointer_is_child */
+} GskTextureKey;
+
#define GSL_GK_NO_UNIFORMS UNIFORM_INVALID_##__COUNTER__
#define GSK_GL_ADD_UNIFORM(pos, KEY, name) UNIFORM_##KEY = UNIFORM_SHARED_LAST + pos,
#define GSK_GL_DEFINE_PROGRAM(name, resource, uniforms) enum { uniforms };
@@ -58,6 +67,9 @@ struct _GskNextDriver
GskGLIconLibrary *icons;
GskGLShadowLibrary *shadows;
+ GHashTable *textures;
+ GHashTable *textures_by_key;
+
GArray *autorelease_framebuffers;
GArray *autorelease_textures;
@@ -69,25 +81,33 @@ struct _GskNextDriver
#undef GSK_GL_ADD_UNIFORM
#undef GSK_GL_DEFINE_PROGRAM
+ guint64 current_frame_id;
+
guint debug : 1;
guint in_frame : 1;
};
-GskNextDriver *gsk_next_driver_new (GskGLCommandQueue *command_queue,
- gboolean debug,
- GError **error);
-GdkGLContext *gsk_next_driver_get_context (GskNextDriver *self);
-gboolean gsk_next_driver_create_render_target (GskNextDriver *self,
- int width,
- int height,
- guint *out_fbo_id,
- guint *out_texture_id);
-void gsk_next_driver_begin_frame (GskNextDriver *self);
-void gsk_next_driver_end_frame (GskNextDriver *self);
-void gsk_next_driver_autorelease_framebuffer (GskNextDriver *self,
- guint framebuffer_id);
-void gsk_next_driver_autorelease_texture (GskNextDriver *self,
- guint texture_id);
+GskNextDriver *gsk_next_driver_new (GskGLCommandQueue *command_queue,
+ gboolean debug,
+ GError **error);
+GdkGLContext *gsk_next_driver_get_context (GskNextDriver *self);
+gboolean gsk_next_driver_create_render_target (GskNextDriver *self,
+ int width,
+ int height,
+ guint *out_fbo_id,
+ guint *out_texture_id);
+void gsk_next_driver_begin_frame (GskNextDriver *self);
+void gsk_next_driver_end_frame (GskNextDriver *self);
+void gsk_next_driver_autorelease_framebuffer (GskNextDriver *self,
+ guint framebuffer_id);
+void gsk_next_driver_autorelease_texture (GskNextDriver *self,
+ guint texture_id);
+gboolean gsk_next_driver_lookup_texture (GskNextDriver *self,
+ const GskTextureKey *key,
+ guint *texture_id);
+void gsk_next_driver_insert_texture (GskNextDriver *self,
+ const GskTextureKey *key,
+ guint texture_id);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]