From 40e5a3779517ece7b51e88cd76d10b038d1738d0 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 20 Jan 2024 22:41:36 -0500 Subject: [PATCH] gpu: Make GskGpuDescriptors non-objects This is a bit involved, since we have to deal with subclassing here, but in the end it works out ok. And it make g_object_ref and g_object_unref disappear from the profiles. --- gsk/gpu/gskgldescriptors.c | 46 +++----- gsk/gpu/gskgldescriptorsprivate.h | 12 +- gsk/gpu/gskgpudescriptors.c | 128 +++++++++------------- gsk/gpu/gskgpudescriptorsprivate.h | 64 ++++++++--- gsk/gpu/gskgpunodeprocessor.c | 8 +- gsk/gpu/gskgpushaderop.c | 4 +- gsk/gpu/gskvulkandescriptors.c | 34 +++--- gsk/gpu/gskvulkandescriptorsprivate.h | 16 +-- gsk/gpu/gskvulkanframe.c | 10 +- gsk/gpu/gskvulkanrealdescriptors.c | 66 +++++------ gsk/gpu/gskvulkanrealdescriptorsprivate.h | 54 ++++++++- gsk/gpu/gskvulkansubdescriptors.c | 67 ++++++----- gsk/gpu/gskvulkansubdescriptorsprivate.h | 11 +- 13 files changed, 291 insertions(+), 229 deletions(-) diff --git a/gsk/gpu/gskgldescriptors.c b/gsk/gpu/gskgldescriptors.c index c061a61e61..77a9bc2604 100644 --- a/gsk/gpu/gskgldescriptors.c +++ b/gsk/gpu/gskgldescriptors.c @@ -5,24 +5,14 @@ #include "gskglbufferprivate.h" #include "gskglimageprivate.h" -struct _GskGLDescriptors -{ - GskGpuDescriptors parent_instance; - - GskGLDevice *device; - guint n_external; -}; - -G_DEFINE_TYPE (GskGLDescriptors, gsk_gl_descriptors, GSK_TYPE_GPU_DESCRIPTORS) - static void -gsk_gl_descriptors_finalize (GObject *object) +gsk_gl_descriptors_finalize (GskGpuDescriptors *desc) { - GskGLDescriptors *self = GSK_GL_DESCRIPTORS (object); + GskGLDescriptors *self = GSK_GL_DESCRIPTORS (desc); g_object_unref (self->device); - G_OBJECT_CLASS (gsk_gl_descriptors_parent_class)->finalize (object); + gsk_gpu_descriptors_finalize (&self->parent_instance); } static gboolean @@ -72,29 +62,25 @@ gsk_gl_descriptors_add_buffer (GskGpuDescriptors *desc, return TRUE; } -static void -gsk_gl_descriptors_class_init (GskGLDescriptorsClass *klass) +static GskGpuDescriptorsClass GSK_GL_DESCRIPTORS_CLASS = { - GskGpuDescriptorsClass *descriptors_class = GSK_GPU_DESCRIPTORS_CLASS (klass); - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - object_class->finalize = gsk_gl_descriptors_finalize; - - descriptors_class->add_image = gsk_gl_descriptors_add_image; - descriptors_class->add_buffer = gsk_gl_descriptors_add_buffer; -} - -static void -gsk_gl_descriptors_init (GskGLDescriptors *self) -{ -} + .finalize = gsk_gl_descriptors_finalize, + .add_image = gsk_gl_descriptors_add_image, + .add_buffer = gsk_gl_descriptors_add_buffer, +}; GskGpuDescriptors * gsk_gl_descriptors_new (GskGLDevice *device) { GskGLDescriptors *self; + GskGpuDescriptors *desc; - self = g_object_new (GSK_TYPE_GL_DESCRIPTORS, NULL); + self = g_new0 (GskGLDescriptors, 1); + desc = GSK_GPU_DESCRIPTORS (self); + + desc->ref_count = 1; + desc->desc_class = (GskGpuDescriptorsClass *) &GSK_GL_DESCRIPTORS_CLASS; + gsk_gpu_descriptors_init (&self->parent_instance); self->device = g_object_ref (device); @@ -110,7 +96,7 @@ gsk_gl_descriptors_get_n_external (GskGLDescriptors *self) void gsk_gl_descriptors_use (GskGLDescriptors *self) { - GskGpuDescriptors *desc = GSK_GPU_DESCRIPTORS (self); + GskGpuDescriptors *desc = &self->parent_instance; gsize i, ext, n_textures; n_textures = 16 - 3 * self->n_external; diff --git a/gsk/gpu/gskgldescriptorsprivate.h b/gsk/gpu/gskgldescriptorsprivate.h index 1e618efccf..1d1d42815b 100644 --- a/gsk/gpu/gskgldescriptorsprivate.h +++ b/gsk/gpu/gskgldescriptorsprivate.h @@ -6,9 +6,17 @@ G_BEGIN_DECLS -#define GSK_TYPE_GL_DESCRIPTORS (gsk_gl_descriptors_get_type ()) +typedef struct _GskGLDescriptors GskGLDescriptors; -G_DECLARE_FINAL_TYPE (GskGLDescriptors, gsk_gl_descriptors, GSK, GL_DESCRIPTORS, GskGpuDescriptors) +#define GSK_GL_DESCRIPTORS(d) ((GskGLDescriptors *) (d)) + +struct _GskGLDescriptors +{ + GskGpuDescriptors parent_instance; + + GskGLDevice *device; + guint n_external; +}; GskGpuDescriptors * gsk_gl_descriptors_new (GskGLDevice *device); diff --git a/gsk/gpu/gskgpudescriptors.c b/gsk/gpu/gskgpudescriptors.c index d0e9d907de..078ee6aa1a 100644 --- a/gsk/gpu/gskgpudescriptors.c +++ b/gsk/gpu/gskgpudescriptors.c @@ -2,22 +2,6 @@ #include "gskgpudescriptorsprivate.h" -typedef struct _GskGpuImageEntry GskGpuImageEntry; -typedef struct _GskGpuBufferEntry GskGpuBufferEntry; - -struct _GskGpuImageEntry -{ - GskGpuImage *image; - GskGpuSampler sampler; - guint32 descriptor; -}; - -struct _GskGpuBufferEntry -{ - GskGpuBuffer *buffer; - guint32 descriptor; -}; - static void gsk_gpu_image_entry_clear (gpointer data) { @@ -34,6 +18,8 @@ gsk_gpu_buffer_entry_clear (gpointer data) g_object_unref (entry->buffer); } +#define INCLUDE_IMPL 1 + #define GDK_ARRAY_NAME gsk_gpu_image_entries #define GDK_ARRAY_TYPE_NAME GskGpuImageEntries #define GDK_ARRAY_ELEMENT_TYPE GskGpuImageEntry @@ -43,6 +29,8 @@ gsk_gpu_buffer_entry_clear (gpointer data) #define GDK_ARRAY_NO_MEMSET 1 #include "gdk/gdkarrayimpl.c" +#define INCLUDE_IMPL 1 + #define GDK_ARRAY_NAME gsk_gpu_buffer_entries #define GDK_ARRAY_TYPE_NAME GskGpuBufferEntries #define GDK_ARRAY_ELEMENT_TYPE GskGpuBufferEntry @@ -52,80 +40,48 @@ gsk_gpu_buffer_entry_clear (gpointer data) #define GDK_ARRAY_NO_MEMSET 1 #include "gdk/gdkarrayimpl.c" -typedef struct _GskGpuDescriptorsPrivate GskGpuDescriptorsPrivate; - -struct _GskGpuDescriptorsPrivate +void +gsk_gpu_descriptors_finalize (GskGpuDescriptors *self) { - GskGpuImageEntries images; - GskGpuBufferEntries buffers; -}; - -G_DEFINE_TYPE_WITH_PRIVATE (GskGpuDescriptors, gsk_gpu_descriptors, G_TYPE_OBJECT) - -static void -gsk_gpu_descriptors_finalize (GObject *object) -{ - GskGpuDescriptors *self = GSK_GPU_DESCRIPTORS (object); - GskGpuDescriptorsPrivate *priv = gsk_gpu_descriptors_get_instance_private (self); - - gsk_gpu_image_entries_clear (&priv->images); - gsk_gpu_buffer_entries_clear (&priv->buffers); - - G_OBJECT_CLASS (gsk_gpu_descriptors_parent_class)->finalize (object); + gsk_gpu_image_entries_clear (&self->images); + gsk_gpu_buffer_entries_clear (&self->buffers); } -static void -gsk_gpu_descriptors_class_init (GskGpuDescriptorsClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - object_class->finalize = gsk_gpu_descriptors_finalize; -} - -static void +void gsk_gpu_descriptors_init (GskGpuDescriptors *self) { - GskGpuDescriptorsPrivate *priv = gsk_gpu_descriptors_get_instance_private (self); - - gsk_gpu_image_entries_init (&priv->images); - gsk_gpu_buffer_entries_init (&priv->buffers); + gsk_gpu_image_entries_init (&self->images); + gsk_gpu_buffer_entries_init (&self->buffers); } gsize gsk_gpu_descriptors_get_n_images (GskGpuDescriptors *self) { - GskGpuDescriptorsPrivate *priv = gsk_gpu_descriptors_get_instance_private (self); - - return gsk_gpu_image_entries_get_size (&priv->images); + return gsk_gpu_image_entries_get_size (&self->images); } gsize gsk_gpu_descriptors_get_n_buffers (GskGpuDescriptors *self) { - GskGpuDescriptorsPrivate *priv = gsk_gpu_descriptors_get_instance_private (self); - - return gsk_gpu_buffer_entries_get_size (&priv->buffers); + return gsk_gpu_buffer_entries_get_size (&self->buffers); } void gsk_gpu_descriptors_set_size (GskGpuDescriptors *self, gsize n_images, gsize n_buffers) { - GskGpuDescriptorsPrivate *priv = gsk_gpu_descriptors_get_instance_private (self); + g_assert (n_images <= gsk_gpu_image_entries_get_size (&self->images)); + gsk_gpu_image_entries_set_size (&self->images, n_images); - g_assert (n_images <= gsk_gpu_image_entries_get_size (&priv->images)); - gsk_gpu_image_entries_set_size (&priv->images, n_images); - - g_assert (n_buffers <= gsk_gpu_buffer_entries_get_size (&priv->buffers)); - gsk_gpu_buffer_entries_set_size (&priv->buffers, n_buffers); + g_assert (n_buffers <= gsk_gpu_buffer_entries_get_size (&self->buffers)); + gsk_gpu_buffer_entries_set_size (&self->buffers, n_buffers); } GskGpuImage * gsk_gpu_descriptors_get_image (GskGpuDescriptors *self, gsize id) { - GskGpuDescriptorsPrivate *priv = gsk_gpu_descriptors_get_instance_private (self); - const GskGpuImageEntry *entry = gsk_gpu_image_entries_get (&priv->images, id); + const GskGpuImageEntry *entry = gsk_gpu_image_entries_get (&self->images, id); return entry->image; } @@ -134,8 +90,7 @@ GskGpuSampler gsk_gpu_descriptors_get_sampler (GskGpuDescriptors *self, gsize id) { - GskGpuDescriptorsPrivate *priv = gsk_gpu_descriptors_get_instance_private (self); - const GskGpuImageEntry *entry = gsk_gpu_image_entries_get (&priv->images, id); + const GskGpuImageEntry *entry = gsk_gpu_image_entries_get (&self->images, id); return entry->sampler; } @@ -144,12 +99,11 @@ gsize gsk_gpu_descriptors_find_image (GskGpuDescriptors *self, guint32 descriptor) { - GskGpuDescriptorsPrivate *priv = gsk_gpu_descriptors_get_instance_private (self); gsize i; - for (i = 0; i < gsk_gpu_image_entries_get_size (&priv->images); i++) + for (i = 0; i < gsk_gpu_image_entries_get_size (&self->images); i++) { - const GskGpuImageEntry *entry = gsk_gpu_image_entries_get (&priv->images, i); + const GskGpuImageEntry *entry = gsk_gpu_image_entries_get (&self->images, i); if (entry->descriptor == descriptor) return i; @@ -162,8 +116,7 @@ GskGpuBuffer * gsk_gpu_descriptors_get_buffer (GskGpuDescriptors *self, gsize id) { - GskGpuDescriptorsPrivate *priv = gsk_gpu_descriptors_get_instance_private (self); - const GskGpuBufferEntry *entry = gsk_gpu_buffer_entries_get (&priv->buffers, id); + const GskGpuBufferEntry *entry = gsk_gpu_buffer_entries_get (&self->buffers, id); return entry->buffer; } @@ -174,13 +127,12 @@ gsk_gpu_descriptors_add_image (GskGpuDescriptors *self, GskGpuSampler sampler, guint32 *out_descriptor) { - GskGpuDescriptorsPrivate *priv = gsk_gpu_descriptors_get_instance_private (self); gsize i; guint32 descriptor; - for (i = 0; i < gsk_gpu_image_entries_get_size (&priv->images); i++) + for (i = 0; i < gsk_gpu_image_entries_get_size (&self->images); i++) { - const GskGpuImageEntry *entry = gsk_gpu_image_entries_get (&priv->images, i); + const GskGpuImageEntry *entry = gsk_gpu_image_entries_get (&self->images, i); if (entry->image == image && entry->sampler == sampler) { @@ -189,10 +141,10 @@ gsk_gpu_descriptors_add_image (GskGpuDescriptors *self, } } - if (!GSK_GPU_DESCRIPTORS_GET_CLASS (self)->add_image (self, image, sampler, &descriptor)) + if (!self->desc_class->add_image (self, image, sampler, &descriptor)) return FALSE; - gsk_gpu_image_entries_append (&priv->images, + gsk_gpu_image_entries_append (&self->images, &(GskGpuImageEntry) { .image = g_object_ref (image), .sampler = sampler, @@ -209,13 +161,12 @@ gsk_gpu_descriptors_add_buffer (GskGpuDescriptors *self, GskGpuBuffer *buffer, guint32 *out_descriptor) { - GskGpuDescriptorsPrivate *priv = gsk_gpu_descriptors_get_instance_private (self); gsize i; guint32 descriptor; - for (i = 0; i < gsk_gpu_buffer_entries_get_size (&priv->buffers); i++) + for (i = 0; i < gsk_gpu_buffer_entries_get_size (&self->buffers); i++) { - const GskGpuBufferEntry *entry = gsk_gpu_buffer_entries_get (&priv->buffers, i); + const GskGpuBufferEntry *entry = gsk_gpu_buffer_entries_get (&self->buffers, i); if (entry->buffer == buffer) { @@ -224,10 +175,10 @@ gsk_gpu_descriptors_add_buffer (GskGpuDescriptors *self, } } - if (!GSK_GPU_DESCRIPTORS_GET_CLASS (self)->add_buffer (self, buffer, &descriptor)) + if (!self->desc_class->add_buffer (self, buffer, &descriptor)) return FALSE; - gsk_gpu_buffer_entries_append (&priv->buffers, + gsk_gpu_buffer_entries_append (&self->buffers, &(GskGpuBufferEntry) { .buffer = g_object_ref (buffer), .descriptor = descriptor @@ -238,3 +189,22 @@ gsk_gpu_descriptors_add_buffer (GskGpuDescriptors *self, return TRUE; } +GskGpuDescriptors * +gsk_gpu_descriptors_ref (GskGpuDescriptors *self) +{ + self->ref_count++; + + return self; +} + +void +gsk_gpu_descriptors_unref (GskGpuDescriptors *self) +{ + self->ref_count--; + + if (self->ref_count == 0) + { + self->desc_class->finalize (self); + g_free (self); + } +} diff --git a/gsk/gpu/gskgpudescriptorsprivate.h b/gsk/gpu/gskgpudescriptorsprivate.h index 908f1d393d..ca83244cec 100644 --- a/gsk/gpu/gskgpudescriptorsprivate.h +++ b/gsk/gpu/gskgpudescriptorsprivate.h @@ -2,26 +2,62 @@ #include "gskgputypesprivate.h" +typedef struct _GskGpuImageEntry GskGpuImageEntry; +typedef struct _GskGpuBufferEntry GskGpuBufferEntry; + +struct _GskGpuImageEntry +{ + GskGpuImage *image; + GskGpuSampler sampler; + guint32 descriptor; +}; + +struct _GskGpuBufferEntry +{ + GskGpuBuffer *buffer; + guint32 descriptor; +}; + +#define INCLUDE_DECL 1 + +#define GDK_ARRAY_NAME gsk_gpu_image_entries +#define GDK_ARRAY_TYPE_NAME GskGpuImageEntries +#define GDK_ARRAY_ELEMENT_TYPE GskGpuImageEntry +#define GDK_ARRAY_BY_VALUE 1 +#define GDK_ARRAY_PREALLOC 16 +#define GDK_ARRAY_NO_MEMSET 1 +#include "gdk/gdkarrayimpl.c" + +#define INCLUDE_DECL 1 + +#define GDK_ARRAY_NAME gsk_gpu_buffer_entries +#define GDK_ARRAY_TYPE_NAME GskGpuBufferEntries +#define GDK_ARRAY_ELEMENT_TYPE GskGpuBufferEntry +#define GDK_ARRAY_BY_VALUE 1 +#define GDK_ARRAY_PREALLOC 4 +#define GDK_ARRAY_NO_MEMSET 1 +#include "gdk/gdkarrayimpl.c" + G_BEGIN_DECLS -#define GSK_TYPE_GPU_DESCRIPTORS (gsk_gpu_descriptors_get_type ()) -#define GSK_GPU_DESCRIPTORS(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GSK_TYPE_GPU_DESCRIPTORS, GskGpuDescriptors)) -#define GSK_GPU_DESCRIPTORS_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GSK_TYPE_GPU_DESCRIPTORS, GskGpuDescriptorsClass)) -#define GSK_IS_GPU_DESCRIPTORS(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GSK_TYPE_GPU_DESCRIPTORS)) -#define GSK_IS_GPU_DESCRIPTORS_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GSK_TYPE_GPU_DESCRIPTORS)) -#define GSK_GPU_DESCRIPTORS_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GSK_TYPE_GPU_DESCRIPTORS, GskGpuDescriptorsClass)) - +typedef struct _GskGpuDescriptors GskGpuDescriptors; typedef struct _GskGpuDescriptorsClass GskGpuDescriptorsClass; +#define GSK_GPU_DESCRIPTORS(d) ((GskGpuDescriptors *) (d)) + struct _GskGpuDescriptors { - GObject parent_instance; + GskGpuDescriptorsClass *desc_class; + + int ref_count; + + GskGpuImageEntries images; + GskGpuBufferEntries buffers; }; struct _GskGpuDescriptorsClass { - GObjectClass parent_class; - + void (* finalize) (GskGpuDescriptors *self); gboolean (* add_image) (GskGpuDescriptors *self, GskGpuImage *image, GskGpuSampler sampler, @@ -31,7 +67,9 @@ struct _GskGpuDescriptorsClass guint32 *out_id); }; -GType gsk_gpu_descriptors_get_type (void) G_GNUC_CONST; +GskGpuDescriptors * gsk_gpu_descriptors_ref (GskGpuDescriptors *self); +void gsk_gpu_descriptors_unref (GskGpuDescriptors *self); + gsize gsk_gpu_descriptors_get_n_images (GskGpuDescriptors *self); gsize gsk_gpu_descriptors_get_n_buffers (GskGpuDescriptors *self); @@ -55,7 +93,7 @@ gboolean gsk_gpu_descriptors_add_buffer (GskGpuD GskGpuBuffer *buffer, guint32 *out_descriptor); - -G_DEFINE_AUTOPTR_CLEANUP_FUNC(GskGpuDescriptors, g_object_unref) +void gsk_gpu_descriptors_finalize (GskGpuDescriptors *self); +void gsk_gpu_descriptors_init (GskGpuDescriptors *self); G_END_DECLS diff --git a/gsk/gpu/gskgpunodeprocessor.c b/gsk/gpu/gskgpunodeprocessor.c index b736e51d32..c41c3d3a6b 100644 --- a/gsk/gpu/gskgpunodeprocessor.c +++ b/gsk/gpu/gskgpunodeprocessor.c @@ -145,7 +145,7 @@ static void gsk_gpu_node_processor_finish (GskGpuNodeProcessor *self) { g_clear_pointer (&self->modelview, gsk_transform_unref); - g_clear_object (&self->desc); + g_clear_pointer (&self->desc, gsk_gpu_descriptors_unref); } static void @@ -163,7 +163,7 @@ gsk_gpu_node_processor_init (GskGpuNodeProcessor *self, self->frame = frame; if (desc) - self->desc = g_object_ref (desc); + self->desc = gsk_gpu_descriptors_ref (desc); else self->desc = NULL; @@ -261,7 +261,7 @@ gsk_gpu_node_processor_add_image (GskGpuNodeProcessor *self, if (gsk_gpu_descriptors_add_image (self->desc, image, sampler, &descriptor)) return descriptor; - g_object_unref (self->desc); + gsk_gpu_descriptors_unref (self->desc); } self->desc = gsk_gpu_frame_create_descriptors (self->frame); @@ -538,7 +538,7 @@ gsk_gpu_pattern_writer_finish (GskGpuPatternWriter *self) { pattern_buffer_clear (&self->buffer); g_assert (self->stack == 0); - g_clear_object (&self->desc); + g_clear_pointer (&self->desc, gsk_gpu_descriptors_unref); } static gboolean diff --git a/gsk/gpu/gskgpushaderop.c b/gsk/gpu/gskgpushaderop.c index c6ce9e07bd..a4156a2215 100644 --- a/gsk/gpu/gskgpushaderop.c +++ b/gsk/gpu/gskgpushaderop.c @@ -23,7 +23,7 @@ gsk_gpu_shader_op_finish (GskGpuOp *op) { GskGpuShaderOp *self = (GskGpuShaderOp *) op; - g_clear_object (&self->desc); + g_clear_pointer (&self->desc, gsk_gpu_descriptors_unref); } #ifdef GDK_RENDERING_VULKAN @@ -197,7 +197,7 @@ gsk_gpu_shader_op_alloc (GskGpuFrame *frame, self->variation = variation; self->clip = clip; if (desc) - self->desc = g_object_ref (desc); + self->desc = gsk_gpu_descriptors_ref (desc); else self->desc = NULL; self->vertex_offset = gsk_gpu_frame_reserve_vertex_data (frame, op_class->vertex_size); diff --git a/gsk/gpu/gskvulkandescriptors.c b/gsk/gpu/gskvulkandescriptors.c index edba0f83d6..38fc9ea50a 100644 --- a/gsk/gpu/gskvulkandescriptors.c +++ b/gsk/gpu/gskvulkandescriptors.c @@ -6,22 +6,13 @@ #include "gskvulkanframeprivate.h" #include "gskvulkanimageprivate.h" -G_DEFINE_TYPE (GskVulkanDescriptors, gsk_vulkan_descriptors, GSK_TYPE_GPU_DESCRIPTORS) - -static void -gsk_vulkan_descriptors_class_init (GskVulkanDescriptorsClass *klass) -{ -} - -static void -gsk_vulkan_descriptors_init (GskVulkanDescriptors *self) -{ -} - GskVulkanPipelineLayout * gsk_vulkan_descriptors_get_pipeline_layout (GskVulkanDescriptors *self) { - return GSK_VULKAN_DESCRIPTORS_GET_CLASS (self)->get_pipeline_layout (self); + GskGpuDescriptors *desc = GSK_GPU_DESCRIPTORS (self); + GskVulkanDescriptorsClass *class = GSK_VULKAN_DESCRIPTORS_CLASS (desc->desc_class); + + return class->get_pipeline_layout (self); } void @@ -48,5 +39,20 @@ gsk_vulkan_descriptors_bind (GskVulkanDescriptors *self, GskVulkanDescriptors *previous, VkCommandBuffer vk_command_buffer) { - return GSK_VULKAN_DESCRIPTORS_GET_CLASS (self)->bind (self, previous, vk_command_buffer); + GskGpuDescriptors *desc = GSK_GPU_DESCRIPTORS (self); + GskVulkanDescriptorsClass *class = GSK_VULKAN_DESCRIPTORS_CLASS (desc->desc_class); + + return class->bind (self, previous, vk_command_buffer); +} + +void +gsk_vulkan_descriptors_init (GskVulkanDescriptors *self) +{ + gsk_gpu_descriptors_init ((GskGpuDescriptors *) self); +} + +void +gsk_vulkan_descriptors_finalize (GskVulkanDescriptors *self) +{ + gsk_gpu_descriptors_finalize ((GskGpuDescriptors *) self); } diff --git a/gsk/gpu/gskvulkandescriptorsprivate.h b/gsk/gpu/gskvulkandescriptorsprivate.h index fb8aef1b3f..24fb316c4b 100644 --- a/gsk/gpu/gskvulkandescriptorsprivate.h +++ b/gsk/gpu/gskvulkandescriptorsprivate.h @@ -6,15 +6,12 @@ G_BEGIN_DECLS -#define GSK_TYPE_VULKAN_DESCRIPTORS (gsk_vulkan_descriptors_get_type ()) -#define GSK_VULKAN_DESCRIPTORS(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GSK_TYPE_VULKAN_DESCRIPTORS, GskVulkanDescriptors)) -#define GSK_VULKAN_DESCRIPTORS_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GSK_TYPE_VULKAN_DESCRIPTORS, GskVulkanDescriptorsClass)) -#define GSK_IS_VULKAN_DESCRIPTORS(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GSK_TYPE_VULKAN_DESCRIPTORS)) -#define GSK_IS_VULKAN_DESCRIPTORS_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GSK_TYPE_VULKAN_DESCRIPTORS)) -#define GSK_VULKAN_DESCRIPTORS_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GSK_TYPE_VULKAN_DESCRIPTORS, GskVulkanDescriptorsClass)) - +typedef struct _GskVulkanDescriptors GskVulkanDescriptors; typedef struct _GskVulkanDescriptorsClass GskVulkanDescriptorsClass; +#define GSK_VULKAN_DESCRIPTORS(d) ((GskVulkanDescriptors *) (d)) +#define GSK_VULKAN_DESCRIPTORS_CLASS(d) ((GskVulkanDescriptorsClass *) (d)) + struct _GskVulkanDescriptors { GskGpuDescriptors parent_instance; @@ -30,8 +27,6 @@ struct _GskVulkanDescriptorsClass VkCommandBuffer vk_command_buffer); }; -GType gsk_vulkan_descriptors_get_type (void) G_GNUC_CONST; - GskVulkanPipelineLayout * gsk_vulkan_descriptors_get_pipeline_layout (GskVulkanDescriptors *self); void gsk_vulkan_descriptors_transition (GskVulkanDescriptors *self, @@ -41,7 +36,8 @@ void gsk_vulkan_descriptors_bind GskVulkanDescriptors *previous, VkCommandBuffer vk_command_buffer); -G_DEFINE_AUTOPTR_CLEANUP_FUNC(GskVulkanDescriptors, g_object_unref) +void gsk_vulkan_descriptors_init (GskVulkanDescriptors *self); +void gsk_vulkan_descriptors_finalize (GskVulkanDescriptors *self); G_END_DECLS diff --git a/gsk/gpu/gskvulkanframe.c b/gsk/gpu/gskvulkanframe.c index 9dad7d4e16..8372a697bf 100644 --- a/gsk/gpu/gskvulkanframe.c +++ b/gsk/gpu/gskvulkanframe.c @@ -13,10 +13,16 @@ #include "gdk/gdkdisplayprivate.h" #include "gdk/gdkdmabuftextureprivate.h" +static inline void +gsk_vulkan_real_descriptors_unref (GskVulkanRealDescriptors *desc) +{ + gsk_gpu_descriptors_unref (GSK_GPU_DESCRIPTORS (desc)); +} + #define GDK_ARRAY_NAME gsk_descriptors #define GDK_ARRAY_TYPE_NAME GskDescriptors #define GDK_ARRAY_ELEMENT_TYPE GskVulkanRealDescriptors * -#define GDK_ARRAY_FREE_FUNC g_object_unref +#define GDK_ARRAY_FREE_FUNC gsk_vulkan_real_descriptors_unref #define GDK_ARRAY_NO_MEMSET 1 #include "gdk/gdkarrayimpl.c" @@ -262,7 +268,7 @@ gsk_vulkan_frame_create_descriptors (GskGpuFrame *frame) desc = gsk_vulkan_real_descriptors_new (self); gsk_descriptors_append (&self->descriptors, desc); - return GSK_GPU_DESCRIPTORS (g_object_ref (desc)); + return gsk_gpu_descriptors_ref (GSK_GPU_DESCRIPTORS (desc)); } } diff --git a/gsk/gpu/gskvulkanrealdescriptors.c b/gsk/gpu/gskvulkanrealdescriptors.c index 0be6b022b5..f8e28c2a32 100644 --- a/gsk/gpu/gskvulkanrealdescriptors.c +++ b/gsk/gpu/gskvulkanrealdescriptors.c @@ -2,9 +2,7 @@ #include "gskvulkanrealdescriptorsprivate.h" -#include "gskvulkanbufferprivate.h" -#include "gskvulkanframeprivate.h" -#include "gskvulkanimageprivate.h" +#define INCLUDE_IMPL 1 #define GDK_ARRAY_NAME gsk_descriptor_image_infos #define GDK_ARRAY_TYPE_NAME GskDescriptorImageInfos @@ -14,6 +12,8 @@ #define GDK_ARRAY_NO_MEMSET 1 #include "gdk/gdkarrayimpl.c" +#define INCLUDE_IMPL 1 + #define GDK_ARRAY_NAME gsk_descriptor_buffer_infos #define GDK_ARRAY_TYPE_NAME GskDescriptorBufferInfos #define GDK_ARRAY_ELEMENT_TYPE VkDescriptorBufferInfo @@ -22,6 +22,8 @@ #define GDK_ARRAY_NO_MEMSET 1 #include "gdk/gdkarrayimpl.c" +#define INCLUDE_IMPL 1 + #define GDK_ARRAY_NAME gsk_samplers #define GDK_ARRAY_TYPE_NAME GskSamplers #define GDK_ARRAY_ELEMENT_TYPE VkSampler @@ -29,24 +31,6 @@ #define GDK_ARRAY_NO_MEMSET 1 #include "gdk/gdkarrayimpl.c" -struct _GskVulkanRealDescriptors -{ - GskVulkanDescriptors parent_instance; - - GskVulkanFrame *frame; /* no reference, the frame owns us */ - - GskVulkanPipelineLayout *pipeline_layout; - - GskSamplers immutable_samplers; - GskDescriptorImageInfos descriptor_immutable_images; - GskDescriptorImageInfos descriptor_images; - GskDescriptorBufferInfos descriptor_buffers; - - VkDescriptorSet descriptor_sets[GSK_VULKAN_N_DESCRIPTOR_SETS]; -}; - -G_DEFINE_TYPE (GskVulkanRealDescriptors, gsk_vulkan_real_descriptors, GSK_TYPE_VULKAN_DESCRIPTORS) - static GskVulkanPipelineLayout * gsk_vulkan_real_descriptors_get_pipeline_layout (GskVulkanDescriptors *desc) { @@ -154,9 +138,9 @@ gsk_vulkan_real_descriptors_add_buffer (GskGpuDescriptors *desc, } static void -gsk_vulkan_real_descriptors_finalize (GObject *object) +gsk_vulkan_real_descriptors_finalize (GskGpuDescriptors *desc) { - GskVulkanRealDescriptors *self = GSK_VULKAN_REAL_DESCRIPTORS (object); + GskVulkanRealDescriptors *self = GSK_VULKAN_REAL_DESCRIPTORS (desc); gsk_samplers_clear (&self->immutable_samplers); gsk_descriptor_image_infos_clear (&self->descriptor_immutable_images); @@ -166,28 +150,25 @@ gsk_vulkan_real_descriptors_finalize (GObject *object) gsk_vulkan_device_release_pipeline_layout (GSK_VULKAN_DEVICE (gsk_gpu_frame_get_device (GSK_GPU_FRAME (self->frame))), self->pipeline_layout); - G_OBJECT_CLASS (gsk_vulkan_real_descriptors_parent_class)->finalize (object); + gsk_vulkan_descriptors_finalize ((GskVulkanDescriptors *) desc); } -static void -gsk_vulkan_real_descriptors_class_init (GskVulkanRealDescriptorsClass *klass) +static GskVulkanDescriptorsClass GSK_VULKAN_REAL_DESCRIPTORS_CLASS = { - GskVulkanDescriptorsClass *vulkan_descriptors_class = GSK_VULKAN_DESCRIPTORS_CLASS (klass); - GskGpuDescriptorsClass *descriptors_class = GSK_GPU_DESCRIPTORS_CLASS (klass); - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - object_class->finalize = gsk_vulkan_real_descriptors_finalize; - - descriptors_class->add_image = gsk_vulkan_real_descriptors_add_image; - descriptors_class->add_buffer = gsk_vulkan_real_descriptors_add_buffer; - - vulkan_descriptors_class->get_pipeline_layout = gsk_vulkan_real_descriptors_get_pipeline_layout; - vulkan_descriptors_class->bind = gsk_vulkan_real_descriptors_bind; -} + .parent_class = (GskGpuDescriptorsClass) { + .finalize = gsk_vulkan_real_descriptors_finalize, + .add_image = gsk_vulkan_real_descriptors_add_image, + .add_buffer = gsk_vulkan_real_descriptors_add_buffer, + }, + .get_pipeline_layout = gsk_vulkan_real_descriptors_get_pipeline_layout, + .bind = gsk_vulkan_real_descriptors_bind +}; static void gsk_vulkan_real_descriptors_init (GskVulkanRealDescriptors *self) { + gsk_vulkan_descriptors_init (GSK_VULKAN_DESCRIPTORS (self)); + gsk_samplers_init (&self->immutable_samplers); gsk_descriptor_image_infos_init (&self->descriptor_immutable_images); gsk_descriptor_image_infos_init (&self->descriptor_images); @@ -198,8 +179,15 @@ GskVulkanRealDescriptors * gsk_vulkan_real_descriptors_new (GskVulkanFrame *frame) { GskVulkanRealDescriptors *self; + GskGpuDescriptors *desc; - self = g_object_new (GSK_TYPE_VULKAN_REAL_DESCRIPTORS, NULL); + self = g_new0 (GskVulkanRealDescriptors, 1); + + desc = GSK_GPU_DESCRIPTORS (self); + desc->ref_count = 1; + desc->desc_class = (GskGpuDescriptorsClass *) &GSK_VULKAN_REAL_DESCRIPTORS_CLASS; + + gsk_vulkan_real_descriptors_init (self); self->frame = frame; diff --git a/gsk/gpu/gskvulkanrealdescriptorsprivate.h b/gsk/gpu/gskvulkanrealdescriptorsprivate.h index 25cb82746b..b5ec294e2a 100644 --- a/gsk/gpu/gskvulkanrealdescriptorsprivate.h +++ b/gsk/gpu/gskvulkanrealdescriptorsprivate.h @@ -3,11 +3,61 @@ #include "gskvulkandescriptorsprivate.h" #include "gskvulkanframeprivate.h" +#include "gskvulkanbufferprivate.h" +#include "gskvulkanframeprivate.h" +#include "gskvulkanimageprivate.h" + +#define INCLUDE_DECL 1 + +#define GDK_ARRAY_NAME gsk_descriptor_image_infos +#define GDK_ARRAY_TYPE_NAME GskDescriptorImageInfos +#define GDK_ARRAY_ELEMENT_TYPE VkDescriptorImageInfo +#define GDK_ARRAY_BY_VALUE 1 +#define GDK_ARRAY_PREALLOC 128 +#define GDK_ARRAY_NO_MEMSET 1 +#include "gdk/gdkarrayimpl.c" + +#define INCLUDE_DECL 1 + +#define GDK_ARRAY_NAME gsk_descriptor_buffer_infos +#define GDK_ARRAY_TYPE_NAME GskDescriptorBufferInfos +#define GDK_ARRAY_ELEMENT_TYPE VkDescriptorBufferInfo +#define GDK_ARRAY_BY_VALUE 1 +#define GDK_ARRAY_PREALLOC 32 +#define GDK_ARRAY_NO_MEMSET 1 +#include "gdk/gdkarrayimpl.c" + +#define INCLUDE_DECL 1 + +#define GDK_ARRAY_NAME gsk_samplers +#define GDK_ARRAY_TYPE_NAME GskSamplers +#define GDK_ARRAY_ELEMENT_TYPE VkSampler +#define GDK_ARRAY_PREALLOC 32 +#define GDK_ARRAY_NO_MEMSET 1 +#include "gdk/gdkarrayimpl.c" + + G_BEGIN_DECLS -#define GSK_TYPE_VULKAN_REAL_DESCRIPTORS (gsk_vulkan_real_descriptors_get_type ()) +typedef struct _GskVulkanRealDescriptors GskVulkanRealDescriptors; -G_DECLARE_FINAL_TYPE (GskVulkanRealDescriptors, gsk_vulkan_real_descriptors, GSK, VULKAN_REAL_DESCRIPTORS, GskVulkanDescriptors) +#define GSK_VULKAN_REAL_DESCRIPTORS(d) ((GskVulkanRealDescriptors *) (d)) + +struct _GskVulkanRealDescriptors +{ + GskVulkanDescriptors parent_instance; + + GskVulkanFrame *frame; /* no reference, the frame owns us */ + + GskVulkanPipelineLayout *pipeline_layout; + + GskSamplers immutable_samplers; + GskDescriptorImageInfos descriptor_immutable_images; + GskDescriptorImageInfos descriptor_images; + GskDescriptorBufferInfos descriptor_buffers; + + VkDescriptorSet descriptor_sets[GSK_VULKAN_N_DESCRIPTOR_SETS]; +}; GskVulkanRealDescriptors * gsk_vulkan_real_descriptors_new (GskVulkanFrame *frame); diff --git a/gsk/gpu/gskvulkansubdescriptors.c b/gsk/gpu/gskvulkansubdescriptors.c index f779e6be06..6ecd3b7b1e 100644 --- a/gsk/gpu/gskvulkansubdescriptors.c +++ b/gsk/gpu/gskvulkansubdescriptors.c @@ -2,15 +2,32 @@ #include "gskvulkansubdescriptorsprivate.h" -struct _GskVulkanSubDescriptors + +static void gsk_vulkan_sub_descriptors_finalize (GskGpuDescriptors *desc); +static gboolean gsk_vulkan_sub_descriptors_add_buffer (GskGpuDescriptors *desc, + GskGpuBuffer *buffer, + guint32 *out_descriptor); +static gboolean gsk_vulkan_sub_descriptors_add_image (GskGpuDescriptors *desc, + GskGpuImage *image, + GskGpuSampler sampler, + guint32 *out_descriptor); +static GskVulkanPipelineLayout * + gsk_vulkan_sub_descriptors_get_pipeline_layout (GskVulkanDescriptors *desc); +static void gsk_vulkan_sub_descriptors_bind (GskVulkanDescriptors *desc, + GskVulkanDescriptors *previous, + VkCommandBuffer vk_command_buffer); + +static GskVulkanDescriptorsClass GSK_VULKAN_SUB_DESCRIPTORS_CLASS = { - GskVulkanDescriptors parent_instance; - - GskVulkanDescriptors *parent; + .parent_class = (GskGpuDescriptorsClass) { + .finalize = gsk_vulkan_sub_descriptors_finalize, + .add_image = gsk_vulkan_sub_descriptors_add_image, + .add_buffer = gsk_vulkan_sub_descriptors_add_buffer, + }, + .get_pipeline_layout = gsk_vulkan_sub_descriptors_get_pipeline_layout, + .bind = gsk_vulkan_sub_descriptors_bind, }; -G_DEFINE_TYPE (GskVulkanSubDescriptors, gsk_vulkan_sub_descriptors, GSK_TYPE_VULKAN_DESCRIPTORS) - static GskVulkanPipelineLayout * gsk_vulkan_sub_descriptors_get_pipeline_layout (GskVulkanDescriptors *desc) { @@ -26,7 +43,7 @@ gsk_vulkan_sub_descriptors_bind (GskVulkanDescriptors *desc, { GskVulkanSubDescriptors *self = GSK_VULKAN_SUB_DESCRIPTORS (desc); - if (GSK_IS_VULKAN_SUB_DESCRIPTORS (previous)) + if (GSK_GPU_DESCRIPTORS (previous)->desc_class == (GskGpuDescriptorsClass *) &GSK_VULKAN_SUB_DESCRIPTORS_CLASS) previous = GSK_VULKAN_SUB_DESCRIPTORS (previous)->parent; if (self->parent == previous) @@ -62,45 +79,35 @@ gsk_vulkan_sub_descriptors_add_buffer (GskGpuDescriptors *desc, } static void -gsk_vulkan_sub_descriptors_finalize (GObject *object) +gsk_vulkan_sub_descriptors_finalize (GskGpuDescriptors *desc) { - GskVulkanSubDescriptors *self = GSK_VULKAN_SUB_DESCRIPTORS (object); + GskVulkanSubDescriptors *self = GSK_VULKAN_SUB_DESCRIPTORS (desc); - g_object_unref (self->parent); + gsk_gpu_descriptors_unref (GSK_GPU_DESCRIPTORS (self->parent)); - G_OBJECT_CLASS (gsk_vulkan_sub_descriptors_parent_class)->finalize (object); -} - -static void -gsk_vulkan_sub_descriptors_class_init (GskVulkanSubDescriptorsClass *klass) -{ - GskVulkanDescriptorsClass *vulkan_descriptors_class = GSK_VULKAN_DESCRIPTORS_CLASS (klass); - GskGpuDescriptorsClass *descriptors_class = GSK_GPU_DESCRIPTORS_CLASS (klass); - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - object_class->finalize = gsk_vulkan_sub_descriptors_finalize; - - descriptors_class->add_image = gsk_vulkan_sub_descriptors_add_image; - descriptors_class->add_buffer = gsk_vulkan_sub_descriptors_add_buffer; - - vulkan_descriptors_class->get_pipeline_layout = gsk_vulkan_sub_descriptors_get_pipeline_layout; - vulkan_descriptors_class->bind = gsk_vulkan_sub_descriptors_bind; + gsk_vulkan_descriptors_finalize (GSK_VULKAN_DESCRIPTORS (self)); } static void gsk_vulkan_sub_descriptors_init (GskVulkanSubDescriptors *self) { + gsk_vulkan_descriptors_init (GSK_VULKAN_DESCRIPTORS (self)); } GskVulkanSubDescriptors * gsk_vulkan_sub_descriptors_new (GskVulkanDescriptors *parent) { GskVulkanSubDescriptors *self; + GskGpuDescriptors *desc; - self = g_object_new (GSK_TYPE_VULKAN_SUB_DESCRIPTORS, NULL); + self = g_new0 (GskVulkanSubDescriptors, 1); + desc = GSK_GPU_DESCRIPTORS (self); - self->parent = g_object_ref (parent); + desc->ref_count = 1; + desc->desc_class = (GskGpuDescriptorsClass *) &GSK_VULKAN_SUB_DESCRIPTORS_CLASS; + gsk_vulkan_sub_descriptors_init (self); + + self->parent = GSK_VULKAN_DESCRIPTORS (gsk_gpu_descriptors_ref (GSK_GPU_DESCRIPTORS (parent))); return self; } - diff --git a/gsk/gpu/gskvulkansubdescriptorsprivate.h b/gsk/gpu/gskvulkansubdescriptorsprivate.h index 5b0cc3a643..b28e7786d0 100644 --- a/gsk/gpu/gskvulkansubdescriptorsprivate.h +++ b/gsk/gpu/gskvulkansubdescriptorsprivate.h @@ -4,9 +4,16 @@ G_BEGIN_DECLS -#define GSK_TYPE_VULKAN_SUB_DESCRIPTORS (gsk_vulkan_sub_descriptors_get_type ()) +typedef struct _GskVulkanSubDescriptors GskVulkanSubDescriptors; -G_DECLARE_FINAL_TYPE (GskVulkanSubDescriptors, gsk_vulkan_sub_descriptors, GSK, VULKAN_SUB_DESCRIPTORS, GskVulkanDescriptors) +#define GSK_VULKAN_SUB_DESCRIPTORS(d) ((GskVulkanSubDescriptors *) (d)) + +struct _GskVulkanSubDescriptors +{ + GskVulkanDescriptors parent_instance; + + GskVulkanDescriptors *parent; +}; GskVulkanSubDescriptors * gsk_vulkan_sub_descriptors_new (GskVulkanDescriptors *parent);