GskBlendMode blend_mode;
struct {
- GskVulkanImage *image;
graphene_rect_t rect;
graphene_rect_t tex_rect;
guint32 image_descriptor;
} top, bottom;
};
-static void
-gsk_vulkan_blend_mode_op_finish (GskVulkanOp *op)
-{
- GskVulkanBlendModeOp *self = (GskVulkanBlendModeOp *) op;
-
- g_object_unref (self->top.image);
- g_object_unref (self->bottom.image);
-}
-
static void
gsk_vulkan_blend_mode_op_print (GskVulkanOp *op,
GString *string,
GskVulkanRender *render)
{
GskVulkanBlendModeOp *self = (GskVulkanBlendModeOp *) op;
+ GskVulkanShaderOp *shader = (GskVulkanShaderOp *) op;
self->top.image_descriptor = gsk_vulkan_render_get_image_descriptor (render,
- self->top.image,
+ shader->images[0],
GSK_VULKAN_SAMPLER_DEFAULT);
self->bottom.image_descriptor = gsk_vulkan_render_get_image_descriptor (render,
- self->bottom.image,
+ shader->images[1],
GSK_VULKAN_SAMPLER_DEFAULT);
}
{
GSK_VULKAN_OP_SIZE (GskVulkanBlendModeOp),
GSK_VULKAN_STAGE_COMMAND,
- gsk_vulkan_blend_mode_op_finish,
+ gsk_vulkan_shader_op_finish,
gsk_vulkan_blend_mode_op_print,
gsk_vulkan_shader_op_count_vertex_data,
gsk_vulkan_blend_mode_op_collect_vertex_data,
gsk_vulkan_shader_op_command
},
"blend-mode",
+ 2,
&gsk_vulkan_blend_mode_info,
};
{
GskVulkanBlendModeOp *self;
- self = (GskVulkanBlendModeOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_BLEND_MODE_OP_CLASS, clip);
+ self = (GskVulkanBlendModeOp *) gsk_vulkan_shader_op_alloc (render,
+ &GSK_VULKAN_BLEND_MODE_OP_CLASS,
+ clip,
+ (GskVulkanImage *[2]) {
+ top_image,
+ bottom_image
+ });
graphene_rect_offset_r (bounds, offset->x, offset->y, &self->bounds);
self->blend_mode = blend_mode;
- self->top.image = g_object_ref (top_image);
graphene_rect_offset_r (top_rect, offset->x, offset->y, &self->top.rect);
gsk_vulkan_normalize_tex_coords (&self->top.tex_rect, bounds, top_tex_rect);
- self->bottom.image = g_object_ref (bottom_image);
graphene_rect_offset_r (bottom_rect, offset->x, offset->y, &self->bottom.rect);
gsk_vulkan_normalize_tex_coords (&self->bottom.tex_rect, bounds, bottom_tex_rect);
}
{
GskVulkanShaderOp op;
- GskVulkanImage *image;
graphene_rect_t rect;
graphene_rect_t tex_rect;
float radius;
guint32 image_descriptor;
};
-static void
-gsk_vulkan_blur_op_finish (GskVulkanOp *op)
-{
- GskVulkanBlurOp *self = (GskVulkanBlurOp *) op;
-
- g_object_unref (self->image);
-}
-
static void
gsk_vulkan_blur_op_print (GskVulkanOp *op,
GString *string,
GskVulkanRender *render)
{
GskVulkanBlurOp *self = (GskVulkanBlurOp *) op;
+ GskVulkanShaderOp *shader = (GskVulkanShaderOp *) op;
self->image_descriptor = gsk_vulkan_render_get_image_descriptor (render,
- self->image,
+ shader->images[0],
GSK_VULKAN_SAMPLER_DEFAULT);
}
{
GSK_VULKAN_OP_SIZE (GskVulkanBlurOp),
GSK_VULKAN_STAGE_COMMAND,
- gsk_vulkan_blur_op_finish,
+ gsk_vulkan_shader_op_finish,
gsk_vulkan_blur_op_print,
gsk_vulkan_shader_op_count_vertex_data,
gsk_vulkan_blur_op_collect_vertex_data,
gsk_vulkan_shader_op_command
},
"blur",
+ 1,
&gsk_vulkan_blur_info,
};
g_assert (radius > 0);
- self = (GskVulkanBlurOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_BLUR_OP_CLASS, clip);
+ self = (GskVulkanBlurOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_BLUR_OP_CLASS, clip, &image);
- self->image = g_object_ref (image);
graphene_rect_offset_r (rect, offset->x, offset->y, &self->rect);
gsk_vulkan_normalize_tex_coords (&self->tex_rect, rect, tex_rect);
self->radius = radius;
gsk_vulkan_border_op_command
},
"border",
+ 0,
&gsk_vulkan_border_info,
};
GskVulkanBorderOp *self;
guint i;
- self = (GskVulkanBorderOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_BORDER_OP_CLASS, clip);
+ self = (GskVulkanBorderOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_BORDER_OP_CLASS, clip, NULL);
self->outline = *outline;
gsk_rounded_rect_offset (&self->outline, offset->x, offset->y);
{
GskVulkanShaderOp op;
- GskVulkanImage *image;
graphene_matrix_t color_matrix;
graphene_vec4_t color_offset;
graphene_rect_t rect;
guint32 image_descriptor;
};
-static void
-gsk_vulkan_color_matrix_op_finish (GskVulkanOp *op)
-{
- GskVulkanColorMatrixOp *self = (GskVulkanColorMatrixOp *) op;
-
- g_object_unref (self->image);
-}
-
static void
gsk_vulkan_color_matrix_op_print (GskVulkanOp *op,
GString *string,
GskVulkanRender *render)
{
GskVulkanColorMatrixOp *self = (GskVulkanColorMatrixOp *) op;
+ GskVulkanShaderOp *shader = (GskVulkanShaderOp *) op;
self->image_descriptor = gsk_vulkan_render_get_image_descriptor (render,
- self->image,
+ shader->images[0],
GSK_VULKAN_SAMPLER_DEFAULT);
}
{
GSK_VULKAN_OP_SIZE (GskVulkanColorMatrixOp),
GSK_VULKAN_STAGE_COMMAND,
- gsk_vulkan_color_matrix_op_finish,
+ gsk_vulkan_shader_op_finish,
gsk_vulkan_color_matrix_op_print,
gsk_vulkan_shader_op_count_vertex_data,
gsk_vulkan_color_matrix_op_collect_vertex_data,
gsk_vulkan_shader_op_command
},
"color-matrix",
+ 1,
&gsk_vulkan_color_matrix_info,
};
{
GskVulkanColorMatrixOp *self;
- self = (GskVulkanColorMatrixOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_COLOR_MATRIX_OP_CLASS, clip);
+ self = (GskVulkanColorMatrixOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_COLOR_MATRIX_OP_CLASS, clip, &image);
- self->image = g_object_ref (image);
graphene_rect_offset_r (rect, offset->x, offset->y, &self->rect);
gsk_vulkan_normalize_tex_coords (&self->tex_rect, rect, tex_rect);
self->color_matrix = *color_matrix;
gsk_vulkan_shader_op_command
},
"color",
+ 0,
&gsk_vulkan_color_info,
};
{
GskVulkanColorOp *self;
- self = (GskVulkanColorOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_COLOR_OP_CLASS, clip);
+ self = (GskVulkanColorOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_COLOR_OP_CLASS, clip, NULL);
graphene_rect_offset_r (rect, offset->x, offset->y, &self->rect);
self->color = *color;
float progress;
struct {
- GskVulkanImage *image;
graphene_rect_t rect;
graphene_rect_t tex_rect;
guint32 image_descriptor;
} start, end;
};
-static void
-gsk_vulkan_cross_fade_op_finish (GskVulkanOp *op)
-{
- GskVulkanCrossFadeOp *self = (GskVulkanCrossFadeOp *) op;
-
- g_object_unref (self->start.image);
- g_object_unref (self->end.image);
-}
-
static void
gsk_vulkan_cross_fade_op_print (GskVulkanOp *op,
GString *string,
GskVulkanRender *render)
{
GskVulkanCrossFadeOp *self = (GskVulkanCrossFadeOp *) op;
+ GskVulkanShaderOp *shader = (GskVulkanShaderOp *) op;
self->start.image_descriptor = gsk_vulkan_render_get_image_descriptor (render,
- self->start.image,
+ shader->images[0],
GSK_VULKAN_SAMPLER_DEFAULT);
self->end.image_descriptor = gsk_vulkan_render_get_image_descriptor (render,
- self->end.image,
+ shader->images[1],
GSK_VULKAN_SAMPLER_DEFAULT);
}
{
GSK_VULKAN_OP_SIZE (GskVulkanCrossFadeOp),
GSK_VULKAN_STAGE_COMMAND,
- gsk_vulkan_cross_fade_op_finish,
+ gsk_vulkan_shader_op_finish,
gsk_vulkan_cross_fade_op_print,
gsk_vulkan_shader_op_count_vertex_data,
gsk_vulkan_cross_fade_op_collect_vertex_data,
gsk_vulkan_shader_op_command
},
"cross-fade",
+ 2,
&gsk_vulkan_cross_fade_info,
};
{
GskVulkanCrossFadeOp *self;
- self = (GskVulkanCrossFadeOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_CROSS_FADE_OP_CLASS, clip);
+ self = (GskVulkanCrossFadeOp *) gsk_vulkan_shader_op_alloc (render,
+ &GSK_VULKAN_CROSS_FADE_OP_CLASS,
+ clip,
+ (GskVulkanImage *[2]) {
+ start_image,
+ end_image
+ });
graphene_rect_offset_r (bounds, offset->x, offset->y, &self->bounds);
self->progress = progress;
- self->start.image = g_object_ref (start_image);
graphene_rect_offset_r (start_rect, offset->x, offset->y, &self->start.rect);
gsk_vulkan_normalize_tex_coords (&self->start.tex_rect, bounds, start_tex_rect);
- self->end.image = g_object_ref (end_image);
graphene_rect_offset_r (end_rect, offset->x, offset->y, &self->end.rect);
gsk_vulkan_normalize_tex_coords (&self->end.tex_rect, bounds, end_tex_rect);
}
guint32 image_descriptor;
};
-static void
-gsk_vulkan_glyph_op_finish (GskVulkanOp *op)
-{
- GskVulkanGlyphOp *self = (GskVulkanGlyphOp *) op;
-
- g_object_unref (self->image);
-}
-
static void
gsk_vulkan_glyph_op_print (GskVulkanOp *op,
GString *string,
GskVulkanRender *render)
{
GskVulkanGlyphOp *self = (GskVulkanGlyphOp *) op;
+ GskVulkanShaderOp *shader = (GskVulkanShaderOp *) op;
- self->image_descriptor = gsk_vulkan_render_get_image_descriptor (render, self->image, GSK_VULKAN_SAMPLER_DEFAULT);
+ self->image_descriptor = gsk_vulkan_render_get_image_descriptor (render, shader->images[0], GSK_VULKAN_SAMPLER_DEFAULT);
}
static const GskVulkanShaderOpClass GSK_VULKAN_GLYPH_OP_CLASS = {
{
GSK_VULKAN_OP_SIZE (GskVulkanGlyphOp),
GSK_VULKAN_STAGE_COMMAND,
- gsk_vulkan_glyph_op_finish,
+ gsk_vulkan_shader_op_finish,
gsk_vulkan_glyph_op_print,
gsk_vulkan_shader_op_count_vertex_data,
gsk_vulkan_glyph_op_collect_vertex_data,
gsk_vulkan_shader_op_command
},
"glyph",
+ 1,
&gsk_vulkan_glyph_info,
};
{
GskVulkanGlyphOp *self;
- self = (GskVulkanGlyphOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_GLYPH_OP_CLASS, clip);
+ self = (GskVulkanGlyphOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_GLYPH_OP_CLASS, clip, &image);
- self->image = g_object_ref (image);
graphene_rect_offset_r (rect, offset->x, offset->y, &self->rect);
gsk_vulkan_normalize_tex_coords (&self->tex_rect, rect, tex_rect);
self->color = *color;
gsk_vulkan_shader_op_command
},
"inset-shadow",
+ 0,
&gsk_vulkan_inset_shadow_info,
};
{
GskVulkanInsetShadowOp *self;
- self = (GskVulkanInsetShadowOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_INSET_SHADOW_OP_CLASS, clip);
+ self = (GskVulkanInsetShadowOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_INSET_SHADOW_OP_CLASS, clip, NULL);
self->outline = *outline;
gsk_rounded_rect_offset (&self->outline, offset->x, offset->y);
gsk_vulkan_shader_op_command
},
"linear",
+ 0,
&gsk_vulkan_linear_info,
};
{
GskVulkanLinearGradientOp *self;
- self = (GskVulkanLinearGradientOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS, clip);
+ self = (GskVulkanLinearGradientOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS, clip, NULL);
graphene_rect_offset_r (rect, offset->x, offset->y, &self->rect);
self->start = GRAPHENE_POINT_INIT (start->x + offset->x, start->y + offset->y);
GskVulkanShaderOp op;
struct {
- GskVulkanImage *image;
graphene_rect_t rect;
graphene_rect_t tex_rect;
guint32 image_descriptor;
GskMaskMode mask_mode;
};
-static void
-gsk_vulkan_mask_op_finish (GskVulkanOp *op)
-{
- GskVulkanMaskOp *self = (GskVulkanMaskOp *) op;
-
- g_object_unref (self->source.image);
- g_object_unref (self->mask.image);
-}
-
static void
gsk_vulkan_mask_op_print (GskVulkanOp *op,
GString *string,
GskVulkanRender *render)
{
GskVulkanMaskOp *self = (GskVulkanMaskOp *) op;
+ GskVulkanShaderOp *shader = (GskVulkanShaderOp *) op;
- self->source.image_descriptor = gsk_vulkan_render_get_image_descriptor (render, self->source.image, GSK_VULKAN_SAMPLER_DEFAULT);
- self->mask.image_descriptor = gsk_vulkan_render_get_image_descriptor (render, self->mask.image, GSK_VULKAN_SAMPLER_DEFAULT);
+ self->source.image_descriptor = gsk_vulkan_render_get_image_descriptor (render, shader->images[0], GSK_VULKAN_SAMPLER_DEFAULT);
+ self->mask.image_descriptor = gsk_vulkan_render_get_image_descriptor (render, shader->images[1], GSK_VULKAN_SAMPLER_DEFAULT);
}
static const GskVulkanShaderOpClass GSK_VULKAN_COLOR_MASK_OP_CLASS = {
{
GSK_VULKAN_OP_SIZE (GskVulkanMaskOp),
GSK_VULKAN_STAGE_COMMAND,
- gsk_vulkan_mask_op_finish,
+ gsk_vulkan_shader_op_finish,
gsk_vulkan_mask_op_print,
gsk_vulkan_shader_op_count_vertex_data,
gsk_vulkan_mask_op_collect_vertex_data,
gsk_vulkan_shader_op_command
},
"mask",
+ 2,
&gsk_vulkan_mask_info,
};
{
GskVulkanMaskOp *self;
- self = (GskVulkanMaskOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_COLOR_MASK_OP_CLASS, clip);
+ self = (GskVulkanMaskOp *) gsk_vulkan_shader_op_alloc (render,
+ &GSK_VULKAN_COLOR_MASK_OP_CLASS,
+ clip,
+ (GskVulkanImage *[2]) {
+ source,
+ mask,
+ });
- self->source.image = g_object_ref (source);
graphene_rect_offset_r (source_rect, offset->x, offset->y, &self->source.rect);
gsk_vulkan_normalize_tex_coords (&self->source.tex_rect, source_rect, source_tex_rect);
- self->mask.image = g_object_ref (mask);
graphene_rect_offset_r (mask_rect, offset->x, offset->y, &self->mask.rect);
gsk_vulkan_normalize_tex_coords (&self->mask.tex_rect, mask_rect, mask_tex_rect);
self->mask_mode = mask_mode;
gsk_vulkan_shader_op_command
},
"outset-shadow",
+ 0,
&gsk_vulkan_outset_shadow_info,
};
{
GskVulkanOutsetShadowOp *self;
- self = (GskVulkanOutsetShadowOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_OUTSET_SHADOW_OP_CLASS, clip);
+ self = (GskVulkanOutsetShadowOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_OUTSET_SHADOW_OP_CLASS, clip, NULL);
self->outline = *outline;
gsk_rounded_rect_offset (&self->outline, offset->x, offset->y);
#include "gskvulkanshaderopprivate.h"
+void
+gsk_vulkan_shader_op_finish (GskVulkanOp *op)
+{
+ GskVulkanShaderOpClass *shader_op_class = ((GskVulkanShaderOpClass *) op->op_class);
+ GskVulkanShaderOp *self = (GskVulkanShaderOp *) op;
+ gsize i;
+
+ for (i = 0; i < shader_op_class->n_images; i++)
+ g_object_unref (self->images[i]);
+}
+
static inline gsize
round_up (gsize number, gsize divisor)
{
GskVulkanShaderOp *
gsk_vulkan_shader_op_alloc (GskVulkanRender *render,
const GskVulkanShaderOpClass *op_class,
- GskVulkanShaderClip clip)
+ GskVulkanShaderClip clip,
+ GskVulkanImage **images)
{
GskVulkanShaderOp *self;
+ gsize i;
self = (GskVulkanShaderOp *) gsk_vulkan_op_alloc (render, &op_class->parent_class);
self->clip = clip;
+ for (i = 0; i < op_class->n_images; i++)
+ self->images[i] = g_object_ref (images[i]);
+
return self;
}
GskVulkanShaderClip clip;
gsize vertex_offset;
+ GskVulkanImage *images[2];
};
struct _GskVulkanShaderOpClass
GskVulkanOpClass parent_class;
const char * shader_name;
+ gsize n_images;
const VkPipelineVertexInputStateCreateInfo *vertex_input_state;
};
GskVulkanShaderOp * gsk_vulkan_shader_op_alloc (GskVulkanRender *render,
const GskVulkanShaderOpClass *op_class,
- GskVulkanShaderClip clip);
+ GskVulkanShaderClip clip,
+ GskVulkanImage **images);
+void gsk_vulkan_shader_op_finish (GskVulkanOp *op);
gsize gsk_vulkan_shader_op_count_vertex_data (GskVulkanOp *op,
gsize n_bytes);
GskVulkanOp * gsk_vulkan_shader_op_command_n (GskVulkanOp *op,
{
GskVulkanShaderOp op;
- GskVulkanImage *image;
GskVulkanRenderSampler sampler;
graphene_rect_t rect;
graphene_rect_t tex_rect;
guint32 image_descriptor;
};
-static void
-gsk_vulkan_texture_op_finish (GskVulkanOp *op)
-{
- GskVulkanTextureOp *self = (GskVulkanTextureOp *) op;
-
- g_object_unref (self->image);
-}
-
static void
gsk_vulkan_texture_op_print (GskVulkanOp *op,
GString *string,
guint indent)
{
GskVulkanTextureOp *self = (GskVulkanTextureOp *) op;
+ GskVulkanShaderOp *shader = (GskVulkanShaderOp *) op;
print_indent (string, indent);
print_rect (string, &self->rect);
g_string_append (string, "texture ");
- print_image (string, self->image);
+ print_image (string, shader->images[0]);
print_newline (string);
}
GskVulkanRender *render)
{
GskVulkanTextureOp *self = (GskVulkanTextureOp *) op;
+ GskVulkanShaderOp *shader = (GskVulkanShaderOp *) op;
- self->image_descriptor = gsk_vulkan_render_get_image_descriptor (render, self->image, self->sampler);
+ self->image_descriptor = gsk_vulkan_render_get_image_descriptor (render, shader->images[0], self->sampler);
}
static const GskVulkanShaderOpClass GSK_VULKAN_TEXTURE_OP_CLASS = {
{
GSK_VULKAN_OP_SIZE (GskVulkanTextureOp),
GSK_VULKAN_STAGE_COMMAND,
- gsk_vulkan_texture_op_finish,
+ gsk_vulkan_shader_op_finish,
gsk_vulkan_texture_op_print,
gsk_vulkan_shader_op_count_vertex_data,
gsk_vulkan_texture_op_collect_vertex_data,
gsk_vulkan_shader_op_command
},
"texture",
+ 1,
&gsk_vulkan_texture_info,
};
{
GskVulkanTextureOp *self;
- self = (GskVulkanTextureOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_TEXTURE_OP_CLASS, clip);
+ self = (GskVulkanTextureOp *) gsk_vulkan_shader_op_alloc (render,
+ &GSK_VULKAN_TEXTURE_OP_CLASS,
+ clip,
+ &image);
- self->image = g_object_ref (image);
self->sampler = sampler;
graphene_rect_offset_r (rect, offset->x, offset->y, &self->rect);
gsk_vulkan_normalize_tex_coords (&self->tex_rect, rect, tex_rect);