#include "gdk/gdkvulkancontextprivate.h"
+#define GDK_ARRAY_NAME gsk_vulkan_render_ops
+#define GDK_ARRAY_TYPE_NAME GskVulkanRenderOps
+#define GDK_ARRAY_ELEMENT_TYPE guchar
+#define GDK_ARRAY_BY_VALUE 1
+#include "gdk/gdkarrayimpl.c"
+
#define ORTHO_NEAR_PLANE -10000
#define ORTHO_FAR_PLANE 10000
{
GdkVulkanContext *vulkan;
- GArray *render_ops;
+ GskVulkanRenderOps render_ops;
GskVulkanImage *target;
graphene_rect_t viewport;
self = g_new0 (GskVulkanRenderPass, 1);
self->vulkan = g_object_ref (context);
- self->render_ops = g_array_new (FALSE, FALSE, sizeof (GskVulkanOp));
+ gsk_vulkan_render_ops_init (&self->render_ops);
self->target = g_object_ref (target);
self->clip = cairo_region_copy (clip);
{
VkDevice device = gdk_vulkan_context_get_device (self->vulkan);
- g_array_unref (self->render_ops);
+ gsk_vulkan_render_ops_clear (&self->render_ops);
g_object_unref (self->vulkan);
g_object_unref (self->target);
cairo_region_destroy (self->clip);
gsk_vulkan_render_pass_add_op (GskVulkanRenderPass *self,
GskVulkanOp *op)
{
- g_array_append_val (self->render_ops, *op);
+ gsk_vulkan_render_ops_splice (&self->render_ops,
+ gsk_vulkan_render_ops_get_size (&self->render_ops),
+ 0, FALSE,
+ (guchar *) op,
+ sizeof (GskVulkanOp));
}
static void
const graphene_rect_t *clip = NULL;
const graphene_vec2_t *scale = NULL;
- for (i = 0; i < self->render_ops->len; i++)
+ for (i = 0; i < gsk_vulkan_render_ops_get_size (&self->render_ops); i += sizeof (GskVulkanOp))
{
- op = &g_array_index (self->render_ops, GskVulkanOp, i);
+ op = (GskVulkanOp *) gsk_vulkan_render_ops_index (&self->render_ops, i);
switch (op->type)
{
guint i;
n_bytes = 0;
- for (i = 0; i < self->render_ops->len; i++)
+ for (i = 0; i < gsk_vulkan_render_ops_get_size (&self->render_ops); i += sizeof (GskVulkanOp))
{
- op = &g_array_index (self->render_ops, GskVulkanOp, i);
+ op = (GskVulkanOp *) gsk_vulkan_render_ops_index (&self->render_ops, i);
switch (op->type)
{
GskVulkanOp *op;
guint i;
- for (i = 0; i < self->render_ops->len; i++)
+ for (i = 0; i < gsk_vulkan_render_ops_get_size (&self->render_ops); i += sizeof (GskVulkanOp))
{
- op = &g_array_index (self->render_ops, GskVulkanOp, i);
+ op = (GskVulkanOp *) gsk_vulkan_render_ops_index (&self->render_ops, i);
switch (op->type)
{
GskVulkanOp *op;
guint i;
- for (i = 0; i < self->render_ops->len; i++)
+ for (i = 0; i < gsk_vulkan_render_ops_get_size (&self->render_ops); i += sizeof (GskVulkanOp))
{
- op = &g_array_index (self->render_ops, GskVulkanOp, i);
+ op = (GskVulkanOp *) gsk_vulkan_render_ops_index (&self->render_ops, i);
switch (op->type)
{
{
GskVulkanPipeline *current_pipeline = NULL;
GskVulkanOp *op;
- guint i, step;
+ guint i;
GskVulkanBuffer *vertex_buffer;
vertex_buffer = gsk_vulkan_render_pass_get_vertex_data (self, render);
},
(VkDeviceSize[1]) { 0 });
- for (i = 0; i < self->render_ops->len; i += step)
+ for (i = 0; i < gsk_vulkan_render_ops_get_size (&self->render_ops); i += sizeof (GskVulkanOp))
{
- op = &g_array_index (self->render_ops, GskVulkanOp, i);
- step = 1;
+ op = (GskVulkanOp *) gsk_vulkan_render_ops_index (&self->render_ops, i);
switch (op->type)
{
gsk_vulkan_pipeline_get_pipeline (current_pipeline));
}
- for (step = 1; step + i < self->render_ops->len; step++)
- {
- GskVulkanOp *cmp = &g_array_index (self->render_ops, GskVulkanOp, i + step);
- if (cmp->type != GSK_VULKAN_OP_COLOR ||
- cmp->render.pipeline != current_pipeline)
- break;
- }
gsk_vulkan_color_pipeline_draw (GSK_VULKAN_COLOR_PIPELINE (current_pipeline),
command_buffer,
op->render.vertex_offset / gsk_vulkan_pipeline_get_vertex_stride (current_pipeline),
- step);
+ 1);
break;
case GSK_VULKAN_OP_LINEAR_GRADIENT: