vulkan: Put the framebuffer in the renderpass
... instead of having fancy caching. That caching is complicated and it's not necessary.
This commit is contained in:
@@ -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]);
|
||||
|
||||
|
||||
@@ -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 }
|
||||
|
||||
Reference in New Issue
Block a user