'vulkan/gskvulkanrender.c',
'vulkan/gskvulkanrenderer.c',
'vulkan/gskvulkanrenderpass.c',
+ 'vulkan/gskvulkanscissorop.c',
'vulkan/gskvulkanshader.c',
'vulkan/gskvulkantextpipeline.c',
'vulkan/gskvulkantexturepipeline.c',
#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)
{
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,
#include "gskvulkantexturepipelineprivate.h"
#include "gskvulkanimageprivate.h"
#include "gskvulkanpushconstantsprivate.h"
+#include "gskvulkanscissoropprivate.h"
#include "gskvulkanrendererprivate.h"
#include "gskprivate.h"
typedef struct _GskVulkanOpRender GskVulkanOpRender;
typedef struct _GskVulkanOpText GskVulkanOpText;
typedef struct _GskVulkanOpPushConstants GskVulkanOpPushConstants;
-typedef struct _GskVulkanOpScissor GskVulkanOpScissor;
typedef enum {
/* GskVulkanOpRender */
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 */
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;
GskVulkanOpRender render;
GskVulkanOpText text;
GskVulkanOpPushConstants constants;
- GskVulkanOpScissor scissor;
};
struct _GskVulkanRenderPass
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)
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
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)
{
g_assert_not_reached ();
case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS:
- case GSK_VULKAN_OP_SCISSOR:
break;
}
default:
g_assert_not_reached ();
case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS:
- case GSK_VULKAN_OP_SCISSOR:
break;
}
}
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;
}
}
return op->text.pipeline;
case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS:
- case GSK_VULKAN_OP_SCISSOR:
return NULL;
default:
&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;
--- /dev/null
+#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;
+}
--- /dev/null
+#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
+