From d98991a0adb8ba2d7c0669fa3404e33fc4391da9 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Thu, 18 May 2023 23:10:16 +0200 Subject: [PATCH] vulkan: Set offsets when counting We can set the vertex offset while counting the data, this gets rid of the need of passing all the counting machinery into the actual data collection code. --- gsk/vulkan/gskvulkanrenderpass.c | 283 +++++++++++++------------------ 1 file changed, 114 insertions(+), 169 deletions(-) diff --git a/gsk/vulkan/gskvulkanrenderpass.c b/gsk/vulkan/gskvulkanrenderpass.c index 321ba9b0cd..97774ac595 100644 --- a/gsk/vulkan/gskvulkanrenderpass.c +++ b/gsk/vulkan/gskvulkanrenderpass.c @@ -1625,7 +1625,7 @@ static gsize gsk_vulkan_render_pass_count_vertex_data (GskVulkanRenderPass *self) { GskVulkanOp *op; - gsize n_bytes; + gsize n_bytes, vertex_stride; guint i; n_bytes = 0; @@ -1650,13 +1650,17 @@ gsk_vulkan_render_pass_count_vertex_data (GskVulkanRenderPass *self) case GSK_VULKAN_OP_OUTSET_SHADOW: case GSK_VULKAN_OP_CROSS_FADE: case GSK_VULKAN_OP_BLEND_MODE: - op->render.vertex_count = gsk_vulkan_pipeline_get_vertex_stride (op->render.pipeline); + vertex_stride = gsk_vulkan_pipeline_get_vertex_stride (op->render.pipeline); + op->render.vertex_offset = n_bytes; + op->render.vertex_count = vertex_stride; n_bytes += op->render.vertex_count; break; case GSK_VULKAN_OP_TEXT: case GSK_VULKAN_OP_COLOR_TEXT: - op->text.vertex_count = gsk_vulkan_pipeline_get_vertex_stride (op->render.pipeline) * op->text.num_glyphs; + vertex_stride = gsk_vulkan_pipeline_get_vertex_stride (op->render.pipeline); + op->text.vertex_offset = n_bytes; + op->text.vertex_count = vertex_stride * op->text.num_glyphs; n_bytes += op->text.vertex_count; break; @@ -1674,14 +1678,11 @@ gsk_vulkan_render_pass_count_vertex_data (GskVulkanRenderPass *self) static void gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self, GskVulkanRender *render, - guchar *data, - gsize total) + guchar *data) { GskVulkanOp *op; - gsize offset; guint i; - offset = 0; for (i = 0; i < self->render_ops->len; i++) { op = &g_array_index (self->render_ops, GskVulkanOp, i); @@ -1692,98 +1693,74 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self, case GSK_VULKAN_OP_FALLBACK_CLIP: case GSK_VULKAN_OP_FALLBACK_ROUNDED_CLIP: case GSK_VULKAN_OP_TEXTURE: - { - op->render.vertex_offset = offset; - gsk_vulkan_texture_pipeline_collect_vertex_data (GSK_VULKAN_TEXTURE_PIPELINE (op->render.pipeline), - data + offset, - &op->render.offset, - &op->render.node->bounds, - &op->render.source_rect); - offset += op->render.vertex_count; - } + gsk_vulkan_texture_pipeline_collect_vertex_data (GSK_VULKAN_TEXTURE_PIPELINE (op->render.pipeline), + data + op->render.vertex_offset, + &op->render.offset, + &op->render.node->bounds, + &op->render.source_rect); break; case GSK_VULKAN_OP_REPEAT: - { - op->render.vertex_offset = offset; - gsk_vulkan_texture_pipeline_collect_vertex_data (GSK_VULKAN_TEXTURE_PIPELINE (op->render.pipeline), - data + offset, - &op->render.offset, - &op->render.node->bounds, - &op->render.source_rect); - offset += op->render.vertex_count; - } + gsk_vulkan_texture_pipeline_collect_vertex_data (GSK_VULKAN_TEXTURE_PIPELINE (op->render.pipeline), + data + op->render.vertex_offset, + &op->render.offset, + &op->render.node->bounds, + &op->render.source_rect); break; case GSK_VULKAN_OP_TEXT: - { - op->text.vertex_offset = offset; - gsk_vulkan_text_pipeline_collect_vertex_data (GSK_VULKAN_TEXT_PIPELINE (op->text.pipeline), - data + offset, - GSK_VULKAN_RENDERER (gsk_vulkan_render_get_renderer (render)), - &op->text.node->bounds, - (PangoFont *)gsk_text_node_get_font (op->text.node), - gsk_text_node_get_num_glyphs (op->text.node), - gsk_text_node_get_glyphs (op->text.node, NULL), - gsk_text_node_get_color (op->text.node), - &GRAPHENE_POINT_INIT ( - gsk_text_node_get_offset (op->text.node)->x + op->render.offset.x, - gsk_text_node_get_offset (op->text.node)->y + op->render.offset.y - ), - op->text.start_glyph, - op->text.num_glyphs, - op->text.scale); - offset += op->text.vertex_count; - } + gsk_vulkan_text_pipeline_collect_vertex_data (GSK_VULKAN_TEXT_PIPELINE (op->text.pipeline), + data + op->text.vertex_offset, + GSK_VULKAN_RENDERER (gsk_vulkan_render_get_renderer (render)), + &op->text.node->bounds, + (PangoFont *)gsk_text_node_get_font (op->text.node), + gsk_text_node_get_num_glyphs (op->text.node), + gsk_text_node_get_glyphs (op->text.node, NULL), + gsk_text_node_get_color (op->text.node), + &GRAPHENE_POINT_INIT ( + gsk_text_node_get_offset (op->text.node)->x + op->render.offset.x, + gsk_text_node_get_offset (op->text.node)->y + op->render.offset.y + ), + op->text.start_glyph, + op->text.num_glyphs, + op->text.scale); break; case GSK_VULKAN_OP_COLOR_TEXT: - { - op->text.vertex_offset = offset; - gsk_vulkan_color_text_pipeline_collect_vertex_data (GSK_VULKAN_COLOR_TEXT_PIPELINE (op->text.pipeline), - data + offset, - GSK_VULKAN_RENDERER (gsk_vulkan_render_get_renderer (render)), - &op->text.node->bounds, - (PangoFont *)gsk_text_node_get_font (op->text.node), - gsk_text_node_get_num_glyphs (op->text.node), - gsk_text_node_get_glyphs (op->text.node, NULL), - &GRAPHENE_POINT_INIT ( - gsk_text_node_get_offset (op->text.node)->x + op->render.offset.x, - gsk_text_node_get_offset (op->text.node)->y + op->render.offset.y - ), - op->text.start_glyph, - op->text.num_glyphs, - op->text.scale); - offset += op->text.vertex_count; - } + gsk_vulkan_color_text_pipeline_collect_vertex_data (GSK_VULKAN_COLOR_TEXT_PIPELINE (op->text.pipeline), + data + op->text.vertex_offset, + GSK_VULKAN_RENDERER (gsk_vulkan_render_get_renderer (render)), + &op->text.node->bounds, + (PangoFont *)gsk_text_node_get_font (op->text.node), + gsk_text_node_get_num_glyphs (op->text.node), + gsk_text_node_get_glyphs (op->text.node, NULL), + &GRAPHENE_POINT_INIT ( + gsk_text_node_get_offset (op->text.node)->x + op->render.offset.x, + gsk_text_node_get_offset (op->text.node)->y + op->render.offset.y + ), + op->text.start_glyph, + op->text.num_glyphs, + op->text.scale); break; case GSK_VULKAN_OP_COLOR: - { - op->render.vertex_offset = offset; - gsk_vulkan_color_pipeline_collect_vertex_data (GSK_VULKAN_COLOR_PIPELINE (op->render.pipeline), - data + offset, - &op->render.offset, - &op->render.node->bounds, - gsk_color_node_get_color (op->render.node)); - offset += op->render.vertex_count; - } + gsk_vulkan_color_pipeline_collect_vertex_data (GSK_VULKAN_COLOR_PIPELINE (op->render.pipeline), + data + op->render.vertex_offset, + &op->render.offset, + &op->render.node->bounds, + gsk_color_node_get_color (op->render.node)); break; case GSK_VULKAN_OP_LINEAR_GRADIENT: - { - op->render.vertex_offset = offset; - gsk_vulkan_linear_gradient_pipeline_collect_vertex_data (GSK_VULKAN_LINEAR_GRADIENT_PIPELINE (op->render.pipeline), - data + offset, - &op->render.offset, - &op->render.node->bounds, - gsk_linear_gradient_node_get_start (op->render.node), - gsk_linear_gradient_node_get_end (op->render.node), - gsk_render_node_get_node_type (op->render.node) == GSK_REPEATING_LINEAR_GRADIENT_NODE, - gsk_linear_gradient_node_get_n_color_stops (op->render.node), - gsk_linear_gradient_node_get_color_stops (op->render.node, NULL)); - offset += op->render.vertex_count; - } + gsk_vulkan_linear_gradient_pipeline_collect_vertex_data (GSK_VULKAN_LINEAR_GRADIENT_PIPELINE (op->render.pipeline), + data + op->render.vertex_offset, + &op->render.offset, + &op->render.node->bounds, + gsk_linear_gradient_node_get_start (op->render.node), + gsk_linear_gradient_node_get_end (op->render.node), + gsk_render_node_get_node_type (op->render.node) == GSK_REPEATING_LINEAR_GRADIENT_NODE, + gsk_linear_gradient_node_get_n_color_stops (op->render.node), + gsk_linear_gradient_node_get_color_stops (op->render.node, NULL)); break; case GSK_VULKAN_OP_OPACITY: @@ -1799,117 +1776,87 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self, 0.0, 0.0, 0.0, gsk_opacity_node_get_opacity (op->render.node) }); graphene_vec4_init (&color_offset, 0.0, 0.0, 0.0, 0.0); - op->render.vertex_offset = offset; gsk_vulkan_effect_pipeline_collect_vertex_data (GSK_VULKAN_EFFECT_PIPELINE (op->render.pipeline), - data + offset, + data + op->render.vertex_offset, &op->render.offset, &op->render.node->bounds, &op->render.source_rect, &color_matrix, &color_offset); - offset += op->render.vertex_count; } break; case GSK_VULKAN_OP_BLUR: - { - op->render.vertex_offset = offset; - gsk_vulkan_blur_pipeline_collect_vertex_data (GSK_VULKAN_BLUR_PIPELINE (op->render.pipeline), - data + offset, - &op->render.offset, - &op->render.node->bounds, - &op->render.source_rect, - gsk_blur_node_get_radius (op->render.node)); - offset += op->render.vertex_count; - } + gsk_vulkan_blur_pipeline_collect_vertex_data (GSK_VULKAN_BLUR_PIPELINE (op->render.pipeline), + data + op->render.vertex_offset, + &op->render.offset, + &op->render.node->bounds, + &op->render.source_rect, + gsk_blur_node_get_radius (op->render.node)); break; case GSK_VULKAN_OP_COLOR_MATRIX: - { - op->render.vertex_offset = offset; - gsk_vulkan_effect_pipeline_collect_vertex_data (GSK_VULKAN_EFFECT_PIPELINE (op->render.pipeline), - data + offset, - &op->render.offset, - &op->render.node->bounds, - &op->render.source_rect, - gsk_color_matrix_node_get_color_matrix (op->render.node), - gsk_color_matrix_node_get_color_offset (op->render.node)); - offset += op->render.vertex_count; - } + gsk_vulkan_effect_pipeline_collect_vertex_data (GSK_VULKAN_EFFECT_PIPELINE (op->render.pipeline), + data + op->render.vertex_offset, + &op->render.offset, + &op->render.node->bounds, + &op->render.source_rect, + gsk_color_matrix_node_get_color_matrix (op->render.node), + gsk_color_matrix_node_get_color_offset (op->render.node)); break; case GSK_VULKAN_OP_BORDER: - { - op->render.vertex_offset = offset; - gsk_vulkan_border_pipeline_collect_vertex_data (GSK_VULKAN_BORDER_PIPELINE (op->render.pipeline), - data + offset, - &op->render.offset, - gsk_border_node_get_outline (op->render.node), - gsk_border_node_get_widths (op->render.node), - gsk_border_node_get_colors (op->render.node)); - offset += op->render.vertex_count; - } + gsk_vulkan_border_pipeline_collect_vertex_data (GSK_VULKAN_BORDER_PIPELINE (op->render.pipeline), + data + op->render.vertex_offset, + &op->render.offset, + gsk_border_node_get_outline (op->render.node), + gsk_border_node_get_widths (op->render.node), + gsk_border_node_get_colors (op->render.node)); break; case GSK_VULKAN_OP_INSET_SHADOW: - { - op->render.vertex_offset = offset; - gsk_vulkan_box_shadow_pipeline_collect_vertex_data (GSK_VULKAN_BOX_SHADOW_PIPELINE (op->render.pipeline), - data + offset, - &op->render.offset, - gsk_inset_shadow_node_get_outline (op->render.node), - gsk_inset_shadow_node_get_color (op->render.node), - gsk_inset_shadow_node_get_dx (op->render.node), - gsk_inset_shadow_node_get_dy (op->render.node), - gsk_inset_shadow_node_get_spread (op->render.node), - gsk_inset_shadow_node_get_blur_radius (op->render.node)); - offset += op->render.vertex_count; - } + gsk_vulkan_box_shadow_pipeline_collect_vertex_data (GSK_VULKAN_BOX_SHADOW_PIPELINE (op->render.pipeline), + data + op->render.vertex_offset, + &op->render.offset, + gsk_inset_shadow_node_get_outline (op->render.node), + gsk_inset_shadow_node_get_color (op->render.node), + gsk_inset_shadow_node_get_dx (op->render.node), + gsk_inset_shadow_node_get_dy (op->render.node), + gsk_inset_shadow_node_get_spread (op->render.node), + gsk_inset_shadow_node_get_blur_radius (op->render.node)); break; case GSK_VULKAN_OP_OUTSET_SHADOW: - { - op->render.vertex_offset = offset; - gsk_vulkan_box_shadow_pipeline_collect_vertex_data (GSK_VULKAN_BOX_SHADOW_PIPELINE (op->render.pipeline), - data + offset, - &op->render.offset, - gsk_outset_shadow_node_get_outline (op->render.node), - gsk_outset_shadow_node_get_color (op->render.node), - gsk_outset_shadow_node_get_dx (op->render.node), - gsk_outset_shadow_node_get_dy (op->render.node), - gsk_outset_shadow_node_get_spread (op->render.node), - gsk_outset_shadow_node_get_blur_radius (op->render.node)); - offset += op->render.vertex_count; - } + gsk_vulkan_box_shadow_pipeline_collect_vertex_data (GSK_VULKAN_BOX_SHADOW_PIPELINE (op->render.pipeline), + data + op->render.vertex_offset, + &op->render.offset, + gsk_outset_shadow_node_get_outline (op->render.node), + gsk_outset_shadow_node_get_color (op->render.node), + gsk_outset_shadow_node_get_dx (op->render.node), + gsk_outset_shadow_node_get_dy (op->render.node), + gsk_outset_shadow_node_get_spread (op->render.node), + gsk_outset_shadow_node_get_blur_radius (op->render.node)); break; case GSK_VULKAN_OP_CROSS_FADE: - { - op->render.vertex_offset = offset; - gsk_vulkan_cross_fade_pipeline_collect_vertex_data (GSK_VULKAN_CROSS_FADE_PIPELINE (op->render.pipeline), - data + offset, - &op->render.offset, - &op->render.node->bounds, - &op->render.source_rect, - &op->render.source2_rect, - gsk_cross_fade_node_get_progress (op->render.node)); - offset += op->render.vertex_count; - } + gsk_vulkan_cross_fade_pipeline_collect_vertex_data (GSK_VULKAN_CROSS_FADE_PIPELINE (op->render.pipeline), + data + op->render.vertex_offset, + &op->render.offset, + &op->render.node->bounds, + &op->render.source_rect, + &op->render.source2_rect, + gsk_cross_fade_node_get_progress (op->render.node)); break; case GSK_VULKAN_OP_BLEND_MODE: - { - op->render.vertex_offset = offset; - gsk_vulkan_blend_mode_pipeline_collect_vertex_data (GSK_VULKAN_BLEND_MODE_PIPELINE (op->render.pipeline), - data + offset, - &op->render.offset, - &op->render.node->bounds, - &op->render.source_rect, - &op->render.source2_rect, - gsk_blend_node_get_blend_mode (op->render.node)); - offset += op->render.vertex_count; - } + gsk_vulkan_blend_mode_pipeline_collect_vertex_data (GSK_VULKAN_BLEND_MODE_PIPELINE (op->render.pipeline), + data + op->render.vertex_offset, + &op->render.offset, + &op->render.node->bounds, + &op->render.source_rect, + &op->render.source2_rect, + gsk_blend_node_get_blend_mode (op->render.node)); break; default: @@ -1917,8 +1864,6 @@ gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self, case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS: continue; } - - g_assert (offset <= total); } } @@ -1937,7 +1882,7 @@ gsk_vulkan_render_pass_get_vertex_data (GskVulkanRenderPass *self, self->vertex_data = gsk_vulkan_buffer_new (self->vulkan, n_bytes); data = gsk_vulkan_buffer_map (self->vertex_data); - gsk_vulkan_render_pass_collect_vertex_data (self, render, data, n_bytes); + gsk_vulkan_render_pass_collect_vertex_data (self, render, data); gsk_vulkan_buffer_unmap (self->vertex_data); } -- 2.30.2