From 35b09c727ad48604b42a505f9d12627f153b1c70 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sat, 17 Jun 2023 18:53:33 +0200 Subject: [PATCH] vulkan: Put the framebuffer in the renderpass ... instead of having fancy caching. That caching is complicated and it's not necessary. --- gsk/vulkan/gskvulkanrender.c | 70 -------------------------------- gsk/vulkan/gskvulkanrenderpass.c | 30 ++++++++++---- 2 files changed, 23 insertions(+), 77 deletions(-) diff --git a/gsk/vulkan/gskvulkanrender.c b/gsk/vulkan/gskvulkanrender.c index 99c20e5805..5776dd939c 100644 --- a/gsk/vulkan/gskvulkanrender.c +++ b/gsk/vulkan/gskvulkanrender.c @@ -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]); diff --git a/gsk/vulkan/gskvulkanrenderpass.c b/gsk/vulkan/gskvulkanrenderpass.c index b5a96eae7b..1c16db9604 100644 --- a/gsk/vulkan/gskvulkanrenderpass.c +++ b/gsk/vulkan/gskvulkanrenderpass.c @@ -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 } -- 2.30.2