vulkan: Factor out call to opacity op
authorBenjamin Otte <otte@redhat.com>
Thu, 29 Jun 2023 19:43:26 +0000 (21:43 +0200)
committerBenjamin Otte <otte@redhat.com>
Sun, 16 Jul 2023 10:12:36 +0000 (12:12 +0200)
I want to reuse it for crossfades (see next commit).

gsk/vulkan/gskvulkancolormatrixop.c
gsk/vulkan/gskvulkancolormatrixopprivate.h
gsk/vulkan/gskvulkancrossfadeop.c [new file with mode: 0644]
gsk/vulkan/gskvulkancrossfadeopprivate.h [new file with mode: 0644]
gsk/vulkan/gskvulkancrossfadepipeline.c [deleted file]
gsk/vulkan/gskvulkancrossfadepipelineprivate.h [deleted file]
gsk/vulkan/gskvulkanrenderpass.c

index b9ddeb544cb95be6fa66a5cae7eebe05a5d536b1..35d12639dacd58d7f582bcd8f055205f77075fce 100644 (file)
@@ -144,3 +144,35 @@ gsk_vulkan_color_matrix_op (GskVulkanRenderPass     *render_pass,
   self->color_matrix = *color_matrix;
   self->color_offset = *color_offset;
 }
+
+void
+gsk_vulkan_color_matrix_op_opacity (GskVulkanRenderPass    *render_pass,
+                                    const char             *clip_type,
+                                    GskVulkanImage         *image,
+                                    const graphene_rect_t  *rect,
+                                    const graphene_point_t *offset,
+                                    const graphene_rect_t  *tex_rect,
+                                    float                   opacity)
+{
+  graphene_matrix_t color_matrix;
+  graphene_vec4_t color_offset;
+
+  graphene_matrix_init_from_float (&color_matrix,
+                                   (float[16]) {
+                                       1.0, 0.0, 0.0, 0.0,
+                                       0.0, 1.0, 0.0, 0.0,
+                                       0.0, 0.0, 1.0, 0.0,
+                                       0.0, 0.0, 0.0, opacity
+                                   });
+  graphene_vec4_init (&color_offset, 0.0, 0.0, 0.0, 0.0);
+
+  gsk_vulkan_color_matrix_op (render_pass,
+                              clip_type,
+                              image,
+                              rect,
+                              offset,
+                              tex_rect,
+                              &color_matrix,
+                              &color_offset);
+}
+
index 384b251061f08502fae085436428c3130f803aef..e5d4cf4c6215b20c87eaf317732a7b2a4da66b79 100644 (file)
@@ -13,6 +13,14 @@ void                    gsk_vulkan_color_matrix_op                      (GskVulk
                                                                          const graphene_matrix_t        *color_matrix,
                                                                          const graphene_vec4_t          *color_offset);
 
+void                    gsk_vulkan_color_matrix_op_opacity              (GskVulkanRenderPass            *render_pass,
+                                                                         const char                     *clip_type,
+                                                                         GskVulkanImage                 *image,
+                                                                         const graphene_rect_t          *rect,
+                                                                         const graphene_point_t         *offset,
+                                                                         const graphene_rect_t          *tex_rect,
+                                                                         float                           opacity);
+
 
 G_END_DECLS
 
diff --git a/gsk/vulkan/gskvulkancrossfadeop.c b/gsk/vulkan/gskvulkancrossfadeop.c
new file mode 100644 (file)
index 0000000..030da86
--- /dev/null
@@ -0,0 +1,159 @@
+#include "config.h"
+
+#include "gskvulkancrossfadeopprivate.h"
+
+#include "vulkan/resources/cross-fade.vert.h"
+
+typedef struct _GskVulkanCrossFadeOp GskVulkanCrossFadeOp;
+
+struct _GskVulkanCrossFadeOp
+{
+  GskVulkanOp op;
+
+  graphene_rect_t bounds;
+  float progress;
+
+  struct {
+    GskVulkanImage *image;
+    graphene_rect_t rect;
+    graphene_rect_t tex_rect;
+    guint32 image_descriptor;
+  } start, end;
+
+  gsize vertex_offset;
+};
+
+static void
+gsk_vulkan_cross_fade_op_finish (GskVulkanOp *op)
+{
+  GskVulkanCrossFadeOp *self = (GskVulkanCrossFadeOp *) op;
+
+  g_object_unref (self->start.image);
+  g_object_unref (self->end.image);
+}
+
+static void
+gsk_vulkan_cross_fade_op_upload (GskVulkanOp           *op,
+                                 GskVulkanRenderPass   *pass,
+                                 GskVulkanRender       *render,
+                                 GskVulkanUploader     *uploader,
+                                 const graphene_rect_t *clip,
+                                 const graphene_vec2_t *scale)
+{
+}
+
+static inline gsize
+round_up (gsize number, gsize divisor)
+{
+  return (number + divisor - 1) / divisor * divisor;
+}
+
+static gsize
+gsk_vulkan_cross_fade_op_count_vertex_data (GskVulkanOp *op,
+                                            gsize        n_bytes)
+{
+  GskVulkanCrossFadeOp *self = (GskVulkanCrossFadeOp *) op;
+  gsize vertex_stride;
+
+  vertex_stride = gsk_vulkan_cross_fade_info.pVertexBindingDescriptions[0].stride;
+  n_bytes = round_up (n_bytes, vertex_stride);
+  self->vertex_offset = n_bytes;
+  n_bytes += vertex_stride;
+  return n_bytes;
+}
+
+static void
+gsk_vulkan_cross_fade_op_collect_vertex_data (GskVulkanOp         *op,
+                                              GskVulkanRenderPass *pass,
+                                              GskVulkanRender     *render,
+                                              guchar              *data)
+{
+  GskVulkanCrossFadeOp *self = (GskVulkanCrossFadeOp *) op;
+  GskVulkanCrossFadeInstance *instance = (GskVulkanCrossFadeInstance *) (data + self->vertex_offset);
+
+  gsk_vulkan_rect_to_float (&self->bounds, instance->rect);
+  gsk_vulkan_rect_to_float (&self->start.rect, instance->start_rect);
+  gsk_vulkan_rect_to_float (&self->end.rect, instance->end_rect);
+  gsk_vulkan_rect_to_float (&self->start.tex_rect, instance->start_tex_rect);
+  gsk_vulkan_rect_to_float (&self->end.tex_rect, instance->end_tex_rect);
+
+  instance->start_tex_id = self->start.image_descriptor;
+  instance->end_tex_id = self->end.image_descriptor;
+  instance->progress = self->progress;
+}
+
+static void
+gsk_vulkan_cross_fade_op_reserve_descriptor_sets (GskVulkanOp     *op,
+                                                  GskVulkanRender *render)
+{
+  GskVulkanCrossFadeOp *self = (GskVulkanCrossFadeOp *) op;
+
+  self->start.image_descriptor = gsk_vulkan_render_get_image_descriptor (render,
+                                                                         self->start.image,
+                                                                         GSK_VULKAN_SAMPLER_DEFAULT);
+  self->end.image_descriptor = gsk_vulkan_render_get_image_descriptor (render,
+                                                                       self->end.image,
+                                                                       GSK_VULKAN_SAMPLER_DEFAULT);
+}
+
+static VkPipeline
+gsk_vulkan_cross_fade_op_get_pipeline (GskVulkanOp *op)
+{
+  return VK_NULL_HANDLE;
+}
+
+static void
+gsk_vulkan_cross_fade_op_command (GskVulkanOp      *op,
+                                  GskVulkanRender  *render,
+                                  VkPipelineLayout  pipeline_layout,
+                                  VkCommandBuffer   command_buffer)
+{
+  GskVulkanCrossFadeOp *self = (GskVulkanCrossFadeOp *) op;
+
+  vkCmdDraw (command_buffer,
+             6, 1,
+             0, self->vertex_offset / gsk_vulkan_cross_fade_info.pVertexBindingDescriptions[0].stride);
+}
+
+static const GskVulkanOpClass GSK_VULKAN_CROSS_FADE_OP_CLASS = {
+  GSK_VULKAN_OP_SIZE (GskVulkanCrossFadeOp),
+  "cross-fade",
+  &gsk_vulkan_cross_fade_info,
+  gsk_vulkan_cross_fade_op_finish,
+  gsk_vulkan_cross_fade_op_upload,
+  gsk_vulkan_cross_fade_op_count_vertex_data,
+  gsk_vulkan_cross_fade_op_collect_vertex_data,
+  gsk_vulkan_cross_fade_op_reserve_descriptor_sets,
+  gsk_vulkan_cross_fade_op_get_pipeline,
+  gsk_vulkan_cross_fade_op_command
+};
+
+void
+gsk_vulkan_cross_fade_op (GskVulkanRenderPass    *render_pass,
+                          const char             *clip_type,
+                          const graphene_rect_t  *bounds,
+                          const graphene_point_t *offset,
+                          float                   progress,
+                          GskVulkanImage         *start_image,
+                          const graphene_rect_t  *start_rect,
+                          const graphene_rect_t  *start_tex_rect,
+                          GskVulkanImage         *end_image,
+                          const graphene_rect_t  *end_rect,
+                          const graphene_rect_t  *end_tex_rect)
+{
+  GskVulkanCrossFadeOp *self;
+
+  self = (GskVulkanCrossFadeOp *) gsk_vulkan_op_alloc (render_pass, &GSK_VULKAN_CROSS_FADE_OP_CLASS);
+
+  ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
+  graphene_rect_offset_r (bounds, offset->x, offset->y, &self->bounds);
+  self->progress = progress;
+
+  self->start.image = g_object_ref (start_image);
+  graphene_rect_offset_r (start_rect, offset->x, offset->y, &self->start.rect);
+  gsk_vulkan_normalize_tex_coords (&self->start.tex_rect, bounds, start_tex_rect);
+
+  self->end.image = g_object_ref (end_image);
+  graphene_rect_offset_r (end_rect, offset->x, offset->y, &self->end.rect);
+  gsk_vulkan_normalize_tex_coords (&self->end.tex_rect, bounds, end_tex_rect);
+}
diff --git a/gsk/vulkan/gskvulkancrossfadeopprivate.h b/gsk/vulkan/gskvulkancrossfadeopprivate.h
new file mode 100644 (file)
index 0000000..00f9913
--- /dev/null
@@ -0,0 +1,21 @@
+#pragma once
+
+#include "gskvulkanopprivate.h"
+
+G_BEGIN_DECLS
+
+void                    gsk_vulkan_cross_fade_op                        (GskVulkanRenderPass            *render_pass,
+                                                                         const char                     *clip_type,
+                                                                         const graphene_rect_t          *bounds,
+                                                                         const graphene_point_t         *offset,
+                                                                         float                           progress,
+                                                                         GskVulkanImage                 *start_image,
+                                                                         const graphene_rect_t          *start_rect,
+                                                                         const graphene_rect_t          *start_tex_rect,
+                                                                         GskVulkanImage                 *end_image,
+                                                                         const graphene_rect_t          *end_rect,
+                                                                         const graphene_rect_t          *end_tex_rect);
+
+
+G_END_DECLS
+
diff --git a/gsk/vulkan/gskvulkancrossfadepipeline.c b/gsk/vulkan/gskvulkancrossfadepipeline.c
deleted file mode 100644 (file)
index 1659825..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-#include "config.h"
-
-#include "gskvulkancrossfadepipelineprivate.h"
-
-#include "vulkan/resources/cross-fade.vert.h"
-
-struct _GskVulkanCrossFadePipeline
-{
-  GObject parent_instance;
-};
-
-G_DEFINE_TYPE (GskVulkanCrossFadePipeline, gsk_vulkan_cross_fade_pipeline, GSK_TYPE_VULKAN_PIPELINE)
-
-static const VkPipelineVertexInputStateCreateInfo *
-gsk_vulkan_cross_fade_pipeline_get_input_state_create_info (GskVulkanPipeline *self)
-{
-  return &gsk_vulkan_cross_fade_info;
-}
-
-static void
-gsk_vulkan_cross_fade_pipeline_finalize (GObject *gobject)
-{
-  //GskVulkanCrossFadePipeline *self = GSK_VULKAN_BLUR_PIPELINE (gobject);
-
-  G_OBJECT_CLASS (gsk_vulkan_cross_fade_pipeline_parent_class)->finalize (gobject);
-}
-
-static void
-gsk_vulkan_cross_fade_pipeline_class_init (GskVulkanCrossFadePipelineClass *klass)
-{
-  GskVulkanPipelineClass *pipeline_class = GSK_VULKAN_PIPELINE_CLASS (klass);
-
-  G_OBJECT_CLASS (klass)->finalize = gsk_vulkan_cross_fade_pipeline_finalize;
-
-  pipeline_class->get_input_state_create_info = gsk_vulkan_cross_fade_pipeline_get_input_state_create_info;
-}
-
-static void
-gsk_vulkan_cross_fade_pipeline_init (GskVulkanCrossFadePipeline *self)
-{
-}
-
-GskVulkanPipeline *
-gsk_vulkan_cross_fade_pipeline_new (GdkVulkanContext        *context,
-                                    VkPipelineLayout         layout,
-                                    const char              *shader_name,
-                                    VkRenderPass             render_pass)
-{
-  return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_CROSS_FADE_PIPELINE, context, layout, shader_name, render_pass);
-}
-
-void
-gsk_vulkan_cross_fade_pipeline_collect_vertex_data (GskVulkanCrossFadePipeline *pipeline,
-                                                    guchar                     *data,
-                                                    guint32                     start_tex_id,
-                                                    guint32                     end_tex_id,
-                                                    const graphene_point_t     *offset,
-                                                    const graphene_rect_t      *bounds,
-                                                    const graphene_rect_t      *start_bounds,
-                                                    const graphene_rect_t      *end_bounds,
-                                                    const graphene_rect_t      *start_tex_rect,
-                                                    const graphene_rect_t      *end_tex_rect,
-                                                    double                      progress)
-{
-  GskVulkanCrossFadeInstance *instance = (GskVulkanCrossFadeInstance *) data;
-
-  instance->rect[0] = bounds->origin.x + offset->x;
-  instance->rect[1] = bounds->origin.y + offset->y;
-  instance->rect[2] = bounds->size.width;
-  instance->rect[3] = bounds->size.height;
-
-  instance->start_rect[0] = start_bounds->origin.x + offset->x;
-  instance->start_rect[1] = start_bounds->origin.y + offset->y;
-  instance->start_rect[2] = start_bounds->size.width;
-  instance->start_rect[3] = start_bounds->size.height;
-
-  instance->end_rect[0] = end_bounds->origin.x + offset->x;
-  instance->end_rect[1] = end_bounds->origin.y + offset->y;
-  instance->end_rect[2] = end_bounds->size.width;
-  instance->end_rect[3] = end_bounds->size.height;
-
-  instance->start_tex_rect[0] = start_tex_rect->origin.x;
-  instance->start_tex_rect[1] = start_tex_rect->origin.y;
-  instance->start_tex_rect[2] = start_tex_rect->size.width;
-  instance->start_tex_rect[3] = start_tex_rect->size.height;
-
-  instance->end_tex_rect[0] = end_tex_rect->origin.x;
-  instance->end_tex_rect[1] = end_tex_rect->origin.y;
-  instance->end_tex_rect[2] = end_tex_rect->size.width;
-  instance->end_tex_rect[3] = end_tex_rect->size.height;
-
-  instance->start_tex_id = start_tex_id;
-  instance->end_tex_id = end_tex_id;
-  instance->progress = progress;
-}
-
-gsize
-gsk_vulkan_cross_fade_pipeline_draw (GskVulkanCrossFadePipeline *pipeline,
-                                     VkCommandBuffer        command_buffer,
-                                     gsize                  offset,
-                                     gsize                  n_commands)
-{
-  vkCmdDraw (command_buffer,
-             6, n_commands,
-             0, offset);
-
-  return n_commands;
-}
diff --git a/gsk/vulkan/gskvulkancrossfadepipelineprivate.h b/gsk/vulkan/gskvulkancrossfadepipelineprivate.h
deleted file mode 100644 (file)
index 858e6dc..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-#pragma once
-
-#include <graphene.h>
-
-#include "gskvulkanpipelineprivate.h"
-
-G_BEGIN_DECLS
-
-typedef struct _GskVulkanCrossFadePipelineLayout GskVulkanCrossFadePipelineLayout;
-
-#define GSK_TYPE_VULKAN_CROSS_FADE_PIPELINE (gsk_vulkan_cross_fade_pipeline_get_type ())
-
-G_DECLARE_FINAL_TYPE (GskVulkanCrossFadePipeline, gsk_vulkan_cross_fade_pipeline, GSK, VULKAN_CROSS_FADE_PIPELINE, GskVulkanPipeline)
-
-GskVulkanPipeline * gsk_vulkan_cross_fade_pipeline_new                 (GdkVulkanContext           *context,
-                                                                        VkPipelineLayout            layout,
-                                                                        const char                 *shader_name,
-                                                                        VkRenderPass                render_pass);
-
-void                gsk_vulkan_cross_fade_pipeline_collect_vertex_data (GskVulkanCrossFadePipeline *pipeline,
-                                                                        guchar                     *data,
-                                                                        guint32                     start_tex_id,
-                                                                        guint32                     end_tex_id,
-                                                                        const graphene_point_t     *offset,
-                                                                        const graphene_rect_t      *bounds,
-                                                                        const graphene_rect_t      *start_bounds,
-                                                                        const graphene_rect_t      *end_bounds,
-                                                                        const graphene_rect_t      *start_tex_rect,
-                                                                        const graphene_rect_t      *end_tex_rect,
-                                                                        double                      progress);
-gsize               gsk_vulkan_cross_fade_pipeline_draw                (GskVulkanCrossFadePipeline *pipeline,
-                                                                        VkCommandBuffer             command_buffer,
-                                                                        gsize                       offset,
-                                                                        gsize                       n_commands);
-
-G_END_DECLS
-
index a157aed42deb241532272a5b2536b16aaa90f59e..6d04f53d0d823aadd5df71feea3c5935a60674f6 100644 (file)
@@ -886,23 +886,13 @@ gsk_vulkan_render_pass_add_opacity_node (GskVulkanRenderPass       *self,
   if (image == NULL)
     return TRUE;
 
-  graphene_matrix_init_from_float (&color_matrix,
-                                   (float[16]) {
-                                       1.0, 0.0, 0.0, 0.0,
-                                       0.0, 1.0, 0.0, 0.0,
-                                       0.0, 0.0, 1.0, 0.0,
-                                       0.0, 0.0, 0.0, gsk_opacity_node_get_opacity (node)
-                                   });
-  graphene_vec4_init (&color_offset, 0.0, 0.0, 0.0, 0.0);
-
-  gsk_vulkan_color_matrix_op (self,
-                              gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
-                              image,
-                              &node->bounds,
-                              &state->offset,
-                              &tex_rect,
-                              &color_matrix,
-                              &color_offset);
+  gsk_vulkan_color_matrix_op_opacity (self,
+                                      gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
+                                      image,
+                                      &node->bounds,
+                                      &state->offset,
+                                      &tex_rect,
+                                      gsk_opacity_node_get_opacity (node));
 
   return TRUE;
 }