[gtk+/wip/matthiasc/renderpasses: 5/10] vulkan: shift data to the render pass
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/matthiasc/renderpasses: 5/10] vulkan: shift data to the render pass
- Date: Wed, 27 Sep 2017 03:42:43 +0000 (UTC)
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]