From f366ccc0b2739a53277ca1c068d211f68b0d6825 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sat, 15 Jul 2023 11:39:18 +0200 Subject: [PATCH] vulkan: Introduce GskVulkanShaderOp It's the new base class for shaders now. We're doing deep inheritance now, woohoo! Also, port all the shader ops to it. --- gsk/meson.build | 1 + gsk/vulkan/gskvulkanblendmodeop.c | 42 ++++++--------- gsk/vulkan/gskvulkanblurop.c | 29 +++++----- gsk/vulkan/gskvulkanborderop.c | 37 +++++++------ gsk/vulkan/gskvulkanclearop.c | 4 +- gsk/vulkan/gskvulkancolormatrixop.c | 29 +++++----- gsk/vulkan/gskvulkancolorop.c | 29 +++++----- gsk/vulkan/gskvulkancrossfadeop.c | 29 +++++----- gsk/vulkan/gskvulkandownloadop.c | 6 +-- gsk/vulkan/gskvulkanglyphop.c | 29 +++++----- gsk/vulkan/gskvulkaninsetshadowop.c | 29 +++++----- gsk/vulkan/gskvulkanlineargradientop.c | 29 +++++----- gsk/vulkan/gskvulkanmaskop.c | 29 +++++----- gsk/vulkan/gskvulkanop.c | 60 +-------------------- gsk/vulkan/gskvulkanopprivate.h | 21 +------- gsk/vulkan/gskvulkanoutsetshadowop.c | 29 +++++----- gsk/vulkan/gskvulkanpushconstantsop.c | 6 +-- gsk/vulkan/gskvulkanrender.c | 19 ++++--- gsk/vulkan/gskvulkanrenderpassop.c | 34 +++--------- gsk/vulkan/gskvulkanrenderprivate.h | 2 +- gsk/vulkan/gskvulkanscissorop.c | 4 +- gsk/vulkan/gskvulkanshaderop.c | 73 ++++++++++++++++++++++++++ gsk/vulkan/gskvulkanshaderopprivate.h | 39 ++++++++++++++ gsk/vulkan/gskvulkantextureop.c | 29 +++++----- gsk/vulkan/gskvulkanuploadop.c | 18 ++----- 25 files changed, 341 insertions(+), 315 deletions(-) create mode 100644 gsk/vulkan/gskvulkanshaderop.c create mode 100644 gsk/vulkan/gskvulkanshaderopprivate.h diff --git a/gsk/meson.build b/gsk/meson.build index 74cf758ca3..5a86498679 100644 --- a/gsk/meson.build +++ b/gsk/meson.build @@ -133,6 +133,7 @@ if have_vulkan 'vulkan/gskvulkanrenderpass.c', 'vulkan/gskvulkanrenderpassop.c', 'vulkan/gskvulkanscissorop.c', + 'vulkan/gskvulkanshaderop.c', 'vulkan/gskvulkantextureop.c', 'vulkan/gskvulkanuploadop.c', ]) diff --git a/gsk/vulkan/gskvulkanblendmodeop.c b/gsk/vulkan/gskvulkanblendmodeop.c index c90ca935a8..81df72c6a3 100644 --- a/gsk/vulkan/gskvulkanblendmodeop.c +++ b/gsk/vulkan/gskvulkanblendmodeop.c @@ -3,6 +3,7 @@ #include "gskvulkanblendmodeopprivate.h" #include "gskvulkanprivate.h" +#include "gskvulkanshaderopprivate.h" #include "vulkan/resources/blend-mode.vert.h" @@ -10,7 +11,7 @@ typedef struct _GskVulkanBlendModeOp GskVulkanBlendModeOp; struct _GskVulkanBlendModeOp { - GskVulkanOp op; + GskVulkanShaderOp op; graphene_rect_t bounds; GskBlendMode blend_mode; @@ -50,7 +51,7 @@ gsk_vulkan_blend_mode_op_collect_vertex_data (GskVulkanOp *op, guchar *data) { GskVulkanBlendModeOp *self = (GskVulkanBlendModeOp *) op; - GskVulkanBlendModeInstance *instance = (GskVulkanBlendModeInstance *) (data + op->vertex_offset); + GskVulkanBlendModeInstance *instance = (GskVulkanBlendModeInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset); gsk_vulkan_rect_to_float (&self->bounds, instance->rect); gsk_vulkan_rect_to_float (&self->top.rect, instance->top_rect); @@ -77,32 +78,19 @@ gsk_vulkan_blend_mode_op_reserve_descriptor_sets (GskVulkanOp *op, GSK_VULKAN_SAMPLER_DEFAULT); } -static GskVulkanOp * -gsk_vulkan_blend_mode_op_command (GskVulkanOp *op, - GskVulkanRender *render, - VkPipelineLayout pipeline_layout, - VkCommandBuffer command_buffer) -{ - GskVulkanBlendModeOp *self = (GskVulkanBlendModeOp *) op; - - vkCmdDraw (command_buffer, - 6, 1, - 0, self->vertex_offset / gsk_vulkan_blend_mode_info.pVertexBindingDescriptions[0].stride); - - return op->next; -} - static const GskVulkanShaderOpClass GSK_VULKAN_BLEND_MODE_OP_CLASS = { - GSK_VULKAN_OP_SIZE (GskVulkanBlendModeOp), - GSK_VULKAN_STAGE_COMMAND, + { + GSK_VULKAN_OP_SIZE (GskVulkanBlendModeOp), + GSK_VULKAN_STAGE_COMMAND, + gsk_vulkan_blend_mode_op_finish, + gsk_vulkan_blend_mode_op_print, + gsk_vulkan_shader_op_count_vertex_data, + gsk_vulkan_blend_mode_op_collect_vertex_data, + gsk_vulkan_blend_mode_op_reserve_descriptor_sets, + gsk_vulkan_shader_op_command + }, "blend-mode", &gsk_vulkan_blend_mode_info, - gsk_vulkan_blend_mode_op_finish, - gsk_vulkan_blend_mode_op_print, - gsk_vulkan_op_draw_count_vertex_data, - gsk_vulkan_blend_mode_op_collect_vertex_data, - gsk_vulkan_blend_mode_op_reserve_descriptor_sets, - gsk_vulkan_op_draw_command }; void @@ -120,9 +108,9 @@ gsk_vulkan_blend_mode_op (GskVulkanRender *render, { GskVulkanBlendModeOp *self; - self = (GskVulkanBlendModeOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_BLEND_MODE_OP_CLASS); + self = (GskVulkanBlendModeOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_BLEND_MODE_OP_CLASS.parent_class); - ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type); + ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type); graphene_rect_offset_r (bounds, offset->x, offset->y, &self->bounds); self->blend_mode = blend_mode; diff --git a/gsk/vulkan/gskvulkanblurop.c b/gsk/vulkan/gskvulkanblurop.c index d81a913441..76719ccbaf 100644 --- a/gsk/vulkan/gskvulkanblurop.c +++ b/gsk/vulkan/gskvulkanblurop.c @@ -3,6 +3,7 @@ #include "gskvulkanbluropprivate.h" #include "gskvulkanprivate.h" +#include "gskvulkanshaderopprivate.h" #include "vulkan/resources/blur.vert.h" @@ -10,7 +11,7 @@ typedef struct _GskVulkanBlurOp GskVulkanBlurOp; struct _GskVulkanBlurOp { - GskVulkanOp op; + GskVulkanShaderOp op; GskVulkanImage *image; graphene_rect_t rect; @@ -47,7 +48,7 @@ gsk_vulkan_blur_op_collect_vertex_data (GskVulkanOp *op, guchar *data) { GskVulkanBlurOp *self = (GskVulkanBlurOp *) op; - GskVulkanBlurInstance *instance = (GskVulkanBlurInstance *) (data + op->vertex_offset); + GskVulkanBlurInstance *instance = (GskVulkanBlurInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset); gsk_vulkan_rect_to_float (&self->rect, instance->rect); gsk_vulkan_rect_to_float (&self->tex_rect, instance->tex_rect); @@ -66,17 +67,19 @@ gsk_vulkan_blur_op_reserve_descriptor_sets (GskVulkanOp *op, GSK_VULKAN_SAMPLER_DEFAULT); } -static const GskVulkanOpClass GSK_VULKAN_BLUR_OP_CLASS = { - GSK_VULKAN_OP_SIZE (GskVulkanBlurOp), - GSK_VULKAN_STAGE_COMMAND, +static const GskVulkanShaderOpClass GSK_VULKAN_BLUR_OP_CLASS = { + { + GSK_VULKAN_OP_SIZE (GskVulkanBlurOp), + GSK_VULKAN_STAGE_COMMAND, + gsk_vulkan_blur_op_finish, + gsk_vulkan_blur_op_print, + gsk_vulkan_shader_op_count_vertex_data, + gsk_vulkan_blur_op_collect_vertex_data, + gsk_vulkan_blur_op_reserve_descriptor_sets, + gsk_vulkan_shader_op_command + }, "blur", &gsk_vulkan_blur_info, - gsk_vulkan_blur_op_finish, - gsk_vulkan_blur_op_print, - gsk_vulkan_op_draw_count_vertex_data, - gsk_vulkan_blur_op_collect_vertex_data, - gsk_vulkan_blur_op_reserve_descriptor_sets, - gsk_vulkan_op_draw_command }; void @@ -92,9 +95,9 @@ gsk_vulkan_blur_op (GskVulkanRender *render, g_assert (radius > 0); - self = (GskVulkanBlurOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_BLUR_OP_CLASS); + self = (GskVulkanBlurOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_BLUR_OP_CLASS.parent_class); - ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type); + ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type); self->image = g_object_ref (image); graphene_rect_offset_r (rect, offset->x, offset->y, &self->rect); gsk_vulkan_normalize_tex_coords (&self->tex_rect, rect, tex_rect); diff --git a/gsk/vulkan/gskvulkanborderop.c b/gsk/vulkan/gskvulkanborderop.c index bb85cfaadc..2d157aea36 100644 --- a/gsk/vulkan/gskvulkanborderop.c +++ b/gsk/vulkan/gskvulkanborderop.c @@ -3,6 +3,7 @@ #include "gskvulkanborderopprivate.h" #include "gskvulkanprivate.h" +#include "gskvulkanshaderopprivate.h" #include "gsk/gskroundedrectprivate.h" #include "vulkan/resources/border.vert.h" @@ -11,7 +12,7 @@ typedef struct _GskVulkanBorderOp GskVulkanBorderOp; struct _GskVulkanBorderOp { - GskVulkanOp op; + GskVulkanShaderOp op; GskRoundedRect outline; float widths[4]; @@ -56,7 +57,7 @@ gsk_vulkan_border_op_collect_vertex_data (GskVulkanOp *op, guchar *data) { GskVulkanBorderOp *self = (GskVulkanBorderOp *) op; - GskVulkanBorderInstance *instance = (GskVulkanBorderInstance *) (data + op->vertex_offset); + GskVulkanBorderInstance *instance = (GskVulkanBorderInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset); guint i; gsk_rounded_rect_to_float (&self->outline, graphene_point_zero (), instance->rect); @@ -74,25 +75,27 @@ gsk_vulkan_border_op_reserve_descriptor_sets (GskVulkanOp *op, } static GskVulkanOp * -gsk_vulkan_border_op_command (GskVulkanOp *op, +gsk_vulkan_border_op_command (GskVulkanOp *op, GskVulkanRender *render, - VkPipelineLayout pipeline_layout, - VkCommandBuffer command_buffer) + VkRenderPass render_pass, + VkCommandBuffer command_buffer) { - return gsk_vulkan_op_draw_command_n (op, render, pipeline_layout, command_buffer, 8); + return gsk_vulkan_shader_op_command_n (op, render, render_pass, command_buffer, 8); } -static const GskVulkanOpClass GSK_VULKAN_BORDER_OP_CLASS = { - GSK_VULKAN_OP_SIZE (GskVulkanBorderOp), - GSK_VULKAN_STAGE_COMMAND, +static const GskVulkanShaderOpClass GSK_VULKAN_BORDER_OP_CLASS = { + { + GSK_VULKAN_OP_SIZE (GskVulkanBorderOp), + GSK_VULKAN_STAGE_COMMAND, + gsk_vulkan_border_op_finish, + gsk_vulkan_border_op_print, + gsk_vulkan_shader_op_count_vertex_data, + gsk_vulkan_border_op_collect_vertex_data, + gsk_vulkan_border_op_reserve_descriptor_sets, + gsk_vulkan_border_op_command + }, "border", &gsk_vulkan_border_info, - gsk_vulkan_border_op_finish, - gsk_vulkan_border_op_print, - gsk_vulkan_op_draw_count_vertex_data, - gsk_vulkan_border_op_collect_vertex_data, - gsk_vulkan_border_op_reserve_descriptor_sets, - gsk_vulkan_border_op_command }; void @@ -106,9 +109,9 @@ gsk_vulkan_border_op (GskVulkanRender *render, GskVulkanBorderOp *self; guint i; - self = (GskVulkanBorderOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_BORDER_OP_CLASS); + self = (GskVulkanBorderOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_BORDER_OP_CLASS.parent_class); - ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type); + ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type); self->outline = *outline; gsk_rounded_rect_offset (&self->outline, offset->x, offset->y); for (i = 0; i < 4; i++) diff --git a/gsk/vulkan/gskvulkanclearop.c b/gsk/vulkan/gskvulkanclearop.c index 193d10eee5..f8123bea2a 100644 --- a/gsk/vulkan/gskvulkanclearop.c +++ b/gsk/vulkan/gskvulkanclearop.c @@ -62,7 +62,7 @@ gsk_vulkan_init_clear_value (VkClearValue *value, static GskVulkanOp * gsk_vulkan_clear_op_command (GskVulkanOp *op, GskVulkanRender *render, - VkPipelineLayout pipeline_layout, + VkRenderPass render_pass, VkCommandBuffer command_buffer) { GskVulkanClearOp *self = (GskVulkanClearOp *) op; @@ -93,8 +93,6 @@ gsk_vulkan_clear_op_command (GskVulkanOp *op, static const GskVulkanOpClass GSK_VULKAN_SCISSOR_OP_CLASS = { GSK_VULKAN_OP_SIZE (GskVulkanClearOp), GSK_VULKAN_STAGE_COMMAND, - NULL, - NULL, gsk_vulkan_clear_op_finish, gsk_vulkan_clear_op_print, gsk_vulkan_clear_op_count_vertex_data, diff --git a/gsk/vulkan/gskvulkancolormatrixop.c b/gsk/vulkan/gskvulkancolormatrixop.c index ba126b47e8..f007ddfd4f 100644 --- a/gsk/vulkan/gskvulkancolormatrixop.c +++ b/gsk/vulkan/gskvulkancolormatrixop.c @@ -3,6 +3,7 @@ #include "gskvulkancolormatrixopprivate.h" #include "gskvulkanprivate.h" +#include "gskvulkanshaderopprivate.h" #include "vulkan/resources/color-matrix.vert.h" @@ -10,7 +11,7 @@ typedef struct _GskVulkanColorMatrixOp GskVulkanColorMatrixOp; struct _GskVulkanColorMatrixOp { - GskVulkanOp op; + GskVulkanShaderOp op; GskVulkanImage *image; graphene_matrix_t color_matrix; @@ -47,7 +48,7 @@ gsk_vulkan_color_matrix_op_collect_vertex_data (GskVulkanOp *op, guchar *data) { GskVulkanColorMatrixOp *self = (GskVulkanColorMatrixOp *) op; - GskVulkanColorMatrixInstance *instance = (GskVulkanColorMatrixInstance *) (data + op->vertex_offset); + GskVulkanColorMatrixInstance *instance = (GskVulkanColorMatrixInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset); instance->rect[0] = self->rect.origin.x; instance->rect[1] = self->rect.origin.y; @@ -73,17 +74,19 @@ gsk_vulkan_color_matrix_op_reserve_descriptor_sets (GskVulkanOp *op, GSK_VULKAN_SAMPLER_DEFAULT); } -static const GskVulkanOpClass GSK_VULKAN_COLOR_MATRIX_OP_CLASS = { - GSK_VULKAN_OP_SIZE (GskVulkanColorMatrixOp), - GSK_VULKAN_STAGE_COMMAND, +static const GskVulkanShaderOpClass GSK_VULKAN_COLOR_MATRIX_OP_CLASS = { + { + GSK_VULKAN_OP_SIZE (GskVulkanColorMatrixOp), + GSK_VULKAN_STAGE_COMMAND, + gsk_vulkan_color_matrix_op_finish, + gsk_vulkan_color_matrix_op_print, + gsk_vulkan_shader_op_count_vertex_data, + gsk_vulkan_color_matrix_op_collect_vertex_data, + gsk_vulkan_color_matrix_op_reserve_descriptor_sets, + gsk_vulkan_shader_op_command + }, "color-matrix", &gsk_vulkan_color_matrix_info, - gsk_vulkan_color_matrix_op_finish, - gsk_vulkan_color_matrix_op_print, - gsk_vulkan_op_draw_count_vertex_data, - gsk_vulkan_color_matrix_op_collect_vertex_data, - gsk_vulkan_color_matrix_op_reserve_descriptor_sets, - gsk_vulkan_op_draw_command }; void @@ -98,9 +101,9 @@ gsk_vulkan_color_matrix_op (GskVulkanRender *render, { GskVulkanColorMatrixOp *self; - self = (GskVulkanColorMatrixOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_COLOR_MATRIX_OP_CLASS); + self = (GskVulkanColorMatrixOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_COLOR_MATRIX_OP_CLASS.parent_class); - ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type); + ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type); self->image = g_object_ref (image); graphene_rect_offset_r (rect, offset->x, offset->y, &self->rect); gsk_vulkan_normalize_tex_coords (&self->tex_rect, rect, tex_rect); diff --git a/gsk/vulkan/gskvulkancolorop.c b/gsk/vulkan/gskvulkancolorop.c index f07a427a46..e5b5c21780 100644 --- a/gsk/vulkan/gskvulkancolorop.c +++ b/gsk/vulkan/gskvulkancolorop.c @@ -3,6 +3,7 @@ #include "gskvulkancoloropprivate.h" #include "gskvulkanprivate.h" +#include "gskvulkanshaderopprivate.h" #include "vulkan/resources/color.vert.h" @@ -10,7 +11,7 @@ typedef struct _GskVulkanColorOp GskVulkanColorOp; struct _GskVulkanColorOp { - GskVulkanOp op; + GskVulkanShaderOp op; graphene_rect_t rect; GdkRGBA color; @@ -40,7 +41,7 @@ gsk_vulkan_color_op_collect_vertex_data (GskVulkanOp *op, guchar *data) { GskVulkanColorOp *self = (GskVulkanColorOp *) op; - GskVulkanColorInstance *instance = (GskVulkanColorInstance *) (data + op->vertex_offset); + GskVulkanColorInstance *instance = (GskVulkanColorInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset); instance->rect[0] = self->rect.origin.x; instance->rect[1] = self->rect.origin.y; @@ -58,17 +59,19 @@ gsk_vulkan_color_op_reserve_descriptor_sets (GskVulkanOp *op, { } -static const GskVulkanOpClass GSK_VULKAN_COLOR_OP_CLASS = { - GSK_VULKAN_OP_SIZE (GskVulkanColorOp), - GSK_VULKAN_STAGE_COMMAND, +static const GskVulkanShaderOpClass GSK_VULKAN_COLOR_OP_CLASS = { + { + GSK_VULKAN_OP_SIZE (GskVulkanColorOp), + GSK_VULKAN_STAGE_COMMAND, + gsk_vulkan_color_op_finish, + gsk_vulkan_color_op_print, + gsk_vulkan_shader_op_count_vertex_data, + gsk_vulkan_color_op_collect_vertex_data, + gsk_vulkan_color_op_reserve_descriptor_sets, + gsk_vulkan_shader_op_command + }, "color", &gsk_vulkan_color_info, - gsk_vulkan_color_op_finish, - gsk_vulkan_color_op_print, - gsk_vulkan_op_draw_count_vertex_data, - gsk_vulkan_color_op_collect_vertex_data, - gsk_vulkan_color_op_reserve_descriptor_sets, - gsk_vulkan_op_draw_command }; void @@ -80,9 +83,9 @@ gsk_vulkan_color_op (GskVulkanRender *render, { GskVulkanColorOp *self; - self = (GskVulkanColorOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_COLOR_OP_CLASS); + self = (GskVulkanColorOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_COLOR_OP_CLASS.parent_class); - ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type); + ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type); graphene_rect_offset_r (rect, offset->x, offset->y, &self->rect); self->color = *color; } diff --git a/gsk/vulkan/gskvulkancrossfadeop.c b/gsk/vulkan/gskvulkancrossfadeop.c index 04f0561b6b..e563f57dba 100644 --- a/gsk/vulkan/gskvulkancrossfadeop.c +++ b/gsk/vulkan/gskvulkancrossfadeop.c @@ -3,6 +3,7 @@ #include "gskvulkancrossfadeopprivate.h" #include "gskvulkanprivate.h" +#include "gskvulkanshaderopprivate.h" #include "vulkan/resources/cross-fade.vert.h" @@ -10,7 +11,7 @@ typedef struct _GskVulkanCrossFadeOp GskVulkanCrossFadeOp; struct _GskVulkanCrossFadeOp { - GskVulkanOp op; + GskVulkanShaderOp op; graphene_rect_t bounds; float progress; @@ -50,7 +51,7 @@ gsk_vulkan_cross_fade_op_collect_vertex_data (GskVulkanOp *op, guchar *data) { GskVulkanCrossFadeOp *self = (GskVulkanCrossFadeOp *) op; - GskVulkanCrossFadeInstance *instance = (GskVulkanCrossFadeInstance *) (data + op->vertex_offset); + GskVulkanCrossFadeInstance *instance = (GskVulkanCrossFadeInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset); gsk_vulkan_rect_to_float (&self->bounds, instance->rect); gsk_vulkan_rect_to_float (&self->start.rect, instance->start_rect); @@ -77,17 +78,19 @@ gsk_vulkan_cross_fade_op_reserve_descriptor_sets (GskVulkanOp *op, GSK_VULKAN_SAMPLER_DEFAULT); } -static const GskVulkanOpClass GSK_VULKAN_CROSS_FADE_OP_CLASS = { - GSK_VULKAN_OP_SIZE (GskVulkanCrossFadeOp), - GSK_VULKAN_STAGE_COMMAND, +static const GskVulkanShaderOpClass GSK_VULKAN_CROSS_FADE_OP_CLASS = { + { + GSK_VULKAN_OP_SIZE (GskVulkanCrossFadeOp), + GSK_VULKAN_STAGE_COMMAND, + gsk_vulkan_cross_fade_op_finish, + gsk_vulkan_cross_fade_op_print, + gsk_vulkan_shader_op_count_vertex_data, + gsk_vulkan_cross_fade_op_collect_vertex_data, + gsk_vulkan_cross_fade_op_reserve_descriptor_sets, + gsk_vulkan_shader_op_command + }, "cross-fade", &gsk_vulkan_cross_fade_info, - gsk_vulkan_cross_fade_op_finish, - gsk_vulkan_cross_fade_op_print, - gsk_vulkan_op_draw_count_vertex_data, - gsk_vulkan_cross_fade_op_collect_vertex_data, - gsk_vulkan_cross_fade_op_reserve_descriptor_sets, - gsk_vulkan_op_draw_command }; void @@ -105,9 +108,9 @@ gsk_vulkan_cross_fade_op (GskVulkanRender *render, { GskVulkanCrossFadeOp *self; - self = (GskVulkanCrossFadeOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_CROSS_FADE_OP_CLASS); + self = (GskVulkanCrossFadeOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_CROSS_FADE_OP_CLASS.parent_class); - ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type); + ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type); graphene_rect_offset_r (bounds, offset->x, offset->y, &self->bounds); self->progress = progress; diff --git a/gsk/vulkan/gskvulkandownloadop.c b/gsk/vulkan/gskvulkandownloadop.c index 9396721f7f..756ba41c0a 100644 --- a/gsk/vulkan/gskvulkandownloadop.c +++ b/gsk/vulkan/gskvulkandownloadop.c @@ -28,7 +28,6 @@ gsk_vulkan_download_op_reserve_descriptor_sets (GskVulkanOp *op, static GskVulkanOp * gsk_vulkan_download_op_command_with_area (GskVulkanOp *op, GskVulkanRender *render, - VkPipelineLayout pipeline_layout, VkCommandBuffer command_buffer, GskVulkanImage *image, const cairo_rectangle_int_t *area, @@ -190,14 +189,13 @@ gsk_vulkan_download_op_print (GskVulkanOp *op, static GskVulkanOp * gsk_vulkan_download_op_command (GskVulkanOp *op, GskVulkanRender *render, - VkPipelineLayout pipeline_layout, + VkRenderPass render_pass, VkCommandBuffer command_buffer) { GskVulkanDownloadOp *self = (GskVulkanDownloadOp *) op; return gsk_vulkan_download_op_command_with_area (op, render, - pipeline_layout, command_buffer, self->image, &(cairo_rectangle_int_t) { @@ -211,8 +209,6 @@ gsk_vulkan_download_op_command (GskVulkanOp *op, static const GskVulkanOpClass GSK_VULKAN_DOWNLOAD_OP_CLASS = { GSK_VULKAN_OP_SIZE (GskVulkanDownloadOp), GSK_VULKAN_STAGE_COMMAND, - NULL, - NULL, gsk_vulkan_download_op_finish, gsk_vulkan_download_op_print, gsk_vulkan_download_op_count_vertex_data, diff --git a/gsk/vulkan/gskvulkanglyphop.c b/gsk/vulkan/gskvulkanglyphop.c index d5eb52ccdc..2794491933 100644 --- a/gsk/vulkan/gskvulkanglyphop.c +++ b/gsk/vulkan/gskvulkanglyphop.c @@ -3,6 +3,7 @@ #include "gskvulkanglyphopprivate.h" #include "gskvulkanprivate.h" +#include "gskvulkanshaderopprivate.h" #include "vulkan/resources/glyph.vert.h" @@ -10,7 +11,7 @@ typedef struct _GskVulkanGlyphOp GskVulkanGlyphOp; struct _GskVulkanGlyphOp { - GskVulkanOp op; + GskVulkanShaderOp op; GskVulkanImage *image; graphene_rect_t rect; @@ -47,7 +48,7 @@ gsk_vulkan_glyph_op_collect_vertex_data (GskVulkanOp *op, guchar *data) { GskVulkanGlyphOp *self = (GskVulkanGlyphOp *) op; - GskVulkanGlyphInstance *instance = (GskVulkanGlyphInstance *) (data + op->vertex_offset); + GskVulkanGlyphInstance *instance = (GskVulkanGlyphInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset); gsk_vulkan_rect_to_float (&self->rect, instance->rect); gsk_vulkan_rect_to_float (&self->tex_rect, instance->tex_rect); @@ -64,17 +65,19 @@ gsk_vulkan_glyph_op_reserve_descriptor_sets (GskVulkanOp *op, self->image_descriptor = gsk_vulkan_render_get_image_descriptor (render, self->image, GSK_VULKAN_SAMPLER_DEFAULT); } -static const GskVulkanOpClass GSK_VULKAN_GLYPH_OP_CLASS = { - GSK_VULKAN_OP_SIZE (GskVulkanGlyphOp), - GSK_VULKAN_STAGE_COMMAND, +static const GskVulkanShaderOpClass GSK_VULKAN_GLYPH_OP_CLASS = { + { + GSK_VULKAN_OP_SIZE (GskVulkanGlyphOp), + GSK_VULKAN_STAGE_COMMAND, + gsk_vulkan_glyph_op_finish, + gsk_vulkan_glyph_op_print, + gsk_vulkan_shader_op_count_vertex_data, + gsk_vulkan_glyph_op_collect_vertex_data, + gsk_vulkan_glyph_op_reserve_descriptor_sets, + gsk_vulkan_shader_op_command + }, "glyph", &gsk_vulkan_glyph_info, - gsk_vulkan_glyph_op_finish, - gsk_vulkan_glyph_op_print, - gsk_vulkan_op_draw_count_vertex_data, - gsk_vulkan_glyph_op_collect_vertex_data, - gsk_vulkan_glyph_op_reserve_descriptor_sets, - gsk_vulkan_op_draw_command }; void @@ -88,9 +91,9 @@ gsk_vulkan_glyph_op (GskVulkanRender *render, { GskVulkanGlyphOp *self; - self = (GskVulkanGlyphOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_GLYPH_OP_CLASS); + self = (GskVulkanGlyphOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_GLYPH_OP_CLASS.parent_class); - ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type); + ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type); self->image = g_object_ref (image); graphene_rect_offset_r (rect, offset->x, offset->y, &self->rect); gsk_vulkan_normalize_tex_coords (&self->tex_rect, rect, tex_rect); diff --git a/gsk/vulkan/gskvulkaninsetshadowop.c b/gsk/vulkan/gskvulkaninsetshadowop.c index dc984627d1..6f8481a612 100644 --- a/gsk/vulkan/gskvulkaninsetshadowop.c +++ b/gsk/vulkan/gskvulkaninsetshadowop.c @@ -3,6 +3,7 @@ #include "gskvulkaninsetshadowopprivate.h" #include "gskvulkanprivate.h" +#include "gskvulkanshaderopprivate.h" #include "gsk/gskroundedrectprivate.h" #include "vulkan/resources/inset-shadow.vert.h" @@ -11,7 +12,7 @@ typedef struct _GskVulkanInsetShadowOp GskVulkanInsetShadowOp; struct _GskVulkanInsetShadowOp { - GskVulkanOp op; + GskVulkanShaderOp op; GskRoundedRect outline; GdkRGBA color; @@ -45,7 +46,7 @@ gsk_vulkan_inset_shadow_op_collect_vertex_data (GskVulkanOp *op, guchar *data) { GskVulkanInsetShadowOp *self = (GskVulkanInsetShadowOp *) op; - GskVulkanInsetShadowInstance *instance = (GskVulkanInsetShadowInstance *) (data + op->vertex_offset); + GskVulkanInsetShadowInstance *instance = (GskVulkanInsetShadowInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset); gsk_rounded_rect_to_float (&self->outline, graphene_point_zero (), instance->outline); gsk_vulkan_rgba_to_float (&self->color, instance->color); @@ -60,17 +61,19 @@ gsk_vulkan_inset_shadow_op_reserve_descriptor_sets (GskVulkanOp *op, { } -static const GskVulkanOpClass GSK_VULKAN_INSET_SHADOW_OP_CLASS = { - GSK_VULKAN_OP_SIZE (GskVulkanInsetShadowOp), - GSK_VULKAN_STAGE_COMMAND, +static const GskVulkanShaderOpClass GSK_VULKAN_INSET_SHADOW_OP_CLASS = { + { + GSK_VULKAN_OP_SIZE (GskVulkanInsetShadowOp), + GSK_VULKAN_STAGE_COMMAND, + gsk_vulkan_inset_shadow_op_finish, + gsk_vulkan_inset_shadow_op_print, + gsk_vulkan_shader_op_count_vertex_data, + gsk_vulkan_inset_shadow_op_collect_vertex_data, + gsk_vulkan_inset_shadow_op_reserve_descriptor_sets, + gsk_vulkan_shader_op_command + }, "inset-shadow", &gsk_vulkan_inset_shadow_info, - gsk_vulkan_inset_shadow_op_finish, - gsk_vulkan_inset_shadow_op_print, - gsk_vulkan_op_draw_count_vertex_data, - gsk_vulkan_inset_shadow_op_collect_vertex_data, - gsk_vulkan_inset_shadow_op_reserve_descriptor_sets, - gsk_vulkan_op_draw_command }; void @@ -85,9 +88,9 @@ gsk_vulkan_inset_shadow_op (GskVulkanRender *render, { GskVulkanInsetShadowOp *self; - self = (GskVulkanInsetShadowOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_INSET_SHADOW_OP_CLASS); + self = (GskVulkanInsetShadowOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_INSET_SHADOW_OP_CLASS.parent_class); - ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type); + ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type); self->outline = *outline; gsk_rounded_rect_offset (&self->outline, offset->x, offset->y); self->color = *color; diff --git a/gsk/vulkan/gskvulkanlineargradientop.c b/gsk/vulkan/gskvulkanlineargradientop.c index 44d02842b3..2d9a1cfd57 100644 --- a/gsk/vulkan/gskvulkanlineargradientop.c +++ b/gsk/vulkan/gskvulkanlineargradientop.c @@ -3,6 +3,7 @@ #include "gskvulkanlineargradientopprivate.h" #include "gskvulkanprivate.h" +#include "gskvulkanshaderopprivate.h" #include "vulkan/resources/linear.vert.h" @@ -10,7 +11,7 @@ typedef struct _GskVulkanLinearGradientOp GskVulkanLinearGradientOp; struct _GskVulkanLinearGradientOp { - GskVulkanOp op; + GskVulkanShaderOp op; graphene_rect_t rect; graphene_point_t start; @@ -48,7 +49,7 @@ gsk_vulkan_linear_gradient_op_collect_vertex_data (GskVulkanOp *op, guchar *data) { GskVulkanLinearGradientOp *self = (GskVulkanLinearGradientOp *) op; - GskVulkanLinearInstance *instance = (GskVulkanLinearInstance *) (data + op->vertex_offset); + GskVulkanLinearInstance *instance = (GskVulkanLinearInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset); gsk_vulkan_rect_to_float (&self->rect, instance->rect); gsk_vulkan_point_to_float (&self->start, instance->start); @@ -72,17 +73,19 @@ gsk_vulkan_linear_gradient_op_reserve_descriptor_sets (GskVulkanOp *op, memcpy (mem, self->stops, self->n_stops * sizeof (GskColorStop)); } -static const GskVulkanOpClass GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS = { - GSK_VULKAN_OP_SIZE (GskVulkanLinearGradientOp), - GSK_VULKAN_STAGE_COMMAND, +static const GskVulkanShaderOpClass GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS = { + { + GSK_VULKAN_OP_SIZE (GskVulkanLinearGradientOp), + GSK_VULKAN_STAGE_COMMAND, + gsk_vulkan_linear_gradient_op_finish, + gsk_vulkan_linear_gradient_op_print, + gsk_vulkan_shader_op_count_vertex_data, + gsk_vulkan_linear_gradient_op_collect_vertex_data, + gsk_vulkan_linear_gradient_op_reserve_descriptor_sets, + gsk_vulkan_shader_op_command + }, "linear", &gsk_vulkan_linear_info, - gsk_vulkan_linear_gradient_op_finish, - gsk_vulkan_linear_gradient_op_print, - gsk_vulkan_op_draw_count_vertex_data, - gsk_vulkan_linear_gradient_op_collect_vertex_data, - gsk_vulkan_linear_gradient_op_reserve_descriptor_sets, - gsk_vulkan_op_draw_command }; void @@ -98,9 +101,9 @@ gsk_vulkan_linear_gradient_op (GskVulkanRender *render, { GskVulkanLinearGradientOp *self; - self = (GskVulkanLinearGradientOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS); + self = (GskVulkanLinearGradientOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS.parent_class); - ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type); + ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type); graphene_rect_offset_r (rect, offset->x, offset->y, &self->rect); self->start = GRAPHENE_POINT_INIT (start->x + offset->x, start->y + offset->y); self->end = GRAPHENE_POINT_INIT (end->x + offset->x, end->y + offset->y); diff --git a/gsk/vulkan/gskvulkanmaskop.c b/gsk/vulkan/gskvulkanmaskop.c index 700d0ef348..b422ea01c2 100644 --- a/gsk/vulkan/gskvulkanmaskop.c +++ b/gsk/vulkan/gskvulkanmaskop.c @@ -3,6 +3,7 @@ #include "gskvulkanmaskopprivate.h" #include "gskvulkanprivate.h" +#include "gskvulkanshaderopprivate.h" #include "vulkan/resources/mask.vert.h" @@ -10,7 +11,7 @@ typedef struct _GskVulkanMaskOp GskVulkanMaskOp; struct _GskVulkanMaskOp { - GskVulkanOp op; + GskVulkanShaderOp op; struct { GskVulkanImage *image; @@ -67,7 +68,7 @@ gsk_vulkan_mask_op_collect_vertex_data (GskVulkanOp *op, guchar *data) { GskVulkanMaskOp *self = (GskVulkanMaskOp *) op; - GskVulkanMaskInstance *instance = (GskVulkanMaskInstance *) (data + op->vertex_offset); + GskVulkanMaskInstance *instance = (GskVulkanMaskInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset); gsk_vulkan_rect_to_float (&self->source.rect, instance->source_rect); gsk_vulkan_rect_to_float (&self->source.tex_rect, instance->source_tex_rect); @@ -88,17 +89,19 @@ gsk_vulkan_mask_op_reserve_descriptor_sets (GskVulkanOp *op, self->mask.image_descriptor = gsk_vulkan_render_get_image_descriptor (render, self->mask.image, GSK_VULKAN_SAMPLER_DEFAULT); } -static const GskVulkanOpClass GSK_VULKAN_COLOR_MASK_OP_CLASS = { - GSK_VULKAN_OP_SIZE (GskVulkanMaskOp), - GSK_VULKAN_STAGE_COMMAND, +static const GskVulkanShaderOpClass GSK_VULKAN_COLOR_MASK_OP_CLASS = { + { + GSK_VULKAN_OP_SIZE (GskVulkanMaskOp), + GSK_VULKAN_STAGE_COMMAND, + gsk_vulkan_mask_op_finish, + gsk_vulkan_mask_op_print, + gsk_vulkan_shader_op_count_vertex_data, + gsk_vulkan_mask_op_collect_vertex_data, + gsk_vulkan_mask_op_reserve_descriptor_sets, + gsk_vulkan_shader_op_command + }, "mask", &gsk_vulkan_mask_info, - gsk_vulkan_mask_op_finish, - gsk_vulkan_mask_op_print, - gsk_vulkan_op_draw_count_vertex_data, - gsk_vulkan_mask_op_collect_vertex_data, - gsk_vulkan_mask_op_reserve_descriptor_sets, - gsk_vulkan_op_draw_command }; void @@ -115,9 +118,9 @@ gsk_vulkan_mask_op (GskVulkanRender *render, { GskVulkanMaskOp *self; - self = (GskVulkanMaskOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_COLOR_MASK_OP_CLASS); + self = (GskVulkanMaskOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_COLOR_MASK_OP_CLASS.parent_class); - ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type); + ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type); self->source.image = g_object_ref (source); graphene_rect_offset_r (source_rect, offset->x, offset->y, &self->source.rect); gsk_vulkan_normalize_tex_coords (&self->source.tex_rect, source_rect, source_tex_rect); diff --git a/gsk/vulkan/gskvulkanop.c b/gsk/vulkan/gskvulkanop.c index 0854639fac..e6e567dc72 100644 --- a/gsk/vulkan/gskvulkanop.c +++ b/gsk/vulkan/gskvulkanop.c @@ -52,65 +52,9 @@ gsk_vulkan_op_reserve_descriptor_sets (GskVulkanOp *op, GskVulkanOp * gsk_vulkan_op_command (GskVulkanOp *op, GskVulkanRender *render, - VkPipelineLayout pipeline_layout, + VkRenderPass render_pass, VkCommandBuffer command_buffer) { - return op->op_class->command (op, render, pipeline_layout, command_buffer); -} - -static inline gsize -round_up (gsize number, gsize divisor) -{ - return (number + divisor - 1) / divisor * divisor; -} - -gsize -gsk_vulkan_op_draw_count_vertex_data (GskVulkanOp *op, - gsize n_bytes) -{ - gsize vertex_stride; - - vertex_stride = op->op_class->vertex_input_state->pVertexBindingDescriptions[0].stride; - n_bytes = round_up (n_bytes, vertex_stride); - op->vertex_offset = n_bytes; - n_bytes += vertex_stride; - return n_bytes; -} - -GskVulkanOp * -gsk_vulkan_op_draw_command_n (GskVulkanOp *op, - GskVulkanRender *render, - VkPipelineLayout pipeline_layout, - VkCommandBuffer command_buffer, - gsize instance_scale) -{ - GskVulkanOp *next; - gsize stride = op->op_class->vertex_input_state->pVertexBindingDescriptions[0].stride; - gsize i; - - i = 1; - for (next = op->next; next && i < 10 * 1000; next = next->next) - { - if (next->op_class != op->op_class || - next->vertex_offset != op->vertex_offset + i * stride) - break; - - i++; - } - - vkCmdDraw (command_buffer, - 6 * instance_scale, i, - 0, op->vertex_offset / stride); - - return next; -} - -GskVulkanOp * -gsk_vulkan_op_draw_command (GskVulkanOp *op, - GskVulkanRender *render, - VkPipelineLayout pipeline_layout, - VkCommandBuffer command_buffer) -{ - return gsk_vulkan_op_draw_command_n (op, render, pipeline_layout, command_buffer, 1); + return op->op_class->command (op, render, render_pass, command_buffer); } diff --git a/gsk/vulkan/gskvulkanopprivate.h b/gsk/vulkan/gskvulkanopprivate.h index 7f21c5b70d..30bfc1ad8d 100644 --- a/gsk/vulkan/gskvulkanopprivate.h +++ b/gsk/vulkan/gskvulkanopprivate.h @@ -19,9 +19,7 @@ struct _GskVulkanOp { const GskVulkanOpClass *op_class; - const /* interned */ char *clip_type; GskVulkanOp *next; - gsize vertex_offset; }; struct _GskVulkanOpClass @@ -29,9 +27,6 @@ struct _GskVulkanOpClass gsize size; GskVulkanStage stage; - const char * shader_name; - const VkPipelineVertexInputStateCreateInfo *vertex_input_state; - void (* finish) (GskVulkanOp *op); void (* print) (GskVulkanOp *op, @@ -46,7 +41,7 @@ struct _GskVulkanOpClass GskVulkanRender *render); GskVulkanOp * (* command) (GskVulkanOp *op, GskVulkanRender *render, - VkPipelineLayout pipeline_layout, + VkRenderPass render_pass, VkCommandBuffer command_buffer); }; @@ -69,19 +64,7 @@ void gsk_vulkan_op_reserve_descriptor_sets (GskVulk GskVulkanRender *render); GskVulkanOp * gsk_vulkan_op_command (GskVulkanOp *op, GskVulkanRender *render, - VkPipelineLayout pipeline_layout, - VkCommandBuffer command_buffer); - -gsize gsk_vulkan_op_draw_count_vertex_data (GskVulkanOp *op, - gsize n_bytes); -GskVulkanOp * gsk_vulkan_op_draw_command_n (GskVulkanOp *op, - GskVulkanRender *render, - VkPipelineLayout pipeline_layout, - VkCommandBuffer command_buffer, - gsize instance_scale); -GskVulkanOp * gsk_vulkan_op_draw_command (GskVulkanOp *op, - GskVulkanRender *render, - VkPipelineLayout pipeline_layout, + VkRenderPass render_pass, VkCommandBuffer command_buffer); G_END_DECLS diff --git a/gsk/vulkan/gskvulkanoutsetshadowop.c b/gsk/vulkan/gskvulkanoutsetshadowop.c index 1e7e2139b3..0358ce3d4d 100644 --- a/gsk/vulkan/gskvulkanoutsetshadowop.c +++ b/gsk/vulkan/gskvulkanoutsetshadowop.c @@ -3,6 +3,7 @@ #include "gskvulkanoutsetshadowopprivate.h" #include "gskvulkanprivate.h" +#include "gskvulkanshaderopprivate.h" #include "gsk/gskroundedrectprivate.h" #include "vulkan/resources/outset-shadow.vert.h" @@ -11,7 +12,7 @@ typedef struct _GskVulkanOutsetShadowOp GskVulkanOutsetShadowOp; struct _GskVulkanOutsetShadowOp { - GskVulkanOp op; + GskVulkanShaderOp op; GskRoundedRect outline; GdkRGBA color; @@ -45,7 +46,7 @@ gsk_vulkan_outset_shadow_op_collect_vertex_data (GskVulkanOp *op, guchar *data) { GskVulkanOutsetShadowOp *self = (GskVulkanOutsetShadowOp *) op; - GskVulkanOutsetShadowInstance *instance = (GskVulkanOutsetShadowInstance *) (data + op->vertex_offset); + GskVulkanOutsetShadowInstance *instance = (GskVulkanOutsetShadowInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset); gsk_rounded_rect_to_float (&self->outline, graphene_point_zero (), instance->outline); gsk_vulkan_rgba_to_float (&self->color, instance->color); @@ -60,17 +61,19 @@ gsk_vulkan_outset_shadow_op_reserve_descriptor_sets (GskVulkanOp *op, { } -static const GskVulkanOpClass GSK_VULKAN_OUTSET_SHADOW_OP_CLASS = { - GSK_VULKAN_OP_SIZE (GskVulkanOutsetShadowOp), - GSK_VULKAN_STAGE_COMMAND, +static const GskVulkanShaderOpClass GSK_VULKAN_OUTSET_SHADOW_OP_CLASS = { + { + GSK_VULKAN_OP_SIZE (GskVulkanOutsetShadowOp), + GSK_VULKAN_STAGE_COMMAND, + gsk_vulkan_outset_shadow_op_finish, + gsk_vulkan_outset_shadow_op_print, + gsk_vulkan_shader_op_count_vertex_data, + gsk_vulkan_outset_shadow_op_collect_vertex_data, + gsk_vulkan_outset_shadow_op_reserve_descriptor_sets, + gsk_vulkan_shader_op_command + }, "outset-shadow", &gsk_vulkan_outset_shadow_info, - gsk_vulkan_outset_shadow_op_finish, - gsk_vulkan_outset_shadow_op_print, - gsk_vulkan_op_draw_count_vertex_data, - gsk_vulkan_outset_shadow_op_collect_vertex_data, - gsk_vulkan_outset_shadow_op_reserve_descriptor_sets, - gsk_vulkan_op_draw_command }; void @@ -85,9 +88,9 @@ gsk_vulkan_outset_shadow_op (GskVulkanRender *render, { GskVulkanOutsetShadowOp *self; - self = (GskVulkanOutsetShadowOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_OUTSET_SHADOW_OP_CLASS); + self = (GskVulkanOutsetShadowOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_OUTSET_SHADOW_OP_CLASS.parent_class); - ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type); + ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type); self->outline = *outline; gsk_rounded_rect_offset (&self->outline, offset->x, offset->y); self->color = *color; diff --git a/gsk/vulkan/gskvulkanpushconstantsop.c b/gsk/vulkan/gskvulkanpushconstantsop.c index 7296fe8742..d730155c48 100644 --- a/gsk/vulkan/gskvulkanpushconstantsop.c +++ b/gsk/vulkan/gskvulkanpushconstantsop.c @@ -79,13 +79,13 @@ gsk_vulkan_push_constants_op_reserve_descriptor_sets (GskVulkanOp *op, static GskVulkanOp * gsk_vulkan_push_constants_op_command (GskVulkanOp *op, GskVulkanRender *render, - VkPipelineLayout pipeline_layout, + VkRenderPass render_pass, VkCommandBuffer command_buffer) { GskVulkanPushConstantsOp *self = (GskVulkanPushConstantsOp *) op; vkCmdPushConstants (command_buffer, - pipeline_layout, + gsk_vulkan_render_get_pipeline_layout (render), VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof (self->instance), @@ -97,8 +97,6 @@ gsk_vulkan_push_constants_op_command (GskVulkanOp *op, static const GskVulkanOpClass GSK_VULKAN_PUSH_CONSTANTS_OP_CLASS = { GSK_VULKAN_OP_SIZE (GskVulkanPushConstantsOp), GSK_VULKAN_STAGE_COMMAND, - NULL, - NULL, gsk_vulkan_push_constants_op_finish, gsk_vulkan_push_constants_op_print, gsk_vulkan_push_constants_op_count_vertex_data, diff --git a/gsk/vulkan/gskvulkanrender.c b/gsk/vulkan/gskvulkanrender.c index 20cfd59b3e..0ef3c98d7d 100644 --- a/gsk/vulkan/gskvulkanrender.c +++ b/gsk/vulkan/gskvulkanrender.c @@ -14,6 +14,7 @@ #include "gskvulkanrendererprivate.h" #include "gskvulkanrenderpassprivate.h" #include "gskvulkanrenderpassopprivate.h" +#include "gskvulkanshaderopprivate.h" #include "gdk/gdkvulkancontextprivate.h" @@ -512,13 +513,19 @@ gsk_vulkan_render_add_node (GskVulkanRender *self, gsk_vulkan_render_verbose_print (self, "after sort"); } +VkPipelineLayout +gsk_vulkan_render_get_pipeline_layout (GskVulkanRender *self) +{ + return self->pipeline_layout; +} + VkPipeline gsk_vulkan_render_get_pipeline (GskVulkanRender *self, const GskVulkanOpClass *op_class, const char *clip_type, - VkFormat format, VkRenderPass render_pass) { + const GskVulkanShaderOpClass *shader_op_class = (const GskVulkanShaderOpClass *) op_class; PipelineCacheKey cache_key; VkPipeline pipeline; GdkDisplay *display; @@ -527,15 +534,15 @@ gsk_vulkan_render_get_pipeline (GskVulkanRender *self, cache_key = (PipelineCacheKey) { .op_class = op_class, .clip_type = clip_type, - .format = format, + .format = gsk_vulkan_image_get_vk_format (self->target) }; pipeline = g_hash_table_lookup (self->pipeline_cache, &cache_key); if (pipeline) return pipeline; display = gdk_draw_context_get_display (GDK_DRAW_CONTEXT (self->vulkan)); - vertex_shader_name = g_strconcat ("/org/gtk/libgsk/vulkan/", op_class->shader_name, clip_type, ".vert.spv", NULL); - fragment_shader_name = g_strconcat ("/org/gtk/libgsk/vulkan/", op_class->shader_name, clip_type, ".frag.spv", NULL); + vertex_shader_name = g_strconcat ("/org/gtk/libgsk/vulkan/", shader_op_class->shader_name, clip_type, ".vert.spv", NULL); + fragment_shader_name = g_strconcat ("/org/gtk/libgsk/vulkan/", shader_op_class->shader_name, clip_type, ".frag.spv", NULL); GSK_VK_CHECK (vkCreateGraphicsPipelines, gdk_vulkan_context_get_device (self->vulkan), gdk_vulkan_context_get_pipeline_cache (self->vulkan), @@ -557,7 +564,7 @@ gsk_vulkan_render_get_pipeline (GskVulkanRender *self, .pName = "main", }, }, - .pVertexInputState = op_class->vertex_input_state, + .pVertexInputState = shader_op_class->vertex_input_state, .pInputAssemblyState = &(VkPipelineInputAssemblyStateCreateInfo) { .sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, .topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, @@ -920,7 +927,7 @@ gsk_vulkan_render_submit (GskVulkanRender *self) op = self->first_op; while (op) { - op = gsk_vulkan_op_command (op, self, self->pipeline_layout, command_buffer); + op = gsk_vulkan_op_command (op, self, VK_NULL_HANDLE, command_buffer); } gsk_vulkan_command_pool_submit_buffer (self->command_pool, diff --git a/gsk/vulkan/gskvulkanrenderpassop.c b/gsk/vulkan/gskvulkanrenderpassop.c index 895c19cb21..f01aa217a8 100644 --- a/gsk/vulkan/gskvulkanrenderpassop.c +++ b/gsk/vulkan/gskvulkanrenderpassop.c @@ -67,15 +67,15 @@ gsk_vulkan_render_pass_op_reserve_descriptor_sets (GskVulkanOp *op, static GskVulkanOp * gsk_vulkan_render_pass_op_command (GskVulkanOp *op, GskVulkanRender *render, - VkPipelineLayout pipeline_layout, + VkRenderPass render_pass, VkCommandBuffer command_buffer) { GskVulkanRenderPassOp *self = (GskVulkanRenderPassOp *) op; - VkPipeline current_pipeline = VK_NULL_HANDLE; - const GskVulkanOpClass *current_pipeline_class = NULL; - const char *current_pipeline_clip_type = NULL; VkRenderPass vk_render_pass; + /* nesting render passes not allowed */ + g_assert (render_pass == VK_NULL_HANDLE); + vk_render_pass = gsk_vulkan_render_get_render_pass (render, gsk_vulkan_image_get_vk_format (self->image), self->initial_layout, @@ -114,26 +114,10 @@ gsk_vulkan_render_pass_op_command (GskVulkanOp *op, op = op->next; while (op->op_class->stage != GSK_VULKAN_STAGE_END_PASS) { - if (op->op_class->shader_name && - (op->op_class != current_pipeline_class || - current_pipeline_clip_type != op->clip_type)) - { - current_pipeline = gsk_vulkan_render_get_pipeline (render, - op->op_class, - op->clip_type, - gsk_vulkan_image_get_vk_format (self->image), - vk_render_pass); - vkCmdBindPipeline (command_buffer, - VK_PIPELINE_BIND_POINT_GRAPHICS, - current_pipeline); - current_pipeline_class = op->op_class; - current_pipeline_clip_type = op->clip_type; - } - - op = gsk_vulkan_op_command (op, render, pipeline_layout, command_buffer); + op = gsk_vulkan_op_command (op, render, vk_render_pass, command_buffer); } - op = gsk_vulkan_op_command (op, render, pipeline_layout, command_buffer); + op = gsk_vulkan_op_command (op, render, vk_render_pass, command_buffer); return op; } @@ -141,8 +125,6 @@ gsk_vulkan_render_pass_op_command (GskVulkanOp *op, static const GskVulkanOpClass GSK_VULKAN_RENDER_PASS_OP_CLASS = { GSK_VULKAN_OP_SIZE (GskVulkanRenderPassOp), GSK_VULKAN_STAGE_BEGIN_PASS, - NULL, - NULL, gsk_vulkan_render_pass_op_finish, gsk_vulkan_render_pass_op_print, gsk_vulkan_render_pass_op_count_vertex_data, @@ -204,7 +186,7 @@ gsk_vulkan_render_pass_end_op_reserve_descriptor_sets (GskVulkanOp *op, static GskVulkanOp * gsk_vulkan_render_pass_end_op_command (GskVulkanOp *op, GskVulkanRender *render, - VkPipelineLayout pipeline_layout, + VkRenderPass render_pass, VkCommandBuffer command_buffer) { GskVulkanRenderPassEndOp *self = (GskVulkanRenderPassEndOp *) op; @@ -220,8 +202,6 @@ gsk_vulkan_render_pass_end_op_command (GskVulkanOp *op, static const GskVulkanOpClass GSK_VULKAN_RENDER_PASS_END_OP_CLASS = { GSK_VULKAN_OP_SIZE (GskVulkanRenderPassEndOp), GSK_VULKAN_STAGE_END_PASS, - NULL, - NULL, gsk_vulkan_render_pass_end_op_finish, gsk_vulkan_render_pass_end_op_print, gsk_vulkan_render_pass_end_op_count_vertex_data, diff --git a/gsk/vulkan/gskvulkanrenderprivate.h b/gsk/vulkan/gskvulkanrenderprivate.h index 506e717c99..8342231e0d 100644 --- a/gsk/vulkan/gskvulkanrenderprivate.h +++ b/gsk/vulkan/gskvulkanrenderprivate.h @@ -41,10 +41,10 @@ GdkVulkanContext * gsk_vulkan_render_get_context (GskVulk gpointer gsk_vulkan_render_alloc_op (GskVulkanRender *self, gsize size); +VkPipelineLayout gsk_vulkan_render_get_pipeline_layout (GskVulkanRender *self); VkPipeline gsk_vulkan_render_get_pipeline (GskVulkanRender *self, const GskVulkanOpClass *op_class, const char *clip_type, - VkFormat format, VkRenderPass render_pass); VkRenderPass gsk_vulkan_render_get_render_pass (GskVulkanRender *self, VkFormat format, diff --git a/gsk/vulkan/gskvulkanscissorop.c b/gsk/vulkan/gskvulkanscissorop.c index b0bc0be18a..5a374e0399 100644 --- a/gsk/vulkan/gskvulkanscissorop.c +++ b/gsk/vulkan/gskvulkanscissorop.c @@ -53,7 +53,7 @@ gsk_vulkan_scissor_op_reserve_descriptor_sets (GskVulkanOp *op, static GskVulkanOp * gsk_vulkan_scissor_op_command (GskVulkanOp *op, GskVulkanRender *render, - VkPipelineLayout pipeline_layout, + VkRenderPass render_pass, VkCommandBuffer command_buffer) { GskVulkanScissorOp *self = (GskVulkanScissorOp *) op; @@ -72,8 +72,6 @@ gsk_vulkan_scissor_op_command (GskVulkanOp *op, static const GskVulkanOpClass GSK_VULKAN_SCISSOR_OP_CLASS = { GSK_VULKAN_OP_SIZE (GskVulkanScissorOp), GSK_VULKAN_STAGE_COMMAND, - NULL, - NULL, gsk_vulkan_scissor_op_finish, gsk_vulkan_scissor_op_print, gsk_vulkan_scissor_op_count_vertex_data, diff --git a/gsk/vulkan/gskvulkanshaderop.c b/gsk/vulkan/gskvulkanshaderop.c new file mode 100644 index 0000000000..141271ecca --- /dev/null +++ b/gsk/vulkan/gskvulkanshaderop.c @@ -0,0 +1,73 @@ +#include "config.h" + +#include "gskvulkanshaderopprivate.h" + +static inline gsize +round_up (gsize number, gsize divisor) +{ + return (number + divisor - 1) / divisor * divisor; +} + +gsize +gsk_vulkan_shader_op_count_vertex_data (GskVulkanOp *op, + gsize n_bytes) +{ + GskVulkanShaderOp *self = (GskVulkanShaderOp *) op; + GskVulkanShaderOpClass *shader_op_class = ((GskVulkanShaderOpClass *) op->op_class); + gsize vertex_stride; + + vertex_stride = shader_op_class->vertex_input_state->pVertexBindingDescriptions[0].stride; + n_bytes = round_up (n_bytes, vertex_stride); + self->vertex_offset = n_bytes; + n_bytes += vertex_stride; + return n_bytes; +} + +GskVulkanOp * +gsk_vulkan_shader_op_command_n (GskVulkanOp *op, + GskVulkanRender *render, + VkRenderPass render_pass, + VkCommandBuffer command_buffer, + gsize instance_scale) +{ + GskVulkanShaderOp *self = (GskVulkanShaderOp *) op; + GskVulkanShaderOpClass *shader_op_class = ((GskVulkanShaderOpClass *) op->op_class); + GskVulkanOp *next; + gsize stride = shader_op_class->vertex_input_state->pVertexBindingDescriptions[0].stride; + gsize i; + + i = 1; + for (next = op->next; next && i < 10 * 1000; next = next->next) + { + GskVulkanShaderOp *next_shader = (GskVulkanShaderOp *) next; + + if (next->op_class != op->op_class || + next_shader->vertex_offset != self->vertex_offset + i * stride) + break; + + i++; + } + + vkCmdBindPipeline (command_buffer, + VK_PIPELINE_BIND_POINT_GRAPHICS, + gsk_vulkan_render_get_pipeline (render, + op->op_class, + self->clip_type, + render_pass)); + + vkCmdDraw (command_buffer, + 6 * instance_scale, i, + 0, self->vertex_offset / stride); + + return next; +} + +GskVulkanOp * +gsk_vulkan_shader_op_command (GskVulkanOp *op, + GskVulkanRender *render, + VkRenderPass render_pass, + VkCommandBuffer command_buffer) +{ + return gsk_vulkan_shader_op_command_n (op, render, render_pass, command_buffer, 1); +} + diff --git a/gsk/vulkan/gskvulkanshaderopprivate.h b/gsk/vulkan/gskvulkanshaderopprivate.h new file mode 100644 index 0000000000..e9f29bb90c --- /dev/null +++ b/gsk/vulkan/gskvulkanshaderopprivate.h @@ -0,0 +1,39 @@ +#pragma once + +#include "gskvulkanopprivate.h" + +G_BEGIN_DECLS + +typedef struct _GskVulkanShaderOp GskVulkanShaderOp; +typedef struct _GskVulkanShaderOpClass GskVulkanShaderOpClass; + +struct _GskVulkanShaderOp +{ + GskVulkanOp parent_op; + + const /* interned */ char *clip_type; + gsize vertex_offset; +}; + +struct _GskVulkanShaderOpClass +{ + GskVulkanOpClass parent_class; + + const char * shader_name; + const VkPipelineVertexInputStateCreateInfo *vertex_input_state; +}; + +gsize gsk_vulkan_shader_op_count_vertex_data (GskVulkanOp *op, + gsize n_bytes); +GskVulkanOp * gsk_vulkan_shader_op_command_n (GskVulkanOp *op, + GskVulkanRender *render, + VkRenderPass render_pass, + VkCommandBuffer command_buffer, + gsize instance_scale); +GskVulkanOp * gsk_vulkan_shader_op_command (GskVulkanOp *op, + GskVulkanRender *render, + VkRenderPass render_pass, + VkCommandBuffer command_buffer); + +G_END_DECLS + diff --git a/gsk/vulkan/gskvulkantextureop.c b/gsk/vulkan/gskvulkantextureop.c index 9bad4f1992..d0df51d420 100644 --- a/gsk/vulkan/gskvulkantextureop.c +++ b/gsk/vulkan/gskvulkantextureop.c @@ -3,6 +3,7 @@ #include "gskvulkantextureopprivate.h" #include "gskvulkanprivate.h" +#include "gskvulkanshaderopprivate.h" #include "vulkan/resources/texture.vert.h" @@ -10,7 +11,7 @@ typedef struct _GskVulkanTextureOp GskVulkanTextureOp; struct _GskVulkanTextureOp { - GskVulkanOp op; + GskVulkanShaderOp op; GskVulkanImage *image; GskVulkanRenderSampler sampler; @@ -47,7 +48,7 @@ gsk_vulkan_texture_op_collect_vertex_data (GskVulkanOp *op, guchar *data) { GskVulkanTextureOp *self = (GskVulkanTextureOp *) op; - GskVulkanTextureInstance *instance = (GskVulkanTextureInstance *) (data + op->vertex_offset); + GskVulkanTextureInstance *instance = (GskVulkanTextureInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset); instance->rect[0] = self->rect.origin.x; instance->rect[1] = self->rect.origin.y; @@ -69,17 +70,19 @@ gsk_vulkan_texture_op_reserve_descriptor_sets (GskVulkanOp *op, self->image_descriptor = gsk_vulkan_render_get_image_descriptor (render, self->image, self->sampler); } -static const GskVulkanOpClass GSK_VULKAN_TEXTURE_OP_CLASS = { - GSK_VULKAN_OP_SIZE (GskVulkanTextureOp), - GSK_VULKAN_STAGE_COMMAND, +static const GskVulkanShaderOpClass GSK_VULKAN_TEXTURE_OP_CLASS = { + { + GSK_VULKAN_OP_SIZE (GskVulkanTextureOp), + GSK_VULKAN_STAGE_COMMAND, + gsk_vulkan_texture_op_finish, + gsk_vulkan_texture_op_print, + gsk_vulkan_shader_op_count_vertex_data, + gsk_vulkan_texture_op_collect_vertex_data, + gsk_vulkan_texture_op_reserve_descriptor_sets, + gsk_vulkan_shader_op_command + }, "texture", &gsk_vulkan_texture_info, - gsk_vulkan_texture_op_finish, - gsk_vulkan_texture_op_print, - gsk_vulkan_op_draw_count_vertex_data, - gsk_vulkan_texture_op_collect_vertex_data, - gsk_vulkan_texture_op_reserve_descriptor_sets, - gsk_vulkan_op_draw_command }; void @@ -93,9 +96,9 @@ gsk_vulkan_texture_op (GskVulkanRender *render, { GskVulkanTextureOp *self; - self = (GskVulkanTextureOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_TEXTURE_OP_CLASS); + self = (GskVulkanTextureOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_TEXTURE_OP_CLASS.parent_class); - ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type); + ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type); self->image = g_object_ref (image); self->sampler = sampler; graphene_rect_offset_r (rect, offset->x, offset->y, &self->rect); diff --git a/gsk/vulkan/gskvulkanuploadop.c b/gsk/vulkan/gskvulkanuploadop.c index 7ddc29918e..ff66dff5c8 100644 --- a/gsk/vulkan/gskvulkanuploadop.c +++ b/gsk/vulkan/gskvulkanuploadop.c @@ -28,7 +28,6 @@ gsk_vulkan_upload_op_reserve_descriptor_sets (GskVulkanOp *op, static GskVulkanOp * gsk_vulkan_upload_op_command_with_area (GskVulkanOp *op, GskVulkanRender *render, - VkPipelineLayout pipeline_layout, VkCommandBuffer command_buffer, GskVulkanImage *image, const cairo_rectangle_int_t *area, @@ -147,7 +146,6 @@ gsk_vulkan_upload_op_command_with_area (GskVulkanOp *op, static GskVulkanOp * gsk_vulkan_upload_op_command (GskVulkanOp *op, GskVulkanRender *render, - VkPipelineLayout pipeline_layout, VkCommandBuffer command_buffer, GskVulkanImage *image, void (* draw_func) (GskVulkanOp *, guchar *, gsize), @@ -173,7 +171,6 @@ gsk_vulkan_upload_op_command (GskVulkanOp *op, return gsk_vulkan_upload_op_command_with_area (op, render, - pipeline_layout, command_buffer, image, &(cairo_rectangle_int_t) { @@ -237,14 +234,13 @@ gsk_vulkan_upload_texture_op_draw (GskVulkanOp *op, static GskVulkanOp * gsk_vulkan_upload_texture_op_command (GskVulkanOp *op, GskVulkanRender *render, - VkPipelineLayout pipeline_layout, + VkRenderPass render_pass, VkCommandBuffer command_buffer) { GskVulkanUploadTextureOp *self = (GskVulkanUploadTextureOp *) op; return gsk_vulkan_upload_op_command (op, render, - pipeline_layout, command_buffer, self->image, gsk_vulkan_upload_texture_op_draw, @@ -254,8 +250,6 @@ gsk_vulkan_upload_texture_op_command (GskVulkanOp *op, static const GskVulkanOpClass GSK_VULKAN_UPLOAD_TEXTURE_OP_CLASS = { GSK_VULKAN_OP_SIZE (GskVulkanUploadTextureOp), GSK_VULKAN_STAGE_UPLOAD, - NULL, - NULL, gsk_vulkan_upload_texture_op_finish, gsk_vulkan_upload_texture_op_print, gsk_vulkan_upload_op_count_vertex_data, @@ -353,14 +347,13 @@ gsk_vulkan_upload_cairo_op_draw (GskVulkanOp *op, static GskVulkanOp * gsk_vulkan_upload_cairo_op_command (GskVulkanOp *op, GskVulkanRender *render, - VkPipelineLayout pipeline_layout, + VkRenderPass render_pass, VkCommandBuffer command_buffer) { GskVulkanUploadCairoOp *self = (GskVulkanUploadCairoOp *) op; return gsk_vulkan_upload_op_command (op, render, - pipeline_layout, command_buffer, self->image, gsk_vulkan_upload_cairo_op_draw, @@ -370,8 +363,6 @@ gsk_vulkan_upload_cairo_op_command (GskVulkanOp *op, static const GskVulkanOpClass GSK_VULKAN_UPLOAD_CAIRO_OP_CLASS = { GSK_VULKAN_OP_SIZE (GskVulkanUploadCairoOp), GSK_VULKAN_STAGE_UPLOAD, - NULL, - NULL, gsk_vulkan_upload_cairo_op_finish, gsk_vulkan_upload_cairo_op_print, gsk_vulkan_upload_op_count_vertex_data, @@ -483,14 +474,13 @@ gsk_vulkan_upload_glyph_op_draw (GskVulkanOp *op, static GskVulkanOp * gsk_vulkan_upload_glyph_op_command (GskVulkanOp *op, GskVulkanRender *render, - VkPipelineLayout pipeline_layout, + VkRenderPass render_pass, VkCommandBuffer command_buffer) { GskVulkanUploadGlyphOp *self = (GskVulkanUploadGlyphOp *) op; return gsk_vulkan_upload_op_command_with_area (op, render, - pipeline_layout, command_buffer, self->image, &self->area, @@ -501,8 +491,6 @@ gsk_vulkan_upload_glyph_op_command (GskVulkanOp *op, static const GskVulkanOpClass GSK_VULKAN_UPLOAD_GLYPH_OP_CLASS = { GSK_VULKAN_OP_SIZE (GskVulkanUploadGlyphOp), GSK_VULKAN_STAGE_UPLOAD, - NULL, - NULL, gsk_vulkan_upload_glyph_op_finish, gsk_vulkan_upload_glyph_op_print, gsk_vulkan_upload_op_count_vertex_data,