From fcf65c7caa4ed04d2d98fd1de64bffe74f23e1b9 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Thu, 13 Jul 2023 14:30:16 +0200 Subject: [PATCH] vulkan: Fold functions into only caller Now that the VulkanOp does begin/end of render passes, there's no need to have a renderpass function for it anymore. --- gsk/vulkan/gskvulkanrenderpass.c | 74 +------------------------ gsk/vulkan/gskvulkanrenderpassop.c | 48 +++++++++++++++- gsk/vulkan/gskvulkanrenderpassprivate.h | 12 +--- 3 files changed, 47 insertions(+), 87 deletions(-) diff --git a/gsk/vulkan/gskvulkanrenderpass.c b/gsk/vulkan/gskvulkanrenderpass.c index a6d954c6f8..f3cdb72edf 100644 --- a/gsk/vulkan/gskvulkanrenderpass.c +++ b/gsk/vulkan/gskvulkanrenderpass.c @@ -50,8 +50,6 @@ struct _GskVulkanRenderPass cairo_region_t *clip; graphene_vec2_t scale; - - VkRenderPass render_pass; }; struct _GskVulkanParseState @@ -76,8 +74,7 @@ gsk_vulkan_render_pass_new (GdkVulkanContext *context, const graphene_vec2_t *scale, const graphene_rect_t *viewport, cairo_region_t *clip, - GskRenderNode *node, - gboolean is_root) + GskRenderNode *node) { GskVulkanRenderPass *self; @@ -89,23 +86,6 @@ gsk_vulkan_render_pass_new (GdkVulkanContext *context, self->viewport = *viewport; graphene_vec2_init_from_vec2 (&self->scale, scale); - if (is_root) - { - /* this is a swapchain target */ - self->render_pass = gsk_vulkan_render_get_render_pass (render, - gsk_vulkan_image_get_vk_format (target), - VK_IMAGE_LAYOUT_UNDEFINED, - VK_IMAGE_LAYOUT_PRESENT_SRC_KHR); - } - else - { - /* this is an offscreen */ - self->render_pass = gsk_vulkan_render_get_render_pass (render, - gsk_vulkan_image_get_vk_format (target), - VK_IMAGE_LAYOUT_UNDEFINED, - VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); - } - #ifdef G_ENABLE_DEBUG if (fallback_pixels_quark == 0) { @@ -1344,55 +1324,3 @@ gsk_vulkan_render_pass_add (GskVulkanRenderPass *self, gsk_vulkan_render_pass_add_node (self, render, &state, node); } - -VkRenderPass -gsk_vulkan_render_pass_begin_draw (GskVulkanRenderPass *self, - GskVulkanRender *render, - VkPipelineLayout pipeline_layout, - VkCommandBuffer command_buffer) -{ - cairo_rectangle_int_t rect; - - vkCmdSetViewport (command_buffer, - 0, - 1, - &(VkViewport) { - .x = 0, - .y = 0, - .width = self->viewport.size.width, - .height = self->viewport.size.height, - .minDepth = 0, - .maxDepth = 1 - }); - - cairo_region_get_extents (self->clip, &rect); - - vkCmdBeginRenderPass (command_buffer, - &(VkRenderPassBeginInfo) { - .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, - .renderPass = self->render_pass, - .framebuffer = gsk_vulkan_image_get_framebuffer (self->target, - self->render_pass), - .renderArea = { - { rect.x, rect.y }, - { rect.width, rect.height } - }, - .clearValueCount = 1, - .pClearValues = (VkClearValue [1]) { - { .color = { .float32 = { 0.f, 0.f, 0.f, 0.f } } } - } - }, - VK_SUBPASS_CONTENTS_INLINE); - - return self->render_pass; -} - -void -gsk_vulkan_render_pass_end_draw (GskVulkanRenderPass *self, - GskVulkanRender *render, - VkPipelineLayout pipeline_layout, - VkCommandBuffer command_buffer) -{ - vkCmdEndRenderPass (command_buffer); -} - diff --git a/gsk/vulkan/gskvulkanrenderpassop.c b/gsk/vulkan/gskvulkanrenderpassop.c index 5614f0eee3..5ae365da8a 100644 --- a/gsk/vulkan/gskvulkanrenderpassop.c +++ b/gsk/vulkan/gskvulkanrenderpassop.c @@ -15,6 +15,11 @@ struct _GskVulkanRenderPassOp GskVulkanImage *image; GskVulkanRenderPass *render_pass; + cairo_rectangle_int_t area; + graphene_size_t viewport_size; + + VkImageLayout initial_layout; + VkImageLayout final_layout; }; static void @@ -77,7 +82,40 @@ gsk_vulkan_render_pass_op_command (GskVulkanOp *op, const char *current_pipeline_clip_type = NULL; VkRenderPass vk_render_pass; - vk_render_pass = gsk_vulkan_render_pass_begin_draw (self->render_pass, render, pipeline_layout, command_buffer); + vk_render_pass = gsk_vulkan_render_get_render_pass (render, + gsk_vulkan_image_get_vk_format (self->image), + self->initial_layout, + self->final_layout); + + + vkCmdSetViewport (command_buffer, + 0, + 1, + &(VkViewport) { + .x = 0, + .y = 0, + .width = self->viewport_size.width, + .height = self->viewport_size.height, + .minDepth = 0, + .maxDepth = 1 + }); + + vkCmdBeginRenderPass (command_buffer, + &(VkRenderPassBeginInfo) { + .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, + .renderPass = vk_render_pass, + .framebuffer = gsk_vulkan_image_get_framebuffer (self->image, + vk_render_pass), + .renderArea = { + { self->area.x, self->area.y }, + { self->area.width, self->area.height } + }, + .clearValueCount = 1, + .pClearValues = (VkClearValue [1]) { + { .color = { .float32 = { 0.f, 0.f, 0.f, 0.f } } } + } + }, + VK_SUBPASS_CONTENTS_INLINE); op = op->next; while (op->op_class->stage != GSK_VULKAN_STAGE_END_PASS) @@ -216,6 +254,11 @@ gsk_vulkan_render_pass_op (GskVulkanRender *render, self = (GskVulkanRenderPassOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_RENDER_PASS_OP_CLASS); self->image = image; + self->initial_layout = VK_IMAGE_LAYOUT_UNDEFINED; + self->final_layout = is_root ? VK_IMAGE_LAYOUT_PRESENT_SRC_KHR + :VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + cairo_region_get_extents (clip, &self->area); + self->viewport_size = viewport->size; self->render_pass = gsk_vulkan_render_pass_new (context, render, @@ -223,8 +266,7 @@ gsk_vulkan_render_pass_op (GskVulkanRender *render, scale, viewport, clip, - node, - is_root); + node); /* This invalidates the self pointer */ gsk_vulkan_render_pass_add (self->render_pass, render, node); diff --git a/gsk/vulkan/gskvulkanrenderpassprivate.h b/gsk/vulkan/gskvulkanrenderpassprivate.h index 3625dea3f4..08505e8b62 100644 --- a/gsk/vulkan/gskvulkanrenderpassprivate.h +++ b/gsk/vulkan/gskvulkanrenderpassprivate.h @@ -16,8 +16,7 @@ GskVulkanRenderPass * gsk_vulkan_render_pass_new (GdkVulk const graphene_vec2_t *scale, const graphene_rect_t *viewport, cairo_region_t *clip, - GskRenderNode *node, - gboolean is_root); + GskRenderNode *node); void gsk_vulkan_render_pass_free (GskVulkanRenderPass *self); @@ -25,14 +24,5 @@ void gsk_vulkan_render_pass_add (GskVulk GskVulkanRender *render, GskRenderNode *node); -VkRenderPass gsk_vulkan_render_pass_begin_draw (GskVulkanRenderPass *self, - GskVulkanRender *render, - VkPipelineLayout pipeline_layout, - VkCommandBuffer command_buffer); -void gsk_vulkan_render_pass_end_draw (GskVulkanRenderPass *self, - GskVulkanRender *render, - VkPipelineLayout pipeline_layout, - VkCommandBuffer command_buffer); - G_END_DECLS -- 2.30.2