};
void
-gsk_vulkan_blend_mode_op (GskVulkanRenderPass *render_pass,
+gsk_vulkan_blend_mode_op (GskVulkanRender *render,
const char *clip_type,
const graphene_rect_t *bounds,
const graphene_point_t *offset,
{
GskVulkanBlendModeOp *self;
- self = (GskVulkanBlendModeOp *) gsk_vulkan_op_alloc (render_pass, &GSK_VULKAN_BLEND_MODE_OP_CLASS);
+ self = (GskVulkanBlendModeOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_BLEND_MODE_OP_CLASS);
((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
graphene_rect_offset_r (bounds, offset->x, offset->y, &self->bounds);
G_BEGIN_DECLS
-void gsk_vulkan_blend_mode_op (GskVulkanRenderPass *render_pass,
+void gsk_vulkan_blend_mode_op (GskVulkanRender *render,
const char *clip_type,
const graphene_rect_t *bounds,
const graphene_point_t *offset,
};
void
-gsk_vulkan_blur_op (GskVulkanRenderPass *render_pass,
+gsk_vulkan_blur_op (GskVulkanRender *render,
const char *clip_type,
GskVulkanImage *image,
const graphene_rect_t *rect,
g_assert (radius > 0);
- self = (GskVulkanBlurOp *) gsk_vulkan_op_alloc (render_pass, &GSK_VULKAN_BLUR_OP_CLASS);
+ self = (GskVulkanBlurOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_BLUR_OP_CLASS);
((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
self->image = g_object_ref (image);
G_BEGIN_DECLS
-void gsk_vulkan_blur_op (GskVulkanRenderPass *render_pass,
+void gsk_vulkan_blur_op (GskVulkanRender *render,
const char *clip_type,
GskVulkanImage *image,
const graphene_rect_t *rect,
};
void
-gsk_vulkan_border_op (GskVulkanRenderPass *render_pass,
+gsk_vulkan_border_op (GskVulkanRender *render,
const char *clip_type,
const GskRoundedRect *outline,
const graphene_point_t *offset,
GskVulkanBorderOp *self;
guint i;
- self = (GskVulkanBorderOp *) gsk_vulkan_op_alloc (render_pass, &GSK_VULKAN_BORDER_OP_CLASS);
+ self = (GskVulkanBorderOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_BORDER_OP_CLASS);
((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
self->outline = *outline;
G_BEGIN_DECLS
-void gsk_vulkan_border_op (GskVulkanRenderPass *render_pass,
+void gsk_vulkan_border_op (GskVulkanRender *render,
const char *clip_type,
const GskRoundedRect *outline,
const graphene_point_t *offset,
};
void
-gsk_vulkan_color_matrix_op (GskVulkanRenderPass *render_pass,
+gsk_vulkan_color_matrix_op (GskVulkanRender *render,
const char *clip_type,
GskVulkanImage *image,
const graphene_rect_t *rect,
{
GskVulkanColorMatrixOp *self;
- self = (GskVulkanColorMatrixOp *) gsk_vulkan_op_alloc (render_pass, &GSK_VULKAN_COLOR_MATRIX_OP_CLASS);
+ self = (GskVulkanColorMatrixOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_COLOR_MATRIX_OP_CLASS);
((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
self->image = g_object_ref (image);
}
void
-gsk_vulkan_color_matrix_op_opacity (GskVulkanRenderPass *render_pass,
+gsk_vulkan_color_matrix_op_opacity (GskVulkanRender *render,
const char *clip_type,
GskVulkanImage *image,
const graphene_rect_t *rect,
});
graphene_vec4_init (&color_offset, 0.0, 0.0, 0.0, 0.0);
- gsk_vulkan_color_matrix_op (render_pass,
+ gsk_vulkan_color_matrix_op (render,
clip_type,
image,
rect,
G_BEGIN_DECLS
-void gsk_vulkan_color_matrix_op (GskVulkanRenderPass *render_pass,
+void gsk_vulkan_color_matrix_op (GskVulkanRender *render,
const char *clip_type,
GskVulkanImage *image,
const graphene_rect_t *rect,
const graphene_matrix_t *color_matrix,
const graphene_vec4_t *color_offset);
-void gsk_vulkan_color_matrix_op_opacity (GskVulkanRenderPass *render_pass,
+void gsk_vulkan_color_matrix_op_opacity (GskVulkanRender *render,
const char *clip_type,
GskVulkanImage *image,
const graphene_rect_t *rect,
};
void
-gsk_vulkan_color_op (GskVulkanRenderPass *render_pass,
+gsk_vulkan_color_op (GskVulkanRender *render,
const char *clip_type,
const graphene_rect_t *rect,
const graphene_point_t *offset,
{
GskVulkanColorOp *self;
- self = (GskVulkanColorOp *) gsk_vulkan_op_alloc (render_pass, &GSK_VULKAN_COLOR_OP_CLASS);
+ self = (GskVulkanColorOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_COLOR_OP_CLASS);
((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
graphene_rect_offset_r (rect, offset->x, offset->y, &self->rect);
G_BEGIN_DECLS
-void gsk_vulkan_color_op (GskVulkanRenderPass *render_pass,
+void gsk_vulkan_color_op (GskVulkanRender *render,
const char *clip_type,
const graphene_rect_t *rect,
const graphene_point_t *offset,
};
void
-gsk_vulkan_cross_fade_op (GskVulkanRenderPass *render_pass,
+gsk_vulkan_cross_fade_op (GskVulkanRender *render,
const char *clip_type,
const graphene_rect_t *bounds,
const graphene_point_t *offset,
{
GskVulkanCrossFadeOp *self;
- self = (GskVulkanCrossFadeOp *) gsk_vulkan_op_alloc (render_pass, &GSK_VULKAN_CROSS_FADE_OP_CLASS);
+ self = (GskVulkanCrossFadeOp *) gsk_vulkan_op_alloc (render, &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);
G_BEGIN_DECLS
-void gsk_vulkan_cross_fade_op (GskVulkanRenderPass *render_pass,
+void gsk_vulkan_cross_fade_op (GskVulkanRender *render,
const char *clip_type,
const graphene_rect_t *bounds,
const graphene_point_t *offset,
};
void
-gsk_vulkan_glyph_op (GskVulkanRenderPass *render_pass,
+gsk_vulkan_glyph_op (GskVulkanRender *render,
const char *clip_type,
GskVulkanImage *image,
const graphene_rect_t *rect,
{
GskVulkanGlyphOp *self;
- self = (GskVulkanGlyphOp *) gsk_vulkan_op_alloc (render_pass, &GSK_VULKAN_GLYPH_OP_CLASS);
+ self = (GskVulkanGlyphOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_GLYPH_OP_CLASS);
((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
self->image = g_object_ref (image);
G_BEGIN_DECLS
-void gsk_vulkan_glyph_op (GskVulkanRenderPass *render_pass,
+void gsk_vulkan_glyph_op (GskVulkanRender *render,
const char *clip_type,
GskVulkanImage *image,
const graphene_rect_t *rect,
};
void
-gsk_vulkan_inset_shadow_op (GskVulkanRenderPass *render_pass,
+gsk_vulkan_inset_shadow_op (GskVulkanRender *render,
const char *clip_type,
const GskRoundedRect *outline,
const graphene_point_t *offset,
{
GskVulkanInsetShadowOp *self;
- self = (GskVulkanInsetShadowOp *) gsk_vulkan_op_alloc (render_pass, &GSK_VULKAN_INSET_SHADOW_OP_CLASS);
+ self = (GskVulkanInsetShadowOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_INSET_SHADOW_OP_CLASS);
((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
self->outline = *outline;
G_BEGIN_DECLS
-void gsk_vulkan_inset_shadow_op (GskVulkanRenderPass *render_pass,
+void gsk_vulkan_inset_shadow_op (GskVulkanRender *render,
const char *clip_type,
const GskRoundedRect *outline,
const graphene_point_t *offset,
};
void
-gsk_vulkan_linear_gradient_op (GskVulkanRenderPass *render_pass,
+gsk_vulkan_linear_gradient_op (GskVulkanRender *render,
const char *clip_type,
const graphene_rect_t *rect,
const graphene_point_t *offset,
{
GskVulkanLinearGradientOp *self;
- self = (GskVulkanLinearGradientOp *) gsk_vulkan_op_alloc (render_pass, &GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS);
+ self = (GskVulkanLinearGradientOp *) gsk_vulkan_op_alloc (render, &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);
G_BEGIN_DECLS
-void gsk_vulkan_linear_gradient_op (GskVulkanRenderPass *render_pass,
+void gsk_vulkan_linear_gradient_op (GskVulkanRender *render,
const char *clip_type,
const graphene_rect_t *rect,
const graphene_point_t *offset,
};
void
-gsk_vulkan_mask_op (GskVulkanRenderPass *render_pass,
+gsk_vulkan_mask_op (GskVulkanRender *render,
const char *clip_type,
const graphene_point_t *offset,
GskVulkanImage *source,
{
GskVulkanMaskOp *self;
- self = (GskVulkanMaskOp *) gsk_vulkan_op_alloc (render_pass, &GSK_VULKAN_COLOR_MASK_OP_CLASS);
+ self = (GskVulkanMaskOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_COLOR_MASK_OP_CLASS);
((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
self->source.image = g_object_ref (source);
G_BEGIN_DECLS
-void gsk_vulkan_mask_op (GskVulkanRenderPass *render_pass,
+void gsk_vulkan_mask_op (GskVulkanRender *render,
const char *clip_type,
const graphene_point_t *offset,
GskVulkanImage *source,
gsk_vulkan_image_get_width (self->image),
gsk_vulkan_image_get_height (self->image));
print_newline (string);
-
- gsk_vulkan_render_pass_print (self->render_pass, string, indent + 1);
}
static void
gsk_vulkan_offscreen_op_upload (GskVulkanOp *op,
GskVulkanUploader *uploader)
{
- GskVulkanOffscreenOp *self = (GskVulkanOffscreenOp *) op;
-
- gsk_vulkan_render_pass_upload (self->render_pass, uploader);
}
static gsize
gsk_vulkan_offscreen_op_count_vertex_data (GskVulkanOp *op,
gsize n_bytes)
{
- GskVulkanOffscreenOp *self = (GskVulkanOffscreenOp *) op;
-
- return gsk_vulkan_render_pass_count_vertex_data (self->render_pass, n_bytes);
+ return n_bytes;
}
static void
gsk_vulkan_offscreen_op_collect_vertex_data (GskVulkanOp *op,
guchar *data)
{
- GskVulkanOffscreenOp *self = (GskVulkanOffscreenOp *) op;
-
- gsk_vulkan_render_pass_collect_vertex_data (self->render_pass, data);
}
static void
gsk_vulkan_offscreen_op_reserve_descriptor_sets (GskVulkanOp *op,
GskVulkanRender *render)
{
- GskVulkanOffscreenOp *self = (GskVulkanOffscreenOp *) op;
-
- gsk_vulkan_render_pass_reserve_descriptor_sets (self->render_pass, render);
}
static GskVulkanOp *
{
GskVulkanOffscreenOp *self = (GskVulkanOffscreenOp *) op;
- gsk_vulkan_render_draw_pass (render, self->render_pass, VK_NULL_HANDLE);
-
- return op->next;
+ return gsk_vulkan_render_draw_pass (render, self->render_pass, op->next);
}
static const GskVulkanOpClass GSK_VULKAN_OFFSCREEN_OP_CLASS = {
VkPipelineLayout pipeline_layout,
VkCommandBuffer command_buffer)
{
+ vkCmdEndRenderPass (command_buffer);
+
return op->next;
}
};
GskVulkanImage *
-gsk_vulkan_offscreen_op (GskVulkanRenderPass *render_pass,
+gsk_vulkan_offscreen_op (GskVulkanRender *render,
GdkVulkanContext *context,
- GskVulkanRender *render,
const graphene_vec2_t *scale,
const graphene_rect_t *viewport,
GskRenderNode *node)
{
GskVulkanOffscreenOp *self;
GskVulkanOffscreenEndOp *end;
+ GskVulkanImage *image;
graphene_rect_t view;
cairo_region_t *clip;
float scale_x, scale_y;
ceil (scale_x * viewport->size.width),
ceil (scale_y * viewport->size.height));
- self = (GskVulkanOffscreenOp *) gsk_vulkan_op_alloc (render_pass, &GSK_VULKAN_OFFSCREEN_OP_CLASS);
+ image = gsk_vulkan_image_new_for_offscreen (context,
+ gdk_vulkan_context_get_offscreen_format (context,
+ gsk_render_node_get_preferred_depth (node)),
+ view.size.width, view.size.height);
- self->image = gsk_vulkan_image_new_for_offscreen (context,
- gdk_vulkan_context_get_offscreen_format (context,
- gsk_render_node_get_preferred_depth (node)),
- view.size.width, view.size.height);
+ self = (GskVulkanOffscreenOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_OFFSCREEN_OP_CLASS);
+
+ self->image = image;
clip = cairo_region_create_rectangle (&(cairo_rectangle_int_t) {
0, 0,
cairo_region_destroy (clip);
- end = (GskVulkanOffscreenEndOp *) gsk_vulkan_op_alloc (render_pass, &GSK_VULKAN_OFFSCREEN_END_OP_CLASS);
+ /* This invalidates the self pointer */
+ gsk_vulkan_render_pass_add (self->render_pass, render, node);
+
+ end = (GskVulkanOffscreenEndOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_OFFSCREEN_END_OP_CLASS);
- end->image = g_object_ref (self->image);
+ end->image = g_object_ref (image);
return self->image;
}
G_BEGIN_DECLS
-GskVulkanImage * gsk_vulkan_offscreen_op (GskVulkanRenderPass *render_pass,
+GskVulkanImage * gsk_vulkan_offscreen_op (GskVulkanRender *render,
GdkVulkanContext *context,
- GskVulkanRender *render,
const graphene_vec2_t *scale,
const graphene_rect_t *viewport,
GskRenderNode *node);
#include "gskvulkanopprivate.h"
GskVulkanOp *
-gsk_vulkan_op_alloc (GskVulkanRenderPass *render_pass,
+gsk_vulkan_op_alloc (GskVulkanRender *render,
const GskVulkanOpClass *op_class)
{
GskVulkanOp *op;
- op = gsk_vulkan_render_pass_alloc_op (render_pass,
- op_class->size);
+ op = gsk_vulkan_render_alloc_op (render, op_class->size);
op->op_class = op_class;
return op;
G_BEGIN_DECLS
-typedef struct _GskVulkanOp GskVulkanOp;
-
typedef enum
{
GSK_VULKAN_STAGE_UPLOAD,
/* 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)
-GskVulkanOp * gsk_vulkan_op_alloc (GskVulkanRenderPass *render_pass,
+GskVulkanOp * gsk_vulkan_op_alloc (GskVulkanRender *render,
const GskVulkanOpClass *op_class);
void gsk_vulkan_op_finish (GskVulkanOp *op);
};
void
-gsk_vulkan_outset_shadow_op (GskVulkanRenderPass *render_pass,
+gsk_vulkan_outset_shadow_op (GskVulkanRender *render,
const char *clip_type,
const GskRoundedRect *outline,
const graphene_point_t *offset,
{
GskVulkanOutsetShadowOp *self;
- self = (GskVulkanOutsetShadowOp *) gsk_vulkan_op_alloc (render_pass, &GSK_VULKAN_OUTSET_SHADOW_OP_CLASS);
+ self = (GskVulkanOutsetShadowOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_OUTSET_SHADOW_OP_CLASS);
((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
self->outline = *outline;
G_BEGIN_DECLS
-void gsk_vulkan_outset_shadow_op (GskVulkanRenderPass *render_pass,
+void gsk_vulkan_outset_shadow_op (GskVulkanRender *render,
const char *clip_type,
const GskRoundedRect *outline,
const graphene_point_t *offset,
#include <gdk/gdk.h>
#include <graphene.h>
+typedef struct _GskVulkanOp GskVulkanOp;
typedef struct _GskVulkanOpClass GskVulkanOpClass;
typedef struct _GskVulkanRender GskVulkanRender;
typedef struct _GskVulkanRenderPass GskVulkanRenderPass;
};
void
-gsk_vulkan_push_constants_op (GskVulkanRenderPass *render_pass,
+gsk_vulkan_push_constants_op (GskVulkanRender *render,
const graphene_vec2_t *scale,
const graphene_matrix_t *mvp,
const GskRoundedRect *clip)
{
GskVulkanPushConstantsOp *self;
- self = (GskVulkanPushConstantsOp *) gsk_vulkan_op_alloc (render_pass, &GSK_VULKAN_PUSH_CONSTANTS_OP_CLASS);
+ self = (GskVulkanPushConstantsOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_PUSH_CONSTANTS_OP_CLASS);
graphene_matrix_to_float (mvp, self->instance.mvp);
gsk_rounded_rect_to_float (clip, graphene_point_zero (), self->instance.clip);
gsk_vulkan_push_constants_get_ranges (void) G_GNUC_PURE;
uint32_t gsk_vulkan_push_constants_get_range_count (void) G_GNUC_PURE;
-void gsk_vulkan_push_constants_op (GskVulkanRenderPass *render_pass,
+void gsk_vulkan_push_constants_op (GskVulkanRender *render,
const graphene_vec2_t *scale,
const graphene_matrix_t *mvp,
const GskRoundedRect *clip);
#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 DESCRIPTOR_POOL_MAXITEMS 50000
#define VERTEX_BUFFER_SIZE_STEP 128 * 1024 /* 128kB */
VkDescriptorSetLayout descriptor_set_layouts[N_DESCRIPTOR_SETS];
VkPipelineLayout pipeline_layout;
+ GskVulkanRenderOps render_ops;
GskVulkanUploader *uploader;
GskVulkanRenderPass *render_pass;
keya->format == keyb->format;
}
+static GskVulkanOp *
+gsk_vulkan_render_get_first_op (GskVulkanRender *self)
+{
+ if (gsk_vulkan_render_ops_get_size (&self->render_ops) == 0)
+ return NULL;
+
+ return (GskVulkanOp *) gsk_vulkan_render_ops_index (&self->render_ops, 0);
+}
+
static void
gsk_vulkan_render_verbose_print (GskVulkanRender *self,
const char *heading)
#ifdef G_ENABLE_DEBUG
if (GSK_RENDERER_DEBUG_CHECK (self->renderer, VERBOSE))
{
+ GskVulkanOp *op;
GString *string = g_string_new (heading);
g_string_append (string, ":\n");
- gsk_vulkan_render_pass_print (self->render_pass, string, 1);
+
+ for (op = gsk_vulkan_render_get_first_op (self); op; op = op->next)
+ {
+ gsk_vulkan_op_print (op, string, 0);
+ }
+
g_print ("%s\n", string->str);
g_string_free (string, TRUE);
}
&self->samplers[GSK_VULKAN_SAMPLER_NEAREST]);
+ gsk_vulkan_render_ops_init (&self->render_ops);
self->uploader = gsk_vulkan_uploader_new (self->vulkan, self->command_pool);
self->pipeline_cache = g_hash_table_new (pipeline_cache_key_hash, pipeline_cache_key_equal);
self->render_pass_cache = g_hash_table_new (render_pass_cache_key_hash, render_pass_cache_key_equal);
return self->fence;
}
+static void
+gsk_vulkan_render_seal_ops (GskVulkanRender *self)
+{
+ GskVulkanOp *last, *op;
+ guint i;
+
+ last = (GskVulkanOp *) gsk_vulkan_render_ops_index (&self->render_ops, 0);
+
+ for (i = last->op_class->size; i < gsk_vulkan_render_ops_get_size (&self->render_ops); i += op->op_class->size)
+ {
+ op = (GskVulkanOp *) gsk_vulkan_render_ops_index (&self->render_ops, i);
+
+ last->next = op;
+ last = op;
+ }
+}
+
static void
gsk_vulkan_render_add_node (GskVulkanRender *self,
GskRenderNode *node)
node,
TRUE);
+ gsk_vulkan_render_pass_add (self->render_pass, self, node);
+
+ gsk_vulkan_render_seal_ops (self);
+
gsk_vulkan_render_verbose_print (self, "start of frame");
}
void
gsk_vulkan_render_upload (GskVulkanRender *self)
{
+ GskVulkanOp *op;
+
gsk_vulkan_glyph_cache_upload (gsk_vulkan_renderer_get_glyph_cache (GSK_VULKAN_RENDERER (self->renderer)),
self->uploader);
- gsk_vulkan_render_pass_upload (self->render_pass, self->uploader);
+ for (op = gsk_vulkan_render_get_first_op (self); op; op = op->next)
+ {
+ gsk_vulkan_op_upload (op, self->uploader);
+ }
gsk_vulkan_uploader_upload (self->uploader);
}
VkDevice device;
VkWriteDescriptorSet descriptor_sets[N_DESCRIPTOR_SETS];
gsize n_descriptor_sets;
+ GskVulkanOp *op;
device = gdk_vulkan_context_get_device (self->vulkan);
- gsk_vulkan_render_pass_reserve_descriptor_sets (self->render_pass, self);
+ for (op = gsk_vulkan_render_get_first_op (self); op; op = op->next)
+ {
+ gsk_vulkan_op_reserve_descriptor_sets (op, self);
+ }
if (self->storage_buffer_memory)
{
static void
gsk_vulkan_render_collect_vertex_buffer (GskVulkanRender *self)
{
+ GskVulkanOp *op;
gsize n_bytes;
guchar *data;
- n_bytes = gsk_vulkan_render_pass_count_vertex_data (self->render_pass, 0);
+ n_bytes = 0;
+ for (op = gsk_vulkan_render_get_first_op (self); op; op = op->next)
+ {
+ n_bytes = gsk_vulkan_op_count_vertex_data (op, n_bytes);
+ }
if (n_bytes == 0)
return;
self->vertex_buffer = gsk_vulkan_buffer_new (self->vulkan, round_up (n_bytes, VERTEX_BUFFER_SIZE_STEP));
data = gsk_vulkan_buffer_map (self->vertex_buffer);
- gsk_vulkan_render_pass_collect_vertex_data (self->render_pass, data);
+ for (op = gsk_vulkan_render_get_first_op (self); op; op = op->next)
+ {
+ gsk_vulkan_op_collect_vertex_data (op, data);
+ }
gsk_vulkan_buffer_unmap (self->vertex_buffer);
}
-void
+GskVulkanOp *
gsk_vulkan_render_draw_pass (GskVulkanRender *self,
- GskVulkanRenderPass *pass,
- VkFence fence)
+ GskVulkanRenderPass *render_pass,
+ GskVulkanOp *op)
{
+ VkPipeline current_pipeline = VK_NULL_HANDLE;
+ const GskVulkanOpClass *current_pipeline_class = NULL;
+ const char *current_pipeline_clip_type = NULL;
VkCommandBuffer command_buffer;
+ VkRenderPass vk_render_pass;
command_buffer = gsk_vulkan_command_pool_get_buffer (self->command_pool);
0,
NULL);
- gsk_vulkan_render_pass_draw (pass, self, self->pipeline_layout, command_buffer);
+ vk_render_pass = gsk_vulkan_render_pass_begin_draw (render_pass, self, self->pipeline_layout, command_buffer);
+
+ while (op && op->op_class->stage != GSK_VULKAN_STAGE_END_PASS)
+ {
+ if (op->op_class->shader_name &&
+ (op->op_class != current_pipeline_class ||
+ current_pipeline_clip_type != op->clip_type))
+ {
+ current_pipeline = gsk_vulkan_render_get_pipeline (self,
+ op->op_class,
+ op->clip_type,
+ gsk_vulkan_image_get_vk_format (self->target),
+ vk_render_pass);
+ vkCmdBindPipeline (command_buffer,
+ VK_PIPELINE_BIND_POINT_GRAPHICS,
+ current_pipeline);
+ current_pipeline_class = op->op_class;
+ current_pipeline_clip_type = op->clip_type;
+ }
+
+ op = gsk_vulkan_op_command (op, self, self->pipeline_layout, command_buffer);
+ }
+
+ if (op && op->op_class->stage == GSK_VULKAN_STAGE_END_PASS)
+ op = gsk_vulkan_op_command (op, self, self->pipeline_layout, command_buffer);
+ else
+ gsk_vulkan_render_pass_end_draw (render_pass, self, self->pipeline_layout, command_buffer);
gsk_vulkan_command_pool_submit_buffer (self->command_pool,
command_buffer,
NULL,
0,
NULL,
- fence);
+ self->fence);
+
+ return op;
}
void
gsk_vulkan_render_collect_vertex_buffer (self);
- gsk_vulkan_render_draw_pass (self,
- self->render_pass,
- self->fence);
+ gsk_vulkan_render_draw_pass (self, self->render_pass, gsk_vulkan_render_get_first_op (self));
#ifdef G_ENABLE_DEBUG
if (GSK_RENDERER_DEBUG_CHECK (self->renderer, SYNC))
gsk_vulkan_render_cleanup (GskVulkanRender *self)
{
VkDevice device = gdk_vulkan_context_get_device (self->vulkan);
+ GskVulkanOp *op;
+ gsize i;
/* XXX: Wait for fence here or just in reset()? */
GSK_VK_CHECK (vkWaitForFences, device,
1,
&self->fence);
+ for (i = 0; i < gsk_vulkan_render_ops_get_size (&self->render_ops); i += op->op_class->size)
+ {
+ op = (GskVulkanOp *) gsk_vulkan_render_ops_index (&self->render_ops, i);
+
+ gsk_vulkan_op_finish (op);
+ }
+ gsk_vulkan_render_ops_set_size (&self->render_ops, 0);
+
gsk_vulkan_uploader_reset (self->uploader);
gsk_vulkan_command_pool_reset (self->command_pool);
}
g_hash_table_unref (self->render_pass_cache);
+ gsk_vulkan_render_ops_clear (&self->render_ops);
g_clear_pointer (&self->uploader, gsk_vulkan_uploader_free);
{
return self->renderer;
}
+
+gpointer
+gsk_vulkan_render_alloc_op (GskVulkanRender *self,
+ gsize size)
+{
+ gsize pos;
+
+ pos = gsk_vulkan_render_ops_get_size (&self->render_ops);
+
+ gsk_vulkan_render_ops_splice (&self->render_ops,
+ pos,
+ 0, FALSE,
+ NULL,
+ size);
+
+ return gsk_vulkan_render_ops_index (&self->render_ops, pos);
+}
+
#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;
- GskVulkanRenderOps render_ops;
-
GskVulkanImage *target;
graphene_rect_t viewport;
cairo_region_t *clip;
static GQuark texture_pixels_quark;
#endif
-static void
-gsk_vulkan_render_pass_seal (GskVulkanRenderPass *self)
-{
- GskVulkanOp *last, *op;
- guint i;
-
- last = (GskVulkanOp *) gsk_vulkan_render_ops_index (&self->render_ops, 0);
-
- for (i = last->op_class->size; i < gsk_vulkan_render_ops_get_size (&self->render_ops); i += op->op_class->size)
- {
- op = (GskVulkanOp *) gsk_vulkan_render_ops_index (&self->render_ops, i);
-
- last->next = op;
- last = op;
- }
-}
-
-static void
-gsk_vulkan_render_pass_add (GskVulkanRenderPass *self,
- GskVulkanRender *render,
- GskRenderNode *node);
-
GskVulkanRenderPass *
gsk_vulkan_render_pass_new (GdkVulkanContext *context,
GskVulkanRender *render,
self = g_new0 (GskVulkanRenderPass, 1);
self->vulkan = g_object_ref (context);
- gsk_vulkan_render_ops_init (&self->render_ops);
self->target = g_object_ref (target);
self->clip = cairo_region_copy (clip);
}
#endif
- gsk_vulkan_render_pass_add (self, render, node);
-
- gsk_vulkan_render_pass_seal (self);
-
return self;
}
void
gsk_vulkan_render_pass_free (GskVulkanRenderPass *self)
{
- GskVulkanOp *op;
- gsize i;
-
- for (i = 0; i < gsk_vulkan_render_ops_get_size (&self->render_ops); i += op->op_class->size)
- {
- op = (GskVulkanOp *) gsk_vulkan_render_ops_index (&self->render_ops, i);
-
- gsk_vulkan_op_finish (op);
- }
- gsk_vulkan_render_ops_clear (&self->render_ops);
-
g_object_unref (self->vulkan);
g_object_unref (self->target);
cairo_region_destroy (self->clip);
g_free (self);
}
-void
-gsk_vulkan_render_pass_print (GskVulkanRenderPass *self,
- GString *string,
- guint indent)
-{
- GskVulkanOp *op;
- gsize i;
-
- for (i = 0; i < gsk_vulkan_render_ops_get_size (&self->render_ops); i += op->op_class->size)
- {
- op = (GskVulkanOp *) gsk_vulkan_render_ops_index (&self->render_ops, i);
-
- gsk_vulkan_op_print (op, string, indent);
- }
-}
-
-gpointer
-gsk_vulkan_render_pass_alloc_op (GskVulkanRenderPass *self,
- gsize size)
-{
- gsize pos;
-
- pos = gsk_vulkan_render_ops_get_size (&self->render_ops);
-
- gsk_vulkan_render_ops_splice (&self->render_ops,
- pos,
- 0, FALSE,
- NULL,
- size);
-
- return gsk_vulkan_render_ops_index (&self->render_ops, pos);
-}
-
static void
-gsk_vulkan_render_pass_append_scissor (GskVulkanRenderPass *self,
+gsk_vulkan_render_pass_append_scissor (GskVulkanRender *render,
GskRenderNode *node,
const GskVulkanParseState *state)
{
- gsk_vulkan_scissor_op (self, &state->scissor);
+ gsk_vulkan_scissor_op (render, &state->scissor);
}
static void
-gsk_vulkan_render_pass_append_push_constants (GskVulkanRenderPass *self,
+gsk_vulkan_render_pass_append_push_constants (GskVulkanRender *render,
GskRenderNode *node,
const GskVulkanParseState *state)
{
else
graphene_matrix_init_from_matrix (&mvp, &state->projection);
- gsk_vulkan_push_constants_op (self, &state->scale, &mvp, &state->clip.rect);
+ gsk_vulkan_push_constants_op (render, &state->scale, &mvp, &state->clip.rect);
}
#define FALLBACK(...) G_STMT_START { \
result = gsk_vulkan_renderer_get_texture_image (renderer, texture);
if (result == NULL)
{
- result = gsk_vulkan_upload_op (self, self->vulkan, texture);
+ result = gsk_vulkan_upload_op (render, self->vulkan, texture);
gsk_vulkan_renderer_add_texture_image (renderer, texture, result);
}
if (clipped.size.width == 0 || clipped.size.height == 0)
return NULL;
- result = gsk_vulkan_upload_cairo_op (self,
+ result = gsk_vulkan_upload_cairo_op (render,
self->vulkan,
node,
&state->scale,
*/
*tex_bounds = clipped;
- result = gsk_vulkan_offscreen_op (self,
+ result = gsk_vulkan_offscreen_op (render,
self->vulkan,
- render,
&state->scale,
&clipped,
node);
if (clipped.size.width == 0 || clipped.size.height == 0)
return TRUE;
- image = gsk_vulkan_upload_cairo_op (self,
+ image = gsk_vulkan_upload_cairo_op (render,
self->vulkan,
node,
&state->scale,
&clipped);
- gsk_vulkan_texture_op (self,
+ gsk_vulkan_texture_op (render,
gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
image,
GSK_VULKAN_SAMPLER_DEFAULT,
const GskVulkanParseState *state,
GskRenderNode *node)
{
- gsk_vulkan_color_op (self,
+ gsk_vulkan_color_op (render,
gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
&node->bounds,
&state->offset,
const GskVulkanParseState *state,
GskRenderNode *node)
{
- gsk_vulkan_linear_gradient_op (self,
+ gsk_vulkan_linear_gradient_op (render,
gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
&node->bounds,
&state->offset,
const GskVulkanParseState *state,
GskRenderNode *node)
{
- gsk_vulkan_border_op (self,
+ gsk_vulkan_border_op (render,
gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
gsk_border_node_get_outline (node),
&state->offset,
image = gsk_vulkan_renderer_get_texture_image (renderer, texture);
if (image == NULL)
{
- image = gsk_vulkan_upload_op (self, self->vulkan, texture);
+ image = gsk_vulkan_upload_op (render, self->vulkan, texture);
gsk_vulkan_renderer_add_texture_image (renderer, texture, image);
}
- gsk_vulkan_texture_op (self,
+ gsk_vulkan_texture_op (render,
gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
image,
GSK_VULKAN_SAMPLER_DEFAULT,
image = gsk_vulkan_renderer_get_texture_image (renderer, texture);
if (image == NULL)
{
- image = gsk_vulkan_upload_op (self, self->vulkan, texture);
+ image = gsk_vulkan_upload_op (render, self->vulkan, texture);
gsk_vulkan_renderer_add_texture_image (renderer, texture, image);
}
- gsk_vulkan_texture_op (self,
+ gsk_vulkan_texture_op (render,
gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
image,
sampler,
if (gsk_inset_shadow_node_get_blur_radius (node) > 0)
FALLBACK ("Blur support not implemented for inset shadows");
- gsk_vulkan_inset_shadow_op (self,
+ gsk_vulkan_inset_shadow_op (render,
gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
gsk_inset_shadow_node_get_outline (node),
&state->offset,
if (gsk_outset_shadow_node_get_blur_radius (node) > 0)
FALLBACK ("Blur support not implemented for outset shadows");
- gsk_vulkan_outset_shadow_op (self,
+ gsk_vulkan_outset_shadow_op (render,
gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
gsk_outset_shadow_node_get_outline (node),
&state->offset,
new_state.scissor = state->scissor;
graphene_matrix_init_from_matrix (&new_state.projection, &state->projection);
- gsk_vulkan_render_pass_append_push_constants (self, node, &new_state);
+ gsk_vulkan_render_pass_append_push_constants (render, node, &new_state);
gsk_vulkan_render_pass_add_node (self, render, &new_state, child);
- gsk_vulkan_render_pass_append_push_constants (self, node, state);
+ gsk_vulkan_render_pass_append_push_constants (render, node, state);
gsk_transform_unref (new_state.modelview);
if (image == NULL)
return TRUE;
- gsk_vulkan_color_matrix_op_opacity (self,
+ gsk_vulkan_color_matrix_op_opacity (render,
gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
image,
&node->bounds,
if (image == NULL)
return TRUE;
- gsk_vulkan_color_matrix_op (self,
+ gsk_vulkan_color_matrix_op (render,
gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
image,
&node->bounds,
graphene_matrix_init_from_matrix (&new_state.projection, &state->projection);
if (do_scissor)
- gsk_vulkan_render_pass_append_scissor (self, node, &new_state);
+ gsk_vulkan_render_pass_append_scissor (render, node, &new_state);
if (do_push_constants)
- gsk_vulkan_render_pass_append_push_constants (self, node, &new_state);
+ gsk_vulkan_render_pass_append_push_constants (render, node, &new_state);
gsk_vulkan_render_pass_add_node (self, render, &new_state, gsk_clip_node_get_child (node));
if (do_push_constants)
- gsk_vulkan_render_pass_append_push_constants (self, node, state);
+ gsk_vulkan_render_pass_append_push_constants (render, node, state);
if (do_scissor)
- gsk_vulkan_render_pass_append_scissor (self, node, state);
+ gsk_vulkan_render_pass_append_scissor (render, node, state);
return TRUE;
}
new_state.modelview = state->modelview;
graphene_matrix_init_from_matrix (&new_state.projection, &state->projection);
- gsk_vulkan_render_pass_append_push_constants (self, node, &new_state);
+ gsk_vulkan_render_pass_append_push_constants (render, node, &new_state);
gsk_vulkan_render_pass_add_node (self, render, &new_state, gsk_rounded_clip_node_get_child (node));
- gsk_vulkan_render_pass_append_push_constants (self, node, state);
+ gsk_vulkan_render_pass_append_push_constants (render, node, state);
return TRUE;
}
if (graphene_rect_get_area (child_bounds) == 0)
return TRUE;
- image = gsk_vulkan_offscreen_op (self,
+ image = gsk_vulkan_offscreen_op (render,
self->vulkan,
- render,
&state->scale,
child_bounds,
gsk_repeat_node_get_child (node));
- gsk_vulkan_texture_op (self,
+ gsk_vulkan_texture_op (render,
gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
image,
GSK_VULKAN_SAMPLER_REPEAT,
bottom_tex_rect = *graphene_rect_zero ();
}
- gsk_vulkan_blend_mode_op (self,
+ gsk_vulkan_blend_mode_op (render,
gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
&node->bounds,
&state->offset,
if (end_image == NULL)
return TRUE;
- gsk_vulkan_color_matrix_op_opacity (self,
+ gsk_vulkan_color_matrix_op_opacity (render,
gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &end_child->bounds),
end_image,
&node->bounds,
}
else if (end_image == NULL)
{
- gsk_vulkan_color_matrix_op_opacity (self,
+ gsk_vulkan_color_matrix_op_opacity (render,
gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &start_child->bounds),
start_image,
&node->bounds,
return TRUE;
}
- gsk_vulkan_cross_fade_op (self,
+ gsk_vulkan_cross_fade_op (render,
gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
&node->bounds,
&state->offset,
glyph->draw_width / glyph->tw,
glyph->draw_height / glyph->th);
if (gsk_text_node_has_color_glyphs (node))
- gsk_vulkan_texture_op (self,
+ gsk_vulkan_texture_op (render,
gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &glyph_bounds),
glyph->atlas_image,
GSK_VULKAN_SAMPLER_DEFAULT,
&state->offset,
&glyph_tex_rect);
else
- gsk_vulkan_glyph_op (self,
+ gsk_vulkan_glyph_op (render,
gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &glyph_bounds),
glyph->atlas_image,
&glyph_bounds,
if (image == NULL)
return TRUE;
- gsk_vulkan_blur_op (self,
+ gsk_vulkan_blur_op (render,
gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
image,
&node->bounds,
{
graphene_rect_t bounds;
if (graphene_rect_intersection (&source->bounds, &mask->bounds, &bounds))
- gsk_vulkan_glyph_op (self,
+ gsk_vulkan_glyph_op (render,
gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &bounds),
mask_image,
&bounds,
if (source_image == NULL)
return TRUE;
- gsk_vulkan_mask_op (self,
+ gsk_vulkan_mask_op (render,
gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
&state->offset,
source_image,
gsk_vulkan_render_pass_add_fallback_node (self, render, state, node);
}
-static void
+void
gsk_vulkan_render_pass_add (GskVulkanRenderPass *self,
GskVulkanRender *render,
GskRenderNode *node)
state.offset = GRAPHENE_POINT_INIT (-self->viewport.origin.x * scale_x,
-self->viewport.origin.y * scale_y);
- gsk_vulkan_render_pass_append_scissor (self, node, &state);
- gsk_vulkan_render_pass_append_push_constants (self, node, &state);
+ gsk_vulkan_render_pass_append_scissor (render, node, &state);
+ gsk_vulkan_render_pass_append_push_constants (render, node, &state);
gsk_vulkan_render_pass_add_node (self, render, &state, node);
}
-static GskVulkanOp *
-gsk_vulkan_render_pass_get_first_op (GskVulkanRenderPass *self)
-{
- if (gsk_vulkan_render_ops_get_size (&self->render_ops) == 0)
- return NULL;
-
- return (GskVulkanOp *) gsk_vulkan_render_ops_index (&self->render_ops, 0);
-}
-
-void
-gsk_vulkan_render_pass_upload (GskVulkanRenderPass *self,
- GskVulkanUploader *uploader)
-{
- GskVulkanOp *op;
-
- for (op = gsk_vulkan_render_pass_get_first_op (self); op; op = op->next)
- {
- gsk_vulkan_op_upload (op, uploader);
- }
-}
-
-gsize
-gsk_vulkan_render_pass_count_vertex_data (GskVulkanRenderPass *self,
- gsize n_bytes)
-{
- GskVulkanOp *op;
-
- for (op = gsk_vulkan_render_pass_get_first_op (self); op; op = op->next)
- {
- n_bytes = gsk_vulkan_op_count_vertex_data (op, n_bytes);
- }
-
- return n_bytes;
-}
-
-void
-gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
- guchar *data)
-{
- GskVulkanOp *op;
-
- for (op = gsk_vulkan_render_pass_get_first_op (self); op; op = op->next)
- {
- gsk_vulkan_op_collect_vertex_data (op, data);
- }
-}
-
-void
-gsk_vulkan_render_pass_reserve_descriptor_sets (GskVulkanRenderPass *self,
- GskVulkanRender *render)
-{
- GskVulkanOp *op;
-
- for (op = gsk_vulkan_render_pass_get_first_op (self); op; op = op->next)
- {
- gsk_vulkan_op_reserve_descriptor_sets (op, render);
- }
-}
-
-static void
-gsk_vulkan_render_pass_draw_rect (GskVulkanRenderPass *self,
- GskVulkanRender *render,
- VkPipelineLayout pipeline_layout,
- VkCommandBuffer command_buffer)
-{
- VkPipeline current_pipeline = VK_NULL_HANDLE;
- const GskVulkanOpClass *current_pipeline_class = NULL;
- const char *current_pipeline_clip_type = NULL;
- GskVulkanOp *op;
-
- op = gsk_vulkan_render_pass_get_first_op (self);
- while (op)
- {
- if (op->op_class->shader_name &&
- (op->op_class != current_pipeline_class ||
- current_pipeline_clip_type != op->clip_type))
- {
- current_pipeline = gsk_vulkan_render_get_pipeline (render,
- op->op_class,
- op->clip_type,
- gsk_vulkan_image_get_vk_format (self->target),
- self->render_pass);
- vkCmdBindPipeline (command_buffer,
- VK_PIPELINE_BIND_POINT_GRAPHICS,
- current_pipeline);
- current_pipeline_class = op->op_class;
- current_pipeline_clip_type = op->clip_type;
- }
-
- op = gsk_vulkan_op_command (op, render, pipeline_layout, command_buffer);
- }
-}
-
-void
-gsk_vulkan_render_pass_draw (GskVulkanRenderPass *self,
- GskVulkanRender *render,
- VkPipelineLayout pipeline_layout,
- VkCommandBuffer command_buffer)
+VkRenderPass
+gsk_vulkan_render_pass_begin_draw (GskVulkanRenderPass *self,
+ GskVulkanRender *render,
+ VkPipelineLayout pipeline_layout,
+ VkCommandBuffer command_buffer)
{
cairo_rectangle_int_t rect;
},
VK_SUBPASS_CONTENTS_INLINE);
- gsk_vulkan_render_pass_draw_rect (self, render, pipeline_layout, command_buffer);
+ return self->render_pass;
+}
+void
+gsk_vulkan_render_pass_end_draw (GskVulkanRenderPass *self,
+ GskVulkanRender *render,
+ VkPipelineLayout pipeline_layout,
+ VkCommandBuffer command_buffer)
+{
vkCmdEndRenderPass (command_buffer);
}
void gsk_vulkan_render_pass_free (GskVulkanRenderPass *self);
-void gsk_vulkan_render_pass_print (GskVulkanRenderPass *self,
- GString *string,
- guint indent);
-
-gpointer gsk_vulkan_render_pass_alloc_op (GskVulkanRenderPass *self,
- gsize size);
-
-void gsk_vulkan_render_pass_upload (GskVulkanRenderPass *self,
- GskVulkanUploader *uploader);
-void gsk_vulkan_render_pass_reserve_descriptor_sets (GskVulkanRenderPass *self,
- GskVulkanRender *render);
-gsize gsk_vulkan_render_pass_count_vertex_data (GskVulkanRenderPass *self,
- gsize n_bytes);
-void gsk_vulkan_render_pass_collect_vertex_data (GskVulkanRenderPass *self,
- guchar *data);
-void gsk_vulkan_render_pass_draw (GskVulkanRenderPass *self,
+void gsk_vulkan_render_pass_add (GskVulkanRenderPass *self,
+ GskVulkanRender *render,
+ GskRenderNode *node);
+
+VkRenderPass gsk_vulkan_render_pass_begin_draw (GskVulkanRenderPass *self,
+ GskVulkanRender *render,
+ VkPipelineLayout pipeline_layout,
+ VkCommandBuffer command_buffer);
+void gsk_vulkan_render_pass_end_draw (GskVulkanRenderPass *self,
GskVulkanRender *render,
VkPipelineLayout pipeline_layout,
VkCommandBuffer command_buffer);
void gsk_vulkan_render_upload (GskVulkanRender *self);
+gpointer gsk_vulkan_render_alloc_op (GskVulkanRender *self,
+ gsize size);
+
VkPipeline gsk_vulkan_render_get_pipeline (GskVulkanRender *self,
const GskVulkanOpClass *op_class,
const char *clip_type,
gsize *out_offset);
void gsk_vulkan_render_draw (GskVulkanRender *self);
-void gsk_vulkan_render_draw_pass (GskVulkanRender *self,
- GskVulkanRenderPass *pass,
- VkFence fence);
+GskVulkanOp * gsk_vulkan_render_draw_pass (GskVulkanRender *self,
+ GskVulkanRenderPass *render_pass,
+ GskVulkanOp *op);
GdkTexture * gsk_vulkan_render_download_target (GskVulkanRender *self);
VkFence gsk_vulkan_render_get_fence (GskVulkanRender *self);
};
void
-gsk_vulkan_scissor_op (GskVulkanRenderPass *render_pass,
+gsk_vulkan_scissor_op (GskVulkanRender *render,
const cairo_rectangle_int_t *rect)
{
GskVulkanScissorOp *self;
- self = (GskVulkanScissorOp *) gsk_vulkan_op_alloc (render_pass, &GSK_VULKAN_SCISSOR_OP_CLASS);
+ self = (GskVulkanScissorOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_SCISSOR_OP_CLASS);
self->rect = *rect;
}
G_BEGIN_DECLS
-void gsk_vulkan_scissor_op (GskVulkanRenderPass *render_pass,
+void gsk_vulkan_scissor_op (GskVulkanRender *render,
const cairo_rectangle_int_t *rect);
};
void
-gsk_vulkan_texture_op (GskVulkanRenderPass *render_pass,
+gsk_vulkan_texture_op (GskVulkanRender *render,
const char *clip_type,
GskVulkanImage *image,
GskVulkanRenderSampler sampler,
{
GskVulkanTextureOp *self;
- self = (GskVulkanTextureOp *) gsk_vulkan_op_alloc (render_pass, &GSK_VULKAN_TEXTURE_OP_CLASS);
+ self = (GskVulkanTextureOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_TEXTURE_OP_CLASS);
((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
self->image = g_object_ref (image);
G_BEGIN_DECLS
-void gsk_vulkan_texture_op (GskVulkanRenderPass *render_pass,
+void gsk_vulkan_texture_op (GskVulkanRender *render,
const char *clip_type,
GskVulkanImage *image,
GskVulkanRenderSampler sampler,
};
GskVulkanImage *
-gsk_vulkan_upload_cairo_op (GskVulkanRenderPass *render_pass,
+gsk_vulkan_upload_cairo_op (GskVulkanRender *render,
GdkVulkanContext *context,
GskRenderNode *node,
const graphene_vec2_t *scale,
{
GskVulkanUploadCairoOp *self;
- self = (GskVulkanUploadCairoOp *) gsk_vulkan_op_alloc (render_pass, &GSK_VULKAN_UPLOAD_CAIRO_OP_CLASS);
+ self = (GskVulkanUploadCairoOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_UPLOAD_CAIRO_OP_CLASS);
self->node = gsk_render_node_ref (node);
self->image = gsk_vulkan_image_new_for_upload (context,
G_BEGIN_DECLS
-GskVulkanImage * gsk_vulkan_upload_cairo_op (GskVulkanRenderPass *render_pass,
+GskVulkanImage * gsk_vulkan_upload_cairo_op (GskVulkanRender *render,
GdkVulkanContext *context,
GskRenderNode *node,
const graphene_vec2_t *scale,
};
GskVulkanImage *
-gsk_vulkan_upload_op (GskVulkanRenderPass *render_pass,
- GdkVulkanContext *context,
- GdkTexture *texture)
+gsk_vulkan_upload_op (GskVulkanRender *render,
+ GdkVulkanContext *context,
+ GdkTexture *texture)
{
GskVulkanUploadOp *self;
- self = (GskVulkanUploadOp *) gsk_vulkan_op_alloc (render_pass, &GSK_VULKAN_UPLOAD_OP_CLASS);
+ self = (GskVulkanUploadOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_UPLOAD_OP_CLASS);
self->texture = g_object_ref (texture);
self->image = gsk_vulkan_image_new_for_upload (context,
G_BEGIN_DECLS
-GskVulkanImage * gsk_vulkan_upload_op (GskVulkanRenderPass *render_pass,
+GskVulkanImage * gsk_vulkan_upload_op (GskVulkanRender *render,
GdkVulkanContext *context,
GdkTexture *texture);