[gtk+/wip/matthiasc/renderpasses: 5/10] vulkan: shift data to the render pass



commit 85b37c4289efd04cdfccbfd5b46066aefa53fd3e
Author: Matthias Clasen <mclasen redhat com>
Date:   Mon Sep 25 22:43:40 2017 -0400

    vulkan: shift data to the render pass
    
    Move target, clip, scale_factor to be per-renderpass object.
    This is moving us closer to the point where we can have multiple
    render passes.

 gsk/gskvulkanrender.c |  121 ++++++++++++++++++++++++++++++++-----------------
 1 files changed, 80 insertions(+), 41 deletions(-)
---
diff --git a/gsk/gskvulkanrender.c b/gsk/gskvulkanrender.c
index f87f4cc..ad10adf 100644
--- a/gsk/gskvulkanrender.c
+++ b/gsk/gskvulkanrender.c
@@ -61,6 +61,31 @@ struct _GskVulkanRender
   GSList *cleanup_images;
 };
 
+typedef struct {
+  GskVulkanRender *render;
+  GskVulkanRenderPass *pass;
+  GskVulkanImage *target;
+  cairo_region_t *clip;
+  int scale_factor;
+  VkRenderPass render_pass;
+  gboolean own_render_pass;
+} RenderPassData;
+
+static void
+render_pass_data_free (gpointer v)
+{
+  RenderPassData *data = v;
+
+  gsk_vulkan_render_pass_free (data->pass);
+  g_object_unref (data->target);
+  cairo_region_destroy (data->clip);
+  if (data->render_pass != data->render->render_pass)
+    vkDestroyRenderPass (gdk_vulkan_context_get_device (data->render->vulkan),
+                         data->render_pass,
+                         NULL);
+  g_free (data);
+}
+
 static void
 gsk_vulkan_render_setup (GskVulkanRender       *self,
                          GskVulkanImage        *target,
@@ -285,11 +310,19 @@ void
 gsk_vulkan_render_add_node (GskVulkanRender *self,
                             GskRenderNode   *node)
 {
-  GskVulkanRenderPass *pass = gsk_vulkan_render_pass_new (self->vulkan);
+  RenderPassData *data;
+
+  data = g_new0 (RenderPassData, 1);
+  data->pass = gsk_vulkan_render_pass_new (self->vulkan);
+  data->target = g_object_ref (self->target);
+  data->render = self;
+  data->scale_factor = self->scale_factor;
+  data->clip = cairo_region_copy (self->clip);
+  data->render_pass = self->render_pass;
 
-  self->render_passes = g_slist_prepend (self->render_passes, pass);
+  self->render_passes = g_slist_prepend (self->render_passes, data);
 
-  gsk_vulkan_render_pass_add (pass,
+  gsk_vulkan_render_pass_add (data->pass,
                               self,
                               &self->mvp,
                               &GRAPHENE_RECT_INIT (
@@ -305,8 +338,10 @@ gsk_vulkan_render_upload (GskVulkanRender *self)
   GSList *l;
 
   for (l = self->render_passes; l; l = l->next)
+
     {
-      gsk_vulkan_render_pass_upload (l->data, self, self->uploader);
+      RenderPassData *data = l->data;
+      gsk_vulkan_render_pass_upload (data->pass, self, self->uploader);
     }
 
   gsk_vulkan_uploader_upload (self->uploader);
@@ -321,7 +356,8 @@ gsk_vulkan_renderer_count_vertex_data (GskVulkanRender *self)
   n_bytes = 0;
   for (l = self->render_passes; l; l = l->next)
     {
-      n_bytes += gsk_vulkan_render_pass_count_vertex_data (l->data);
+      RenderPassData *data = l->data;
+      n_bytes += gsk_vulkan_render_pass_count_vertex_data (data->pass);
     }
 
   return n_bytes;
@@ -342,7 +378,8 @@ gsk_vulkan_render_collect_vertex_data (GskVulkanRender *self)
 
   for (l = self->render_passes; l; l = l->next)
     {
-      offset += gsk_vulkan_render_pass_collect_vertex_data (l->data, self, data, offset, n_bytes - offset);
+      RenderPassData *pass = l->data;
+      offset += gsk_vulkan_render_pass_collect_vertex_data (pass->pass, self, data, offset, n_bytes - 
offset);
       g_assert (offset <= n_bytes);
     }
 
@@ -448,7 +485,8 @@ gsk_vulkan_render_prepare_descriptor_sets (GskVulkanRender *self,
 
   for (l = self->render_passes; l; l = l->next)
     {
-      gsk_vulkan_render_pass_reserve_descriptor_sets (l->data, self);
+      RenderPassData *data = l->data;
+      gsk_vulkan_render_pass_reserve_descriptor_sets (data->pass, self);
     }
   
   needed_sets = g_hash_table_size (self->descriptor_set_indexes);
@@ -556,42 +594,43 @@ gsk_vulkan_render_draw (GskVulkanRender   *self,
                       .maxDepth = 1
                     });
 
-  for (i = 0; i < cairo_region_num_rectangles (self->clip); i++)
+  for (l = self->render_passes; l; l = l->next)
     {
-      cairo_rectangle_int_t rect;
-
-      cairo_region_get_rectangle (self->clip, i, &rect);
-
-      vkCmdSetScissor (command_buffer,
-                       0,
-                       1,
-                       &(VkRect2D) {
-                           { rect.x * self->scale_factor, rect.y * self->scale_factor },
-                           { rect.width * self->scale_factor, rect.height * self->scale_factor }
-                       });
-
-      vkCmdBeginRenderPass (command_buffer,
-                            &(VkRenderPassBeginInfo) {
-                                .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
-                                .renderPass = self->render_pass,
-                                .framebuffer = gsk_vulkan_render_get_framebuffer (self, self->target),
-                                .renderArea = { 
-                                    { rect.x * self->scale_factor, rect.y * self->scale_factor },
-                                    { rect.width * self->scale_factor, rect.height * self->scale_factor }
-                                },
-                                .clearValueCount = 1,
-                                .pClearValues = (VkClearValue [1]) {
-                                    { .color = { .float32 = { 0.f, 0.f, 0.f, 0.f } } }
-                                }
-                            },
-                            VK_SUBPASS_CONTENTS_INLINE);
-
-      for (l = self->render_passes; l; l = l->next)
+      RenderPassData *pass = l->data;
+      for (i = 0; i < cairo_region_num_rectangles (pass->clip); i++)
         {
-          gsk_vulkan_render_pass_draw (l->data, self, self->vertex_buffer, 3, self->pipeline_layout, 
command_buffer);
-        }
+          cairo_rectangle_int_t rect;
+
+          cairo_region_get_rectangle (pass->clip, i, &rect);
+
+          vkCmdSetScissor (command_buffer,
+                           0,
+                           1,
+                           &(VkRect2D) {
+                                { rect.x * pass->scale_factor, rect.y * pass->scale_factor },
+                                { rect.width * pass->scale_factor, rect.height * pass->scale_factor }
+                           });
+
+          vkCmdBeginRenderPass (command_buffer,
+                                &(VkRenderPassBeginInfo) {
+                                    .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
+                                    .renderPass = pass->render_pass,
+                                    .framebuffer = gsk_vulkan_render_get_framebuffer (self, pass->target),
+                                    .renderArea = { 
+                                        { rect.x * pass->scale_factor, rect.y * pass->scale_factor },
+                                        { rect.width * pass->scale_factor, rect.height * pass->scale_factor }
+                                    },
+                                    .clearValueCount = 1,
+                                    .pClearValues = (VkClearValue [1]) {
+                                        { .color = { .float32 = { 0.f, 0.f, 0.f, 0.f } } }
+                                     }
+                                },
+                                VK_SUBPASS_CONTENTS_INLINE);
 
-      vkCmdEndRenderPass (command_buffer);
+          gsk_vulkan_render_pass_draw (pass->pass, self, self->vertex_buffer, 3, self->pipeline_layout, 
command_buffer);
+
+          vkCmdEndRenderPass (command_buffer);
+        }
     }
 
   gsk_vulkan_command_pool_submit_buffer (self->command_pool, command_buffer, self->fence);
@@ -641,7 +680,7 @@ gsk_vulkan_render_cleanup (GskVulkanRender *self)
                                        self->descriptor_pool,
                                        0);
 
-  g_slist_free_full (self->render_passes, (GDestroyNotify) gsk_vulkan_render_pass_free);
+  g_slist_free_full (self->render_passes, (GDestroyNotify) render_pass_data_free);
   self->render_passes = NULL;
   g_slist_free_full (self->cleanup_images, g_object_unref);
   self->cleanup_images = NULL;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]