graphene_rect_t viewport;
cairo_region_t *clip;
- GHashTable *framebuffers;
GskVulkanCommandPool *command_pool;
VkFence fence;
VkRenderPass render_pass;
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);
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)
{
void
gsk_vulkan_render_free (GskVulkanRender *self)
{
- GHashTableIter iter;
- gpointer key, value;
VkDevice device;
guint i;
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]);
graphene_vec2_t scale;
VkRenderPass render_pass;
+ VkFramebuffer framebuffer;
VkSemaphore signal_semaphore;
GArray *wait_semaphores;
GskVulkanBuffer *vertex_data;
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;
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);
&(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 }