From: Benjamin Otte Date: Sat, 24 Jun 2023 02:49:39 +0000 (+0200) Subject: vulkan: Create the first real VulkanOp X-Git-Tag: archive/raspbian/4.12.3+ds-1+rpi1~1^2^2^2~22^2~1^2~60^2~88 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=742ef96748c9d1638e6c75d17694acbb8b800440;p=gtk4.git vulkan: Create the first real VulkanOp Split out the scissor op into its own implementation as a proof of concept of how ops are meant to look when they are actually working. --- diff --git a/gsk/meson.build b/gsk/meson.build index bfec80f6c0..e5c51a72ae 100644 --- a/gsk/meson.build +++ b/gsk/meson.build @@ -128,6 +128,7 @@ if have_vulkan 'vulkan/gskvulkanrender.c', 'vulkan/gskvulkanrenderer.c', 'vulkan/gskvulkanrenderpass.c', + 'vulkan/gskvulkanscissorop.c', 'vulkan/gskvulkanshader.c', 'vulkan/gskvulkantextpipeline.c', 'vulkan/gskvulkantexturepipeline.c', diff --git a/gsk/vulkan/gskvulkanop.c b/gsk/vulkan/gskvulkanop.c index 6c8aaaa776..20f7f22b5e 100644 --- a/gsk/vulkan/gskvulkanop.c +++ b/gsk/vulkan/gskvulkanop.c @@ -2,6 +2,13 @@ #include "gskvulkanopprivate.h" +void +gsk_vulkan_op_init (GskVulkanOp *op, + const GskVulkanOpClass *op_class) +{ + op->op_class = op_class; +} + void gsk_vulkan_op_finish (GskVulkanOp *op) { diff --git a/gsk/vulkan/gskvulkanopprivate.h b/gsk/vulkan/gskvulkanopprivate.h index e808bf49bd..92c380e75f 100644 --- a/gsk/vulkan/gskvulkanopprivate.h +++ b/gsk/vulkan/gskvulkanopprivate.h @@ -40,6 +40,11 @@ struct _GskVulkanOpClass VkCommandBuffer command_buffer); }; +/* ensures alignment of ops to multipes of 16 bytes - and that makes graphene happy */ +#define GSK_VULKAN_OP_SIZE(struct_name) ((sizeof(struct_name) + 15) & ~15) + +void gsk_vulkan_op_init (GskVulkanOp *op, + const GskVulkanOpClass *op_class); void gsk_vulkan_op_finish (GskVulkanOp *op); void gsk_vulkan_op_upload (GskVulkanOp *op, diff --git a/gsk/vulkan/gskvulkanrenderpass.c b/gsk/vulkan/gskvulkanrenderpass.c index 12322fd893..b41bf16363 100644 --- a/gsk/vulkan/gskvulkanrenderpass.c +++ b/gsk/vulkan/gskvulkanrenderpass.c @@ -24,6 +24,7 @@ #include "gskvulkantexturepipelineprivate.h" #include "gskvulkanimageprivate.h" #include "gskvulkanpushconstantsprivate.h" +#include "gskvulkanscissoropprivate.h" #include "gskvulkanrendererprivate.h" #include "gskprivate.h" @@ -45,7 +46,6 @@ typedef union _GskVulkanOpAll GskVulkanOpAll; typedef struct _GskVulkanOpRender GskVulkanOpRender; typedef struct _GskVulkanOpText GskVulkanOpText; typedef struct _GskVulkanOpPushConstants GskVulkanOpPushConstants; -typedef struct _GskVulkanOpScissor GskVulkanOpScissor; typedef enum { /* GskVulkanOpRender */ @@ -70,8 +70,6 @@ typedef enum { GSK_VULKAN_OP_COLOR_TEXT, /* GskVulkanOpPushConstants */ GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS, - /* GskVulkanOpScissor */ - GSK_VULKAN_OP_SCISSOR, } GskVulkanOpType; /* render ops with 0, 1 or 2 sources */ @@ -120,14 +118,6 @@ struct _GskVulkanOpPushConstants GskRoundedRect clip; }; -struct _GskVulkanOpScissor -{ - GskVulkanOp base; - GskVulkanOpType type; - GskRenderNode *node; /* node that's the source of this op */ - cairo_rectangle_int_t rect; -}; - struct _GskVulkanOpAny { GskVulkanOp base; @@ -141,7 +131,6 @@ union _GskVulkanOpAll GskVulkanOpRender render; GskVulkanOpText text; GskVulkanOpPushConstants constants; - GskVulkanOpScissor scissor; }; struct _GskVulkanRenderPass @@ -293,6 +282,12 @@ gsk_vulkan_render_pass_free (GskVulkanRenderPass *self) g_free (self); } +static inline gsize +round_up (gsize number, gsize divisor) +{ + return (number + divisor - 1) / divisor * divisor; +} + static gpointer gsk_vulkan_render_pass_alloc_op (GskVulkanRenderPass *self, gsize size) @@ -319,13 +314,8 @@ gsk_vulkan_render_pass_append_scissor (GskVulkanRenderPass *self, GskRenderNode *node, const GskVulkanParseState *state) { - GskVulkanOpScissor op = { - .type = GSK_VULKAN_OP_SCISSOR, - .node = node, - .rect = state->scissor - }; - - gsk_vulkan_render_pass_add_op (self, (GskVulkanOp *) &op); + gsk_vulkan_scissor_op_init (gsk_vulkan_render_pass_alloc_op (self, gsk_vulkan_scissor_op_size ()), + &state->scissor); } static void @@ -1836,17 +1826,10 @@ gsk_vulkan_render_op_upload (GskVulkanOp *op_, case GSK_VULKAN_OP_BORDER: case GSK_VULKAN_OP_INSET_SHADOW: case GSK_VULKAN_OP_OUTSET_SHADOW: - case GSK_VULKAN_OP_SCISSOR: break; } } -static inline gsize -round_up (gsize number, gsize divisor) -{ - return (number + divisor - 1) / divisor * divisor; -} - static gsize gsk_vulkan_render_pass_count_vertex_data (GskVulkanRenderPass *self) { @@ -1908,7 +1891,6 @@ gsk_vulkan_render_op_count_vertex_data (GskVulkanOp *op_, g_assert_not_reached (); case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS: - case GSK_VULKAN_OP_SCISSOR: break; } @@ -2130,7 +2112,6 @@ gsk_vulkan_render_op_collect_vertex_data (GskVulkanOp *op_, default: g_assert_not_reached (); case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS: - case GSK_VULKAN_OP_SCISSOR: break; } } @@ -2277,7 +2258,6 @@ gsk_vulkan_render_op_reserve_descriptor_sets (GskVulkanOp *op_, case GSK_VULKAN_OP_INSET_SHADOW: case GSK_VULKAN_OP_OUTSET_SHADOW: case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS: - case GSK_VULKAN_OP_SCISSOR: break; } } @@ -2352,7 +2332,6 @@ gsk_vulkan_render_op_get_pipeline (GskVulkanOp *op_) return op->text.pipeline; case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS: - case GSK_VULKAN_OP_SCISSOR: return NULL; default: @@ -2454,16 +2433,6 @@ gsk_vulkan_render_op_command (GskVulkanOp *op_, &op->constants.clip); break; - case GSK_VULKAN_OP_SCISSOR: - vkCmdSetScissor (command_buffer, - 0, - 1, - &(VkRect2D) { - { op->scissor.rect.x, op->scissor.rect.y }, - { op->scissor.rect.width, op->scissor.rect.height }, - }); - break; - case GSK_VULKAN_OP_CROSS_FADE: if (!op->render.source || !op->render.source2) break; diff --git a/gsk/vulkan/gskvulkanscissorop.c b/gsk/vulkan/gskvulkanscissorop.c new file mode 100644 index 0000000000..e763306486 --- /dev/null +++ b/gsk/vulkan/gskvulkanscissorop.c @@ -0,0 +1,98 @@ +#include "config.h" + +#include "gskvulkanscissoropprivate.h" + +typedef struct _GskVulkanScissorOp GskVulkanScissorOp; + +struct _GskVulkanScissorOp +{ + GskVulkanOp op; + + cairo_rectangle_int_t rect; +}; + +static void +gsk_vulkan_scissor_op_finish (GskVulkanOp *op) +{ +} + +static void +gsk_vulkan_scissor_op_upload (GskVulkanOp *op, + GskVulkanRenderPass *pass, + GskVulkanRender *render, + GskVulkanUploader *uploader, + const graphene_rect_t *clip, + const graphene_vec2_t *scale) +{ +} + +static gsize +gsk_vulkan_scissor_op_count_vertex_data (GskVulkanOp *op, + gsize n_bytes) +{ + return n_bytes; +} + +static void +gsk_vulkan_scissor_op_collect_vertex_data (GskVulkanOp *op, + GskVulkanRenderPass *pass, + GskVulkanRender *render, + guchar *data) +{ +} + +static void +gsk_vulkan_scissor_op_reserve_descriptor_sets (GskVulkanOp *op, + GskVulkanRender *render) +{ +} + +static GskVulkanPipeline * +gsk_vulkan_scissor_op_get_pipeline (GskVulkanOp *op) +{ + return NULL; +} + +static void +gsk_vulkan_scissor_op_command (GskVulkanOp *op, + VkPipelineLayout pipeline_layout, + VkCommandBuffer command_buffer) +{ + GskVulkanScissorOp *self = (GskVulkanScissorOp *) op; + + vkCmdSetScissor (command_buffer, + 0, + 1, + &(VkRect2D) { + { self->rect.x, self->rect.y }, + { self->rect.width, self->rect.height }, + }); +} + +static const GskVulkanOpClass GSK_VULKAN_SCISSOR_OP_CLASS = { + GSK_VULKAN_OP_SIZE (GskVulkanScissorOp), + gsk_vulkan_scissor_op_finish, + gsk_vulkan_scissor_op_upload, + gsk_vulkan_scissor_op_count_vertex_data, + gsk_vulkan_scissor_op_collect_vertex_data, + gsk_vulkan_scissor_op_reserve_descriptor_sets, + gsk_vulkan_scissor_op_get_pipeline, + gsk_vulkan_scissor_op_command +}; + +gsize +gsk_vulkan_scissor_op_size (void) +{ + return GSK_VULKAN_SCISSOR_OP_CLASS.size; +} + +void +gsk_vulkan_scissor_op_init (GskVulkanOp *op, + const cairo_rectangle_int_t *rect) +{ + GskVulkanScissorOp *self = (GskVulkanScissorOp *) op; + + gsk_vulkan_op_init (op, &GSK_VULKAN_SCISSOR_OP_CLASS); + + self->rect = *rect; +} diff --git a/gsk/vulkan/gskvulkanscissoropprivate.h b/gsk/vulkan/gskvulkanscissoropprivate.h new file mode 100644 index 0000000000..6e46512cf9 --- /dev/null +++ b/gsk/vulkan/gskvulkanscissoropprivate.h @@ -0,0 +1,14 @@ +#pragma once + +#include "gskvulkanopprivate.h" + +G_BEGIN_DECLS + +gsize gsk_vulkan_scissor_op_size (void) G_GNUC_CONST; + +void gsk_vulkan_scissor_op_init (GskVulkanOp *op, + const cairo_rectangle_int_t *rect); + + +G_END_DECLS +