This was the last user of GskVulkanOpRender, so delete that one, too.
'vulkan/gskvulkanglyphcache.c',
'vulkan/gskvulkanimage.c',
'vulkan/gskvulkaninsetshadowop.c',
- 'vulkan/gskvulkanlineargradientpipeline.c',
+ 'vulkan/gskvulkanlineargradientop.c',
'vulkan/gskvulkanmemory.c',
'vulkan/gskvulkanoffscreenop.c',
'vulkan/gskvulkanop.c',
--- /dev/null
+#include "config.h"
+
+#include "gskvulkanlineargradientopprivate.h"
+
+#include "vulkan/resources/linear.vert.h"
+
+typedef struct _GskVulkanLinearGradientOp GskVulkanLinearGradientOp;
+
+struct _GskVulkanLinearGradientOp
+{
+ GskVulkanOp op;
+
+ graphene_rect_t rect;
+ graphene_point_t start;
+ graphene_point_t end;
+ gboolean repeating;
+ GskColorStop *stops;
+ gsize n_stops;
+
+ gsize buffer_offset;
+ gsize vertex_offset;
+};
+
+static void
+gsk_vulkan_linear_gradient_op_finish (GskVulkanOp *op)
+{
+ GskVulkanLinearGradientOp *self = (GskVulkanLinearGradientOp *) op;
+
+ g_free (self->stops);
+}
+
+static void
+gsk_vulkan_linear_gradient_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_linear_gradient_op_count_vertex_data (GskVulkanOp *op,
+ gsize n_bytes)
+{
+ GskVulkanLinearGradientOp *self = (GskVulkanLinearGradientOp *) op;
+ gsize vertex_stride;
+
+ vertex_stride = gsk_vulkan_linear_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_linear_gradient_op_collect_vertex_data (GskVulkanOp *op,
+ GskVulkanRenderPass *pass,
+ GskVulkanRender *render,
+ guchar *data)
+{
+ GskVulkanLinearGradientOp *self = (GskVulkanLinearGradientOp *) op;
+ GskVulkanLinearInstance *instance = (GskVulkanLinearInstance *) (data + self->vertex_offset);
+
+ gsk_vulkan_rect_to_float (&self->rect, instance->rect);
+ gsk_vulkan_point_to_float (&self->start, instance->start);
+ gsk_vulkan_point_to_float (&self->end, instance->end);
+ instance->repeating = self->repeating;
+ instance->stop_offset = self->buffer_offset;
+ instance->stop_count = self->n_stops;
+}
+
+static void
+gsk_vulkan_linear_gradient_op_reserve_descriptor_sets (GskVulkanOp *op,
+ GskVulkanRender *render)
+{
+ GskVulkanLinearGradientOp *self = (GskVulkanLinearGradientOp *) op;
+ guchar *mem;
+
+ mem = gsk_vulkan_render_get_buffer_memory (render,
+ self->n_stops * sizeof (GskColorStop),
+ G_ALIGNOF (GskColorStop),
+ &self->buffer_offset);
+ memcpy (mem, self->stops, self->n_stops * sizeof (GskColorStop));
+}
+
+static VkPipeline
+gsk_vulkan_linear_gradient_op_get_pipeline (GskVulkanOp *op)
+{
+ return VK_NULL_HANDLE;
+}
+
+static void
+gsk_vulkan_linear_gradient_op_command (GskVulkanOp *op,
+ GskVulkanRender *render,
+ VkPipelineLayout pipeline_layout,
+ VkCommandBuffer command_buffer)
+{
+ GskVulkanLinearGradientOp *self = (GskVulkanLinearGradientOp *) op;
+
+ vkCmdDraw (command_buffer,
+ 6, 1,
+ 0, self->vertex_offset / gsk_vulkan_linear_info.pVertexBindingDescriptions[0].stride);
+}
+
+static const GskVulkanOpClass GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS = {
+ GSK_VULKAN_OP_SIZE (GskVulkanLinearGradientOp),
+ "linear",
+ &gsk_vulkan_linear_info,
+ gsk_vulkan_linear_gradient_op_finish,
+ gsk_vulkan_linear_gradient_op_upload,
+ gsk_vulkan_linear_gradient_op_count_vertex_data,
+ gsk_vulkan_linear_gradient_op_collect_vertex_data,
+ gsk_vulkan_linear_gradient_op_reserve_descriptor_sets,
+ gsk_vulkan_linear_gradient_op_get_pipeline,
+ gsk_vulkan_linear_gradient_op_command
+};
+
+void
+gsk_vulkan_linear_gradient_op (GskVulkanRenderPass *render_pass,
+ const char *clip_type,
+ const graphene_rect_t *rect,
+ const graphene_point_t *offset,
+ const graphene_point_t *start,
+ const graphene_point_t *end,
+ gboolean repeating,
+ const GskColorStop *stops,
+ gsize n_stops)
+{
+ GskVulkanLinearGradientOp *self;
+
+ self = (GskVulkanLinearGradientOp *) gsk_vulkan_op_alloc (render_pass, &GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS);
+
+ ((GskVulkanOp *) 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);
+ self->repeating = repeating;
+ self->stops = g_memdup (stops, sizeof (GskColorStop) * n_stops);
+ self->n_stops = n_stops;
+}
--- /dev/null
+#pragma once
+
+#include "gskvulkanopprivate.h"
+
+G_BEGIN_DECLS
+
+void gsk_vulkan_linear_gradient_op (GskVulkanRenderPass *render_pass,
+ const char *clip_type,
+ const graphene_rect_t *rect,
+ const graphene_point_t *offset,
+ const graphene_point_t *start,
+ const graphene_point_t *end,
+ gboolean repeating,
+ const GskColorStop *stops,
+ gsize n_stops);
+
+
+G_END_DECLS
+
+++ /dev/null
-#include "config.h"
-
-#include "gskvulkanlineargradientpipelineprivate.h"
-
-#include "vulkan/resources/linear.vert.h"
-
-struct _GskVulkanLinearGradientPipeline
-{
- GObject parent_instance;
-};
-
-G_DEFINE_TYPE (GskVulkanLinearGradientPipeline, gsk_vulkan_linear_gradient_pipeline, GSK_TYPE_VULKAN_PIPELINE)
-
-static const VkPipelineVertexInputStateCreateInfo *
-gsk_vulkan_linear_gradient_pipeline_get_input_state_create_info (GskVulkanPipeline *self)
-{
- return &gsk_vulkan_linear_info;
-}
-
-static void
-gsk_vulkan_linear_gradient_pipeline_finalize (GObject *gobject)
-{
- //GskVulkanLinearGradientPipeline *self = GSK_VULKAN_LINEAR_GRADIENT_PIPELINE (gobject);
-
- G_OBJECT_CLASS (gsk_vulkan_linear_gradient_pipeline_parent_class)->finalize (gobject);
-}
-
-static void
-gsk_vulkan_linear_gradient_pipeline_class_init (GskVulkanLinearGradientPipelineClass *klass)
-{
- GskVulkanPipelineClass *pipeline_class = GSK_VULKAN_PIPELINE_CLASS (klass);
-
- G_OBJECT_CLASS (klass)->finalize = gsk_vulkan_linear_gradient_pipeline_finalize;
-
- pipeline_class->get_input_state_create_info = gsk_vulkan_linear_gradient_pipeline_get_input_state_create_info;
-}
-
-static void
-gsk_vulkan_linear_gradient_pipeline_init (GskVulkanLinearGradientPipeline *self)
-{
-}
-
-GskVulkanPipeline *
-gsk_vulkan_linear_gradient_pipeline_new (GdkVulkanContext *context,
- VkPipelineLayout layout,
- const char *shader_name,
- VkRenderPass render_pass)
-{
- return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_LINEAR_GRADIENT_PIPELINE, context, layout, shader_name, render_pass);
-}
-
-void
-gsk_vulkan_linear_gradient_pipeline_collect_vertex_data (GskVulkanLinearGradientPipeline *pipeline,
- guchar *data,
- const graphene_point_t *offset,
- const graphene_rect_t *rect,
- const graphene_point_t *start,
- const graphene_point_t *end,
- gboolean repeating,
- gsize gradient_offset,
- gsize n_stops)
-{
- GskVulkanLinearInstance *instance = (GskVulkanLinearInstance *) data;
-
- instance->rect[0] = rect->origin.x + offset->x;
- instance->rect[1] = rect->origin.y + offset->y;
- instance->rect[2] = rect->size.width;
- instance->rect[3] = rect->size.height;
- instance->start[0] = start->x + offset->x;
- instance->start[1] = start->y + offset->y;
- instance->end[0] = end->x + offset->x;
- instance->end[1] = end->y + offset->y;
- instance->repeating = repeating;
- instance->stop_offset = gradient_offset;
- instance->stop_count = n_stops;
-}
-
-gsize
-gsk_vulkan_linear_gradient_pipeline_draw (GskVulkanLinearGradientPipeline *pipeline,
- VkCommandBuffer command_buffer,
- gsize offset,
- gsize n_commands)
-{
- vkCmdDraw (command_buffer,
- 6, n_commands,
- 0, offset);
-
- return n_commands;
-}
+++ /dev/null
-#pragma once
-
-#include <graphene.h>
-
-#include "gskvulkanpipelineprivate.h"
-#include "gskrendernode.h"
-
-G_BEGIN_DECLS
-
-#define GSK_VULKAN_LINEAR_GRADIENT_PIPELINE_MAX_COLOR_STOPS 8
-
-typedef struct _GskVulkanLinearGradientPipelineLayout GskVulkanLinearGradientPipelineLayout;
-
-#define GSK_TYPE_VULKAN_LINEAR_GRADIENT_PIPELINE (gsk_vulkan_linear_gradient_pipeline_get_type ())
-
-G_DECLARE_FINAL_TYPE (GskVulkanLinearGradientPipeline, gsk_vulkan_linear_gradient_pipeline, GSK, VULKAN_LINEAR_GRADIENT_PIPELINE, GskVulkanPipeline)
-
-GskVulkanPipeline * gsk_vulkan_linear_gradient_pipeline_new (GdkVulkanContext *context,
- VkPipelineLayout layout,
- const char *shader_name,
- VkRenderPass render_pass);
-
-void gsk_vulkan_linear_gradient_pipeline_collect_vertex_data
- (GskVulkanLinearGradientPipeline*pipeline,
- guchar *data,
- const graphene_point_t *offset,
- const graphene_rect_t *rect,
- const graphene_point_t *start,
- const graphene_point_t *end,
- gboolean repeating,
- gsize gradient_offset,
- gsize n_stops);
-gsize gsk_vulkan_linear_gradient_pipeline_draw (GskVulkanLinearGradientPipeline*pipeline,
- VkCommandBuffer command_buffer,
- gsize offset,
- gsize n_commands);
-
-G_END_DECLS
-
#include "gskvulkanrenderpassprivate.h"
#include "gskvulkancolortextpipelineprivate.h"
-#include "gskvulkanlineargradientpipelineprivate.h"
#include "gskvulkantextpipelineprivate.h"
#include "gskvulkanpushconstantsprivate.h"
guint num_textures;
GskVulkanPipeline * (* create_func) (GdkVulkanContext *context, VkPipelineLayout layout, const char *name, VkRenderPass render_pass);
} pipeline_info[GSK_VULKAN_N_PIPELINES] = {
- { "linear", 0, gsk_vulkan_linear_gradient_pipeline_new },
- { "linear-clip", 0, gsk_vulkan_linear_gradient_pipeline_new },
- { "linear-clip-rounded", 0, gsk_vulkan_linear_gradient_pipeline_new },
{ "mask", 1, gsk_vulkan_text_pipeline_new },
{ "mask-clip", 1, gsk_vulkan_text_pipeline_new },
{ "mask-clip-rounded", 1, gsk_vulkan_text_pipeline_new },
#include "gskvulkancolortextpipelineprivate.h"
#include "gskvulkancrossfadeopprivate.h"
#include "gskvulkaninsetshadowopprivate.h"
-#include "gskvulkanlineargradientpipelineprivate.h"
+#include "gskvulkanlineargradientopprivate.h"
#include "gskvulkanopprivate.h"
#include "gskvulkanrendererprivate.h"
#include "gskvulkantextpipelineprivate.h"
typedef struct _GskVulkanOpAny GskVulkanOpAny;
typedef union _GskVulkanOpAll GskVulkanOpAll;
-typedef struct _GskVulkanOpRender GskVulkanOpRender;
typedef struct _GskVulkanOpText GskVulkanOpText;
typedef struct _GskVulkanOpPushConstants GskVulkanOpPushConstants;
typedef enum {
- /* GskVulkanOpRender */
- GSK_VULKAN_OP_LINEAR_GRADIENT,
/* GskVulkanOpText */
GSK_VULKAN_OP_TEXT,
GSK_VULKAN_OP_COLOR_TEXT,
GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS,
} GskVulkanOpType;
-/* render ops with 0, 1 or 2 sources */
-struct _GskVulkanOpRender
-{
- GskVulkanOp base;
- GskVulkanOpType type;
- GskRenderNode *node; /* node that's the source of this op */
- graphene_point_t offset; /* offset of the node */
- GskVulkanPipeline *pipeline; /* pipeline to use */
- gsize vertex_offset; /* offset into vertex buffer */
- gsize buffer_offset; /* offset into buffer */
-};
-
struct _GskVulkanOpText
{
GskVulkanOp base;
union _GskVulkanOpAll
{
GskVulkanOpAny any;
- GskVulkanOpRender render;
GskVulkanOpText text;
GskVulkanOpPushConstants constants;
};
const GskVulkanParseState *state,
GskRenderNode *node)
{
- GskVulkanPipelineType pipeline_type;
- GskVulkanOpRender op = {
- .type = GSK_VULKAN_OP_LINEAR_GRADIENT,
- .node = node,
- .offset = state->offset,
- };
-
- if (gsk_vulkan_clip_contains_rect (&state->clip, &state->offset, &node->bounds))
- pipeline_type = GSK_VULKAN_PIPELINE_LINEAR_GRADIENT;
- else if (state->clip.type == GSK_VULKAN_CLIP_RECT)
- pipeline_type = GSK_VULKAN_PIPELINE_LINEAR_GRADIENT_CLIP;
- else
- pipeline_type = GSK_VULKAN_PIPELINE_LINEAR_GRADIENT_CLIP_ROUNDED;
-
- op.pipeline = gsk_vulkan_render_pass_get_pipeline (self, render, pipeline_type);
- gsk_vulkan_render_pass_add_op (self, (GskVulkanOp *) &op);
-
+ gsk_vulkan_linear_gradient_op (self,
+ gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
+ &node->bounds,
+ &state->offset,
+ gsk_linear_gradient_node_get_start (node),
+ gsk_linear_gradient_node_get_end (node),
+ gsk_render_node_get_node_type (node) == GSK_REPEATING_LINEAR_GRADIENT_NODE,
+ gsk_linear_gradient_node_get_color_stops (node, NULL),
+ gsk_linear_gradient_node_get_n_color_stops (node));
return TRUE;
}
default:
g_assert_not_reached ();
case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS:
- case GSK_VULKAN_OP_LINEAR_GRADIENT:
break;
}
}
switch (op->any.type)
{
- case GSK_VULKAN_OP_LINEAR_GRADIENT:
- vertex_stride = gsk_vulkan_pipeline_get_vertex_stride (op->render.pipeline);
- n_bytes = round_up (n_bytes, vertex_stride);
- op->render.vertex_offset = n_bytes;
- n_bytes += vertex_stride;
- break;
-
case GSK_VULKAN_OP_TEXT:
case GSK_VULKAN_OP_COLOR_TEXT:
- vertex_stride = gsk_vulkan_pipeline_get_vertex_stride (op->render.pipeline);
+ vertex_stride = gsk_vulkan_pipeline_get_vertex_stride (op->text.pipeline);
n_bytes = round_up (n_bytes, vertex_stride);
op->text.vertex_offset = n_bytes;
n_bytes += vertex_stride * op->text.num_glyphs;
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
+ gsk_text_node_get_offset (op->text.node)->x + op->text.offset.x,
+ gsk_text_node_get_offset (op->text.node)->y + op->text.offset.y
),
op->text.start_glyph,
op->text.num_glyphs,
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
+ gsk_text_node_get_offset (op->text.node)->x + op->text.offset.x,
+ gsk_text_node_get_offset (op->text.node)->y + op->text.offset.y
),
op->text.start_glyph,
op->text.num_glyphs,
op->text.scale);
break;
- case GSK_VULKAN_OP_LINEAR_GRADIENT:
- 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,
- op->render.buffer_offset,
- gsk_linear_gradient_node_get_n_color_stops (op->render.node));
- break;
-
default:
g_assert_not_reached ();
case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS:
GSK_VULKAN_SAMPLER_DEFAULT);
break;
- case GSK_VULKAN_OP_LINEAR_GRADIENT:
- {
- gsize n_stops = gsk_linear_gradient_node_get_n_color_stops (op->render.node);
- guchar *mem;
-
- mem = gsk_vulkan_render_get_buffer_memory (render,
- n_stops * sizeof (GskColorStop),
- G_ALIGNOF (GskColorStop),
- &op->render.buffer_offset);
- memcpy (mem,
- gsk_linear_gradient_node_get_color_stops (op->render.node, NULL),
- n_stops * sizeof (GskColorStop));
- }
- break;
-
default:
g_assert_not_reached ();
switch (op->any.type)
{
- case GSK_VULKAN_OP_LINEAR_GRADIENT:
- return gsk_vulkan_pipeline_get_pipeline (op->render.pipeline);
-
case GSK_VULKAN_OP_TEXT:
case GSK_VULKAN_OP_COLOR_TEXT:
return gsk_vulkan_pipeline_get_pipeline (op->text.pipeline);
op->text.num_glyphs);
break;
- case GSK_VULKAN_OP_LINEAR_GRADIENT:
- gsk_vulkan_linear_gradient_pipeline_draw (GSK_VULKAN_LINEAR_GRADIENT_PIPELINE (op->render.pipeline),
- command_buffer,
- op->render.vertex_offset / gsk_vulkan_pipeline_get_vertex_stride (op->render.pipeline),
- 1);
- break;
-
case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS:
gsk_vulkan_push_constants_push (command_buffer,
pipeline_layout,
G_BEGIN_DECLS
typedef enum {
- GSK_VULKAN_PIPELINE_LINEAR_GRADIENT,
- GSK_VULKAN_PIPELINE_LINEAR_GRADIENT_CLIP,
- GSK_VULKAN_PIPELINE_LINEAR_GRADIENT_CLIP_ROUNDED,
GSK_VULKAN_PIPELINE_TEXT,
GSK_VULKAN_PIPELINE_TEXT_CLIP,
GSK_VULKAN_PIPELINE_TEXT_CLIP_ROUNDED,