vulkan: Move the render ops to the Render

This is a massive refactoring because it collects all the renderops
of all renderpasses into one long array in the Render object.

Lots of code in there is still flaky and needs cleanup. That will
follow in further commits.

Other than that it does work fine though.
This commit is contained in:
Benjamin Otte
2023-07-09 20:28:12 +02:00
parent 63ad234391
commit 2aba50efa0
41 changed files with 278 additions and 340 deletions

View File

@@ -107,7 +107,7 @@ static const GskVulkanShaderOpClass GSK_VULKAN_BLEND_MODE_OP_CLASS = {
};
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,
@@ -121,7 +121,7 @@ gsk_vulkan_blend_mode_op (GskVulkanRenderPass *render_pass,
{
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);

View File

@@ -4,7 +4,7 @@
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,

View File

@@ -81,7 +81,7 @@ static const GskVulkanOpClass GSK_VULKAN_BLUR_OP_CLASS = {
};
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,
@@ -93,7 +93,7 @@ gsk_vulkan_blur_op (GskVulkanRenderPass *render_pass,
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);

View File

@@ -4,7 +4,7 @@
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,

View File

@@ -97,7 +97,7 @@ static const GskVulkanOpClass GSK_VULKAN_BORDER_OP_CLASS = {
};
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,
@@ -107,7 +107,7 @@ gsk_vulkan_border_op (GskVulkanRenderPass *render_pass,
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;

View File

@@ -4,7 +4,7 @@
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,

View File

@@ -88,7 +88,7 @@ static const GskVulkanOpClass GSK_VULKAN_COLOR_MATRIX_OP_CLASS = {
};
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,
@@ -99,7 +99,7 @@ gsk_vulkan_color_matrix_op (GskVulkanRenderPass *render_pass,
{
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);
@@ -110,7 +110,7 @@ gsk_vulkan_color_matrix_op (GskVulkanRenderPass *render_pass,
}
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,
@@ -130,7 +130,7 @@ gsk_vulkan_color_matrix_op_opacity (GskVulkanRenderPass *render_pass,
});
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,

View File

@@ -4,7 +4,7 @@
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,
@@ -13,7 +13,7 @@ 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,
void gsk_vulkan_color_matrix_op_opacity (GskVulkanRender *render,
const char *clip_type,
GskVulkanImage *image,
const graphene_rect_t *rect,

View File

@@ -79,7 +79,7 @@ static const GskVulkanOpClass GSK_VULKAN_COLOR_OP_CLASS = {
};
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,
@@ -87,7 +87,7 @@ gsk_vulkan_color_op (GskVulkanRenderPass *render_pass,
{
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);

View File

@@ -4,7 +4,7 @@
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,

View File

@@ -92,7 +92,7 @@ static const GskVulkanOpClass GSK_VULKAN_CROSS_FADE_OP_CLASS = {
};
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,
@@ -106,7 +106,7 @@ gsk_vulkan_cross_fade_op (GskVulkanRenderPass *render_pass,
{
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);

View File

@@ -4,7 +4,7 @@
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,

View File

@@ -79,7 +79,7 @@ static const GskVulkanOpClass GSK_VULKAN_GLYPH_OP_CLASS = {
};
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,
@@ -89,7 +89,7 @@ gsk_vulkan_glyph_op (GskVulkanRenderPass *render_pass,
{
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);

View File

@@ -4,7 +4,7 @@
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,

View File

@@ -75,7 +75,7 @@ static const GskVulkanOpClass GSK_VULKAN_INSET_SHADOW_OP_CLASS = {
};
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,
@@ -86,7 +86,7 @@ gsk_vulkan_inset_shadow_op (GskVulkanRenderPass *render_pass,
{
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;

View File

@@ -4,7 +4,7 @@
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,

View File

@@ -87,7 +87,7 @@ static const GskVulkanOpClass GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS = {
};
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,
@@ -99,7 +99,7 @@ gsk_vulkan_linear_gradient_op (GskVulkanRenderPass *render_pass,
{
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);

View File

@@ -4,7 +4,7 @@
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,

View File

@@ -103,7 +103,7 @@ static const GskVulkanOpClass GSK_VULKAN_COLOR_MASK_OP_CLASS = {
};
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,
@@ -116,7 +116,7 @@ gsk_vulkan_mask_op (GskVulkanRenderPass *render_pass,
{
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);

View File

@@ -4,7 +4,7 @@
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,

View File

@@ -38,44 +38,31 @@ gsk_vulkan_offscreen_op_print (GskVulkanOp *op,
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 *
@@ -86,9 +73,7 @@ gsk_vulkan_offscreen_op_command (GskVulkanOp *op,
{
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 = {
@@ -166,6 +151,8 @@ gsk_vulkan_offscreen_end_op_command (GskVulkanOp *op,
VkPipelineLayout pipeline_layout,
VkCommandBuffer command_buffer)
{
vkCmdEndRenderPass (command_buffer);
return op->next;
}
@@ -184,15 +171,15 @@ static const GskVulkanOpClass GSK_VULKAN_OFFSCREEN_END_OP_CLASS = {
};
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;
@@ -204,12 +191,14 @@ gsk_vulkan_offscreen_op (GskVulkanRenderPass *render_pass,
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,
@@ -228,9 +217,12 @@ gsk_vulkan_offscreen_op (GskVulkanRenderPass *render_pass,
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->image = g_object_ref (self->image);
end = (GskVulkanOffscreenEndOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_OFFSCREEN_END_OP_CLASS);
end->image = g_object_ref (image);
return self->image;
}

View File

@@ -4,9 +4,8 @@
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);

View File

@@ -3,13 +3,12 @@
#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;

View File

@@ -6,8 +6,6 @@
G_BEGIN_DECLS
typedef struct _GskVulkanOp GskVulkanOp;
typedef enum
{
GSK_VULKAN_STAGE_UPLOAD,
@@ -57,7 +55,7 @@ struct _GskVulkanOpClass
/* 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);

View File

@@ -75,7 +75,7 @@ static const GskVulkanOpClass GSK_VULKAN_OUTSET_SHADOW_OP_CLASS = {
};
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,
@@ -86,7 +86,7 @@ gsk_vulkan_outset_shadow_op (GskVulkanRenderPass *render_pass,
{
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;

View File

@@ -4,7 +4,7 @@
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,

View File

@@ -7,6 +7,7 @@
#include <gdk/gdk.h>
#include <graphene.h>
typedef struct _GskVulkanOp GskVulkanOp;
typedef struct _GskVulkanOpClass GskVulkanOpClass;
typedef struct _GskVulkanRender GskVulkanRender;
typedef struct _GskVulkanRenderPass GskVulkanRenderPass;

View File

@@ -115,14 +115,14 @@ static const GskVulkanOpClass GSK_VULKAN_PUSH_CONSTANTS_OP_CLASS = {
};
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);

View File

@@ -8,7 +8,7 @@ const VkPushConstantRange *
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);

View File

@@ -15,6 +15,12 @@
#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 */
@@ -50,6 +56,7 @@ struct _GskVulkanRender
VkDescriptorSetLayout descriptor_set_layouts[N_DESCRIPTOR_SETS];
VkPipelineLayout pipeline_layout;
GskVulkanRenderOps render_ops;
GskVulkanUploader *uploader;
GskVulkanRenderPass *render_pass;
@@ -133,6 +140,15 @@ render_pass_cache_key_equal (gconstpointer a,
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)
@@ -140,9 +156,15 @@ gsk_vulkan_render_verbose_print (GskVulkanRender *self,
#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);
}
@@ -339,6 +361,7 @@ gsk_vulkan_render_new (GskRenderer *renderer,
&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);
@@ -357,6 +380,23 @@ gsk_vulkan_render_get_fence (GskVulkanRender *self)
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)
@@ -374,16 +414,25 @@ gsk_vulkan_render_add_node (GskVulkanRender *self,
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);
}
@@ -664,10 +713,14 @@ gsk_vulkan_render_prepare_descriptor_sets (GskVulkanRender *self)
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)
{
@@ -728,10 +781,15 @@ gsk_vulkan_render_prepare_descriptor_sets (GskVulkanRender *self)
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;
@@ -742,16 +800,23 @@ gsk_vulkan_render_collect_vertex_buffer (GskVulkanRender *self)
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);
@@ -773,7 +838,33 @@ gsk_vulkan_render_draw_pass (GskVulkanRender *self,
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,
@@ -781,7 +872,9 @@ gsk_vulkan_render_draw_pass (GskVulkanRender *self,
NULL,
0,
NULL,
fence);
self->fence);
return op;
}
void
@@ -796,9 +889,7 @@ gsk_vulkan_render_draw (GskVulkanRender *self)
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))
@@ -834,6 +925,8 @@ static void
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,
@@ -846,6 +939,14 @@ gsk_vulkan_render_cleanup (GskVulkanRender *self)
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);
@@ -891,6 +992,7 @@ gsk_vulkan_render_free (GskVulkanRender *self)
}
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);
@@ -950,3 +1052,21 @@ gsk_vulkan_render_get_renderer (GskVulkanRender *self)
{
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);
}

View File

@@ -35,12 +35,6 @@
#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
@@ -50,8 +44,6 @@ struct _GskVulkanRenderPass
{
GdkVulkanContext *vulkan;
GskVulkanRenderOps render_ops;
GskVulkanImage *target;
graphene_rect_t viewport;
cairo_region_t *clip;
@@ -76,28 +68,6 @@ static GQuark fallback_pixels_quark;
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,
@@ -112,7 +82,6 @@ gsk_vulkan_render_pass_new (GdkVulkanContext *context,
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);
@@ -144,27 +113,12 @@ gsk_vulkan_render_pass_new (GdkVulkanContext *context,
}
#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);
@@ -172,49 +126,16 @@ gsk_vulkan_render_pass_free (GskVulkanRenderPass *self)
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)
{
@@ -228,7 +149,7 @@ gsk_vulkan_render_pass_append_push_constants (GskVulkanRenderPass *self,
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 { \
@@ -254,7 +175,7 @@ gsk_vulkan_render_pass_get_node_as_image (GskVulkanRenderPass *self,
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);
}
@@ -272,7 +193,7 @@ gsk_vulkan_render_pass_get_node_as_image (GskVulkanRenderPass *self,
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,
@@ -297,9 +218,8 @@ gsk_vulkan_render_pass_get_node_as_image (GskVulkanRenderPass *self,
*/
*tex_bounds = clipped;
result = gsk_vulkan_offscreen_op (self,
result = gsk_vulkan_offscreen_op (render,
self->vulkan,
render,
&state->scale,
&clipped,
node);
@@ -330,13 +250,13 @@ gsk_vulkan_render_pass_add_fallback_node (GskVulkanRenderPass *self,
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,
@@ -391,7 +311,7 @@ gsk_vulkan_render_pass_add_color_node (GskVulkanRenderPass *self,
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,
@@ -406,7 +326,7 @@ gsk_vulkan_render_pass_add_linear_gradient_node (GskVulkanRenderPass *self
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,
@@ -424,7 +344,7 @@ gsk_vulkan_render_pass_add_border_node (GskVulkanRenderPass *self,
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,
@@ -448,11 +368,11 @@ gsk_vulkan_render_pass_add_texture_node (GskVulkanRenderPass *self,
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,
@@ -491,11 +411,11 @@ gsk_vulkan_render_pass_add_texture_scale_node (GskVulkanRenderPass *self,
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,
@@ -515,7 +435,7 @@ gsk_vulkan_render_pass_add_inset_shadow_node (GskVulkanRenderPass *self,
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,
@@ -537,7 +457,7 @@ gsk_vulkan_render_pass_add_outset_shadow_node (GskVulkanRenderPass *self,
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,
@@ -693,11 +613,11 @@ gsk_vulkan_render_pass_add_transform_node (GskVulkanRenderPass *self,
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);
@@ -721,7 +641,7 @@ gsk_vulkan_render_pass_add_opacity_node (GskVulkanRenderPass *self,
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,
@@ -749,7 +669,7 @@ gsk_vulkan_render_pass_add_color_matrix_node (GskVulkanRenderPass *self,
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,
@@ -855,16 +775,16 @@ gsk_vulkan_render_pass_add_clip_node (GskVulkanRenderPass *self,
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;
}
@@ -893,11 +813,11 @@ gsk_vulkan_render_pass_add_rounded_clip_node (GskVulkanRenderPass *self,
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;
}
@@ -916,14 +836,13 @@ gsk_vulkan_render_pass_add_repeat_node (GskVulkanRenderPass *self,
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,
@@ -970,7 +889,7 @@ gsk_vulkan_render_pass_add_blend_node (GskVulkanRenderPass *self,
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,
@@ -1014,7 +933,7 @@ gsk_vulkan_render_pass_add_cross_fade_node (GskVulkanRenderPass *self,
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,
@@ -1026,7 +945,7 @@ gsk_vulkan_render_pass_add_cross_fade_node (GskVulkanRenderPass *self,
}
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,
@@ -1036,7 +955,7 @@ gsk_vulkan_render_pass_add_cross_fade_node (GskVulkanRenderPass *self,
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,
@@ -1099,7 +1018,7 @@ gsk_vulkan_render_pass_add_text_node (GskVulkanRenderPass *self,
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,
@@ -1107,7 +1026,7 @@ gsk_vulkan_render_pass_add_text_node (GskVulkanRenderPass *self,
&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,
@@ -1146,7 +1065,7 @@ gsk_vulkan_render_pass_add_blur_node (GskVulkanRenderPass *self,
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,
@@ -1190,7 +1109,7 @@ gsk_vulkan_render_pass_add_mask_node (GskVulkanRenderPass *self,
{
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,
@@ -1208,7 +1127,7 @@ gsk_vulkan_render_pass_add_mask_node (GskVulkanRenderPass *self,
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,
@@ -1308,7 +1227,7 @@ gsk_vulkan_render_pass_add_node (GskVulkanRenderPass *self,
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)
@@ -1335,110 +1254,17 @@ gsk_vulkan_render_pass_add (GskVulkanRenderPass *self,
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;
@@ -1473,8 +1299,15 @@ gsk_vulkan_render_pass_draw (GskVulkanRenderPass *self,
},
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);
}

View File

@@ -21,22 +21,15 @@ GskVulkanRenderPass * gsk_vulkan_render_pass_new (GdkVulk
void gsk_vulkan_render_pass_free (GskVulkanRenderPass *self);
void gsk_vulkan_render_pass_print (GskVulkanRenderPass *self,
GString *string,
guint indent);
void gsk_vulkan_render_pass_add (GskVulkanRenderPass *self,
GskVulkanRender *render,
GskRenderNode *node);
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,
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);

View File

@@ -30,6 +30,9 @@ GskRenderer * gsk_vulkan_render_get_renderer (GskVulk
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,
@@ -50,9 +53,9 @@ guchar * gsk_vulkan_render_get_buffer_memory (GskVulk
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);

View File

@@ -90,12 +90,12 @@ static const GskVulkanOpClass GSK_VULKAN_SCISSOR_OP_CLASS = {
};
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;
}

View File

@@ -4,7 +4,7 @@
G_BEGIN_DECLS
void gsk_vulkan_scissor_op (GskVulkanRenderPass *render_pass,
void gsk_vulkan_scissor_op (GskVulkanRender *render,
const cairo_rectangle_int_t *rect);

View File

@@ -84,7 +84,7 @@ static const GskVulkanOpClass GSK_VULKAN_TEXTURE_OP_CLASS = {
};
void
gsk_vulkan_texture_op (GskVulkanRenderPass *render_pass,
gsk_vulkan_texture_op (GskVulkanRender *render,
const char *clip_type,
GskVulkanImage *image,
GskVulkanRenderSampler sampler,
@@ -94,7 +94,7 @@ gsk_vulkan_texture_op (GskVulkanRenderPass *render_pass,
{
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);

View File

@@ -4,7 +4,7 @@
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,

View File

@@ -114,7 +114,7 @@ static const GskVulkanOpClass GSK_VULKAN_UPLOAD_CAIRO_OP_CLASS = {
};
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,
@@ -122,7 +122,7 @@ gsk_vulkan_upload_cairo_op (GskVulkanRenderPass *render_pass,
{
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,

View File

@@ -4,7 +4,7 @@
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,

View File

@@ -95,13 +95,13 @@ static const GskVulkanOpClass GSK_VULKAN_UPLOAD_OP_CLASS = {
};
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,

View File

@@ -4,7 +4,7 @@
G_BEGIN_DECLS
GskVulkanImage * gsk_vulkan_upload_op (GskVulkanRenderPass *render_pass,
GskVulkanImage * gsk_vulkan_upload_op (GskVulkanRender *render,
GdkVulkanContext *context,
GdkTexture *texture);