vulkan: Put the framebuffer in the renderpass
authorBenjamin Otte <otte@redhat.com>
Sat, 17 Jun 2023 16:53:33 +0000 (18:53 +0200)
committerBenjamin Otte <otte@redhat.com>
Mon, 19 Jun 2023 13:08:00 +0000 (15:08 +0200)
... instead of having fancy caching.

That caching is complicated and it's not necessary.

gsk/vulkan/gskvulkanrender.c
gsk/vulkan/gskvulkanrenderpass.c

index 99c20e58051c5e539a962b6e343fcede0903651c..5776dd939c9daf05a3e6df5b4b1ade9483642dd2 100644 (file)
@@ -50,7 +50,6 @@ struct _GskVulkanRender
   graphene_rect_t viewport;
   cairo_region_t *clip;
 
-  GHashTable *framebuffers;
   GskVulkanCommandPool *command_pool;
   VkFence fence;
   VkRenderPass render_pass;
@@ -131,7 +130,6 @@ gsk_vulkan_render_new (GskRenderer      *renderer,
 
   self->vulkan = context;
   self->renderer = renderer;
-  self->framebuffers = g_hash_table_new (g_direct_hash, g_direct_equal);
   gsk_descriptor_image_infos_init (&self->descriptor_images);
   gsk_descriptor_image_infos_init (&self->descriptor_samplers);
   gsk_descriptor_buffer_infos_init (&self->descriptor_buffers);
@@ -324,58 +322,6 @@ gsk_vulkan_render_new (GskRenderer      *renderer,
   return self;
 }
 
-typedef struct {
-  VkFramebuffer framebuffer;
-} HashFramebufferEntry;
-
-static void
-gsk_vulkan_render_remove_framebuffer_from_image (gpointer  data,
-                                                 GObject  *image)
-{
-  GskVulkanRender *self = data;
-  HashFramebufferEntry *fb;
-
-  fb = g_hash_table_lookup (self->framebuffers, image);
-  g_hash_table_remove (self->framebuffers, image);
-
-  vkDestroyFramebuffer (gdk_vulkan_context_get_device (self->vulkan),
-                        fb->framebuffer,
-                        NULL);
-
-  g_free (fb);
-}
-
-VkFramebuffer
-gsk_vulkan_render_get_framebuffer (GskVulkanRender *self,
-                                   GskVulkanImage  *image)
-{
-  HashFramebufferEntry *fb;
-
-  fb = g_hash_table_lookup (self->framebuffers, image);
-  if (fb)
-    return fb->framebuffer;
-
-  fb = g_new0 (HashFramebufferEntry, 1);
-  GSK_VK_CHECK (vkCreateFramebuffer, gdk_vulkan_context_get_device (self->vulkan),
-                                     &(VkFramebufferCreateInfo) {
-                                         .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
-                                         .renderPass = self->render_pass,
-                                         .attachmentCount = 1,
-                                         .pAttachments = (VkImageView[1]) {
-                                             gsk_vulkan_image_get_image_view (image)
-                                         },
-                                         .width = gsk_vulkan_image_get_width (image),
-                                         .height = gsk_vulkan_image_get_height (image),
-                                         .layers = 1
-                                     },
-                                     NULL,
-                                     &fb->framebuffer);
-  g_hash_table_insert (self->framebuffers, image, fb);
-  g_object_weak_ref (G_OBJECT (image), gsk_vulkan_render_remove_framebuffer_from_image, self);
-
-  return fb->framebuffer;
-}
-
 VkFence
 gsk_vulkan_render_get_fence (GskVulkanRender *self)
 {
@@ -811,8 +757,6 @@ gsk_vulkan_render_cleanup (GskVulkanRender *self)
 void
 gsk_vulkan_render_free (GskVulkanRender *self)
 {
-  GHashTableIter iter;
-  gpointer key, value;
   VkDevice device;
   guint i;
   
@@ -820,20 +764,6 @@ gsk_vulkan_render_free (GskVulkanRender *self)
 
   device = gdk_vulkan_context_get_device (self->vulkan);
 
-  g_hash_table_iter_init (&iter, self->framebuffers);
-  while (g_hash_table_iter_next (&iter, &key, &value))
-    {
-      HashFramebufferEntry *fb = value;
-
-      vkDestroyFramebuffer (gdk_vulkan_context_get_device (self->vulkan),
-                            fb->framebuffer,
-                            NULL);
-      g_free (fb);
-      g_object_weak_unref (G_OBJECT (key), gsk_vulkan_render_remove_framebuffer_from_image, self);
-      g_hash_table_iter_remove (&iter);
-    }
-  g_hash_table_unref (self->framebuffers);
-
   for (i = 0; i < GSK_VULKAN_N_PIPELINES; i++)
     g_clear_object (&self->pipelines[i]);
 
index b5a96eae7b21f9727bbd9689baad43a5e8fda053..1c16db9604874c602346e37b77e0871ef40c01a8 100644 (file)
@@ -136,6 +136,7 @@ struct _GskVulkanRenderPass
   graphene_vec2_t scale;
 
   VkRenderPass render_pass;
+  VkFramebuffer framebuffer;
   VkSemaphore signal_semaphore;
   GArray *wait_semaphores;
   GskVulkanBuffer *vertex_data;
@@ -220,6 +221,21 @@ gsk_vulkan_render_pass_new (GdkVulkanContext      *context,
                                       NULL,
                                       &self->render_pass);
 
+  GSK_VK_CHECK (vkCreateFramebuffer, gdk_vulkan_context_get_device (self->vulkan),
+                                     &(VkFramebufferCreateInfo) {
+                                         .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
+                                         .renderPass = self->render_pass,
+                                         .attachmentCount = 1,
+                                         .pAttachments = (VkImageView[1]) {
+                                             gsk_vulkan_image_get_image_view (target)
+                                         },
+                                         .width = gsk_vulkan_image_get_width (target),
+                                         .height = gsk_vulkan_image_get_height (target),
+                                         .layers = 1
+                                     },
+                                     NULL,
+                                     &self->framebuffer);
+
   self->signal_semaphore = signal_semaphore;
   self->wait_semaphores = g_array_new (FALSE, FALSE, sizeof (VkSemaphore));
   self->vertex_data = NULL;
@@ -238,19 +254,19 @@ gsk_vulkan_render_pass_new (GdkVulkanContext      *context,
 void
 gsk_vulkan_render_pass_free (GskVulkanRenderPass *self)
 {
+  VkDevice device = gdk_vulkan_context_get_device (self->vulkan);
+
   g_array_unref (self->render_ops);
   g_object_unref (self->vulkan);
   g_object_unref (self->target);
   cairo_region_destroy (self->clip);
-  vkDestroyRenderPass (gdk_vulkan_context_get_device (self->vulkan),
-                       self->render_pass,
-                       NULL);
+  vkDestroyFramebuffer (device, self->framebuffer, NULL);
+  vkDestroyRenderPass (device, self->render_pass, NULL);
+
   if (self->vertex_data)
     gsk_vulkan_buffer_free (self->vertex_data);
   if (self->signal_semaphore != VK_NULL_HANDLE)
-    vkDestroySemaphore (gdk_vulkan_context_get_device (self->vulkan),
-                        self->signal_semaphore,
-                        NULL);
+    vkDestroySemaphore (device, self->signal_semaphore, NULL);
   g_array_unref (self->wait_semaphores);
 
   g_free (self);
@@ -2431,7 +2447,7 @@ gsk_vulkan_render_pass_draw (GskVulkanRenderPass *self,
                         &(VkRenderPassBeginInfo) {
                             .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
                             .renderPass = self->render_pass,
-                            .framebuffer = gsk_vulkan_render_get_framebuffer (render, self->target),
+                            .framebuffer = self->framebuffer,
                             .renderArea = { 
                                 { rect.x, rect.y },
                                 { rect.width, rect.height }