and add gsk_vulkan_shader_op_alloc() that sets it properly.
void
gsk_vulkan_blend_mode_op (GskVulkanRender *render,
- const char *clip_type,
+ GskVulkanShaderClip clip,
const graphene_rect_t *bounds,
const graphene_point_t *offset,
GskBlendMode blend_mode,
{
GskVulkanBlendModeOp *self;
- self = (GskVulkanBlendModeOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_BLEND_MODE_OP_CLASS.parent_class);
+ self = (GskVulkanBlendModeOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_BLEND_MODE_OP_CLASS, clip);
- ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type);
graphene_rect_offset_r (bounds, offset->x, offset->y, &self->bounds);
self->blend_mode = blend_mode;
G_BEGIN_DECLS
void gsk_vulkan_blend_mode_op (GskVulkanRender *render,
- const char *clip_type,
+ GskVulkanShaderClip clip,
const graphene_rect_t *bounds,
const graphene_point_t *offset,
GskBlendMode blend_mode,
void
gsk_vulkan_blur_op (GskVulkanRender *render,
- const char *clip_type,
+ GskVulkanShaderClip clip,
GskVulkanImage *image,
const graphene_rect_t *rect,
const graphene_point_t *offset,
g_assert (radius > 0);
- self = (GskVulkanBlurOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_BLUR_OP_CLASS.parent_class);
+ self = (GskVulkanBlurOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_BLUR_OP_CLASS, clip);
- ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type);
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);
G_BEGIN_DECLS
void gsk_vulkan_blur_op (GskVulkanRender *render,
- const char *clip_type,
+ GskVulkanShaderClip clip,
GskVulkanImage *image,
const graphene_rect_t *rect,
const graphene_point_t *offset,
void
gsk_vulkan_border_op (GskVulkanRender *render,
- const char *clip_type,
+ GskVulkanShaderClip clip,
const GskRoundedRect *outline,
const graphene_point_t *offset,
const float widths[4],
GskVulkanBorderOp *self;
guint i;
- self = (GskVulkanBorderOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_BORDER_OP_CLASS.parent_class);
+ self = (GskVulkanBorderOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_BORDER_OP_CLASS, clip);
- ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type);
self->outline = *outline;
gsk_rounded_rect_offset (&self->outline, offset->x, offset->y);
for (i = 0; i < 4; i++)
G_BEGIN_DECLS
void gsk_vulkan_border_op (GskVulkanRender *render,
- const char *clip_type,
+ GskVulkanShaderClip clip,
const GskRoundedRect *outline,
const graphene_point_t *offset,
const float widths[4],
}
}
-const char *
-gsk_vulkan_clip_get_clip_type (const GskVulkanClip *self,
- const graphene_point_t *offset,
- const graphene_rect_t *rect)
+GskVulkanShaderClip
+gsk_vulkan_clip_get_shader_clip (const GskVulkanClip *self,
+ const graphene_point_t *offset,
+ const graphene_rect_t *rect)
{
if (gsk_vulkan_clip_contains_rect (self, offset, rect))
- return "";
+ return GSK_VULKAN_SHADER_CLIP_NONE;
else if (self->type == GSK_VULKAN_CLIP_RECT)
- return "-clip";
+ return GSK_VULKAN_SHADER_CLIP_RECT;
else
- return "-clip-rounded";
+ return GSK_VULKAN_SHADER_CLIP_ROUNDED;
}
G_BEGIN_DECLS
+typedef enum {
+ GSK_VULKAN_SHADER_CLIP_NONE,
+ GSK_VULKAN_SHADER_CLIP_RECT,
+ GSK_VULKAN_SHADER_CLIP_ROUNDED
+} GskVulkanShaderClip;
+
typedef enum {
/* The whole area is clipped, no drawing is necessary.
* This can't be handled by return values because for return
gboolean gsk_vulkan_clip_may_intersect_rect (const GskVulkanClip *self,
const graphene_point_t *offset,
const graphene_rect_t *rect) G_GNUC_WARN_UNUSED_RESULT;
-const char * gsk_vulkan_clip_get_clip_type (const GskVulkanClip *self,
+GskVulkanShaderClip gsk_vulkan_clip_get_shader_clip (const GskVulkanClip *self,
const graphene_point_t *offset,
const graphene_rect_t *rect);
void
gsk_vulkan_color_matrix_op (GskVulkanRender *render,
- const char *clip_type,
+ GskVulkanShaderClip clip,
GskVulkanImage *image,
const graphene_rect_t *rect,
const graphene_point_t *offset,
{
GskVulkanColorMatrixOp *self;
- self = (GskVulkanColorMatrixOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_COLOR_MATRIX_OP_CLASS.parent_class);
+ self = (GskVulkanColorMatrixOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_COLOR_MATRIX_OP_CLASS, clip);
- ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type);
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);
void
gsk_vulkan_color_matrix_op_opacity (GskVulkanRender *render,
- const char *clip_type,
+ GskVulkanShaderClip clip,
GskVulkanImage *image,
const graphene_rect_t *rect,
const graphene_point_t *offset,
graphene_vec4_init (&color_offset, 0.0, 0.0, 0.0, 0.0);
gsk_vulkan_color_matrix_op (render,
- clip_type,
+ clip,
image,
rect,
offset,
G_BEGIN_DECLS
void gsk_vulkan_color_matrix_op (GskVulkanRender *render,
- const char *clip_type,
+ GskVulkanShaderClip clip,
GskVulkanImage *image,
const graphene_rect_t *rect,
const graphene_point_t *offset,
const graphene_vec4_t *color_offset);
void gsk_vulkan_color_matrix_op_opacity (GskVulkanRender *render,
- const char *clip_type,
+ GskVulkanShaderClip clip,
GskVulkanImage *image,
const graphene_rect_t *rect,
const graphene_point_t *offset,
void
gsk_vulkan_color_op (GskVulkanRender *render,
- const char *clip_type,
+ GskVulkanShaderClip clip,
const graphene_rect_t *rect,
const graphene_point_t *offset,
const GdkRGBA *color)
{
GskVulkanColorOp *self;
- self = (GskVulkanColorOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_COLOR_OP_CLASS.parent_class);
+ self = (GskVulkanColorOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_COLOR_OP_CLASS, clip);
- ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type);
graphene_rect_offset_r (rect, offset->x, offset->y, &self->rect);
self->color = *color;
}
G_BEGIN_DECLS
void gsk_vulkan_color_op (GskVulkanRender *render,
- const char *clip_type,
+ GskVulkanShaderClip clip,
const graphene_rect_t *rect,
const graphene_point_t *offset,
const GdkRGBA *color);
void
gsk_vulkan_cross_fade_op (GskVulkanRender *render,
- const char *clip_type,
+ GskVulkanShaderClip clip,
const graphene_rect_t *bounds,
const graphene_point_t *offset,
float progress,
{
GskVulkanCrossFadeOp *self;
- self = (GskVulkanCrossFadeOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_CROSS_FADE_OP_CLASS.parent_class);
+ self = (GskVulkanCrossFadeOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_CROSS_FADE_OP_CLASS, clip);
- ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type);
graphene_rect_offset_r (bounds, offset->x, offset->y, &self->bounds);
self->progress = progress;
G_BEGIN_DECLS
void gsk_vulkan_cross_fade_op (GskVulkanRender *render,
- const char *clip_type,
+ GskVulkanShaderClip clip,
const graphene_rect_t *bounds,
const graphene_point_t *offset,
float progress,
void
gsk_vulkan_glyph_op (GskVulkanRender *render,
- const char *clip_type,
+ GskVulkanShaderClip clip,
GskVulkanImage *image,
const graphene_rect_t *rect,
const graphene_point_t *offset,
{
GskVulkanGlyphOp *self;
- self = (GskVulkanGlyphOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_GLYPH_OP_CLASS.parent_class);
+ self = (GskVulkanGlyphOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_GLYPH_OP_CLASS, clip);
- ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type);
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);
G_BEGIN_DECLS
void gsk_vulkan_glyph_op (GskVulkanRender *render,
- const char *clip_type,
+ GskVulkanShaderClip clip,
GskVulkanImage *image,
const graphene_rect_t *rect,
const graphene_point_t *offset,
void
gsk_vulkan_inset_shadow_op (GskVulkanRender *render,
- const char *clip_type,
+ GskVulkanShaderClip clip,
const GskRoundedRect *outline,
const graphene_point_t *offset,
const GdkRGBA *color,
{
GskVulkanInsetShadowOp *self;
- self = (GskVulkanInsetShadowOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_INSET_SHADOW_OP_CLASS.parent_class);
+ self = (GskVulkanInsetShadowOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_INSET_SHADOW_OP_CLASS, clip);
- ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type);
self->outline = *outline;
gsk_rounded_rect_offset (&self->outline, offset->x, offset->y);
self->color = *color;
G_BEGIN_DECLS
void gsk_vulkan_inset_shadow_op (GskVulkanRender *render,
- const char *clip_type,
+ GskVulkanShaderClip clip,
const GskRoundedRect *outline,
const graphene_point_t *offset,
const GdkRGBA *color,
void
gsk_vulkan_linear_gradient_op (GskVulkanRender *render,
- const char *clip_type,
+ GskVulkanShaderClip clip,
const graphene_rect_t *rect,
const graphene_point_t *offset,
const graphene_point_t *start,
{
GskVulkanLinearGradientOp *self;
- self = (GskVulkanLinearGradientOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS.parent_class);
+ self = (GskVulkanLinearGradientOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS, clip);
- ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type);
graphene_rect_offset_r (rect, offset->x, offset->y, &self->rect);
self->start = GRAPHENE_POINT_INIT (start->x + offset->x, start->y + offset->y);
self->end = GRAPHENE_POINT_INIT (end->x + offset->x, end->y + offset->y);
G_BEGIN_DECLS
void gsk_vulkan_linear_gradient_op (GskVulkanRender *render,
- const char *clip_type,
+ GskVulkanShaderClip clip,
const graphene_rect_t *rect,
const graphene_point_t *offset,
const graphene_point_t *start,
void
gsk_vulkan_mask_op (GskVulkanRender *render,
- const char *clip_type,
+ GskVulkanShaderClip clip,
const graphene_point_t *offset,
GskVulkanImage *source,
const graphene_rect_t *source_rect,
{
GskVulkanMaskOp *self;
- self = (GskVulkanMaskOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_COLOR_MASK_OP_CLASS.parent_class);
+ self = (GskVulkanMaskOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_COLOR_MASK_OP_CLASS, clip);
- ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type);
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);
G_BEGIN_DECLS
void gsk_vulkan_mask_op (GskVulkanRender *render,
- const char *clip_type,
+ GskVulkanShaderClip clip,
const graphene_point_t *offset,
GskVulkanImage *source,
const graphene_rect_t *source_rect,
void
gsk_vulkan_outset_shadow_op (GskVulkanRender *render,
- const char *clip_type,
+ GskVulkanShaderClip clip,
const GskRoundedRect *outline,
const graphene_point_t *offset,
const GdkRGBA *color,
{
GskVulkanOutsetShadowOp *self;
- self = (GskVulkanOutsetShadowOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_OUTSET_SHADOW_OP_CLASS.parent_class);
+ self = (GskVulkanOutsetShadowOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_OUTSET_SHADOW_OP_CLASS, clip);
- ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type);
self->outline = *outline;
gsk_rounded_rect_offset (&self->outline, offset->x, offset->y);
self->color = *color;
G_BEGIN_DECLS
void gsk_vulkan_outset_shadow_op (GskVulkanRender *render,
- const char *clip_type,
+ GskVulkanShaderClip clip,
const GskRoundedRect *outline,
const graphene_point_t *offset,
const GdkRGBA *color,
struct _PipelineCacheKey
{
const GskVulkanOpClass *op_class;
- const /* interned */ char *clip_type;
+ GskVulkanShaderClip clip;
VkFormat format;
};
const PipelineCacheKey *key = data;
return GPOINTER_TO_UINT (key->op_class) ^
- GPOINTER_TO_UINT (key->clip_type) ^
- key->format;
+ key->clip ^
+ (key->format << 2);
}
static gboolean
const PipelineCacheKey *keyb = b;
return keya->op_class == keyb->op_class &&
- keya->clip_type == keyb->clip_type &&
+ keya->clip == keyb->clip &&
keya->format == keyb->format;
}
VkPipeline
gsk_vulkan_render_get_pipeline (GskVulkanRender *self,
const GskVulkanOpClass *op_class,
- const char *clip_type,
+ GskVulkanShaderClip clip,
VkRenderPass render_pass)
{
const GskVulkanShaderOpClass *shader_op_class = (const GskVulkanShaderOpClass *) op_class;
+ static const char *clip_names[] = { "", "-clip", "-clip-rounded" };
PipelineCacheKey cache_key;
VkPipeline pipeline;
GdkDisplay *display;
cache_key = (PipelineCacheKey) {
.op_class = op_class,
- .clip_type = clip_type,
+ .clip = clip,
.format = gsk_vulkan_image_get_vk_format (self->target)
};
pipeline = g_hash_table_lookup (self->pipeline_cache, &cache_key);
return pipeline;
display = gdk_draw_context_get_display (GDK_DRAW_CONTEXT (self->vulkan));
- vertex_shader_name = g_strconcat ("/org/gtk/libgsk/vulkan/", shader_op_class->shader_name, clip_type, ".vert.spv", NULL);
- fragment_shader_name = g_strconcat ("/org/gtk/libgsk/vulkan/", shader_op_class->shader_name, clip_type, ".frag.spv", NULL);
+ vertex_shader_name = g_strconcat ("/org/gtk/libgsk/vulkan/", shader_op_class->shader_name, clip_names[clip], ".vert.spv", NULL);
+ fragment_shader_name = g_strconcat ("/org/gtk/libgsk/vulkan/", shader_op_class->shader_name, clip_names[clip], ".frag.spv", NULL);
GSK_VK_CHECK (vkCreateGraphicsPipelines, gdk_vulkan_context_get_device (self->vulkan),
gdk_vulkan_context_get_pipeline_cache (self->vulkan),
&clipped);
gsk_vulkan_texture_op (render,
- gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
+ gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds),
image,
GSK_VULKAN_SAMPLER_DEFAULT,
&node->bounds,
if (state->clip.type == GSK_VULKAN_CLIP_ROUNDED)
{
graphene_rect_t cover;
- const char *clip_type;
+ GskVulkanShaderClip shader_clip;
float scale_x = graphene_vec2_get_x (&state->scale);
float scale_y = graphene_vec2_get_y (&state->scale);
clipped = GRAPHENE_RECT_INIT (int_clipped.x / scale_x, int_clipped.y / scale_y,
int_clipped.width / scale_x, int_clipped.height / scale_y);
- clip_type = gsk_vulkan_clip_get_clip_type (&state->clip, graphene_point_zero(), &clipped);
- if (clip_type[0] != '\0')
+ shader_clip = gsk_vulkan_clip_get_shader_clip (&state->clip, graphene_point_zero(), &clipped);
+ if (shader_clip != GSK_VULKAN_SHADER_CLIP_NONE)
{
gsk_rounded_rect_get_largest_cover (&state->clip.rect, &clipped, &cover);
int_clipped.x = ceil (cover.origin.x * scale_x);
if (int_clipped.width == 0 || int_clipped.height == 0)
{
gsk_vulkan_color_op (render,
- clip_type,
+ shader_clip,
&clipped,
graphene_point_zero (),
color);
int_clipped.width / scale_x, int_clipped.height / scale_y);
if (clipped.origin.x != cover.origin.x)
gsk_vulkan_color_op (render,
- clip_type,
+ shader_clip,
&GRAPHENE_RECT_INIT (clipped.origin.x, clipped.origin.y, cover.origin.x - clipped.origin.x, clipped.size.height),
graphene_point_zero (),
color);
if (clipped.origin.y != cover.origin.y)
gsk_vulkan_color_op (render,
- clip_type,
+ shader_clip,
&GRAPHENE_RECT_INIT (clipped.origin.x, clipped.origin.y, clipped.size.width, cover.origin.y - clipped.origin.y),
graphene_point_zero (),
color);
if (clipped.origin.x + clipped.size.width != cover.origin.x + cover.size.width)
gsk_vulkan_color_op (render,
- clip_type,
+ shader_clip,
&GRAPHENE_RECT_INIT (cover.origin.x + cover.size.width,
clipped.origin.y,
clipped.origin.x + clipped.size.width - cover.origin.x - cover.size.width,
color);
if (clipped.origin.y + clipped.size.height != cover.origin.y + cover.size.height)
gsk_vulkan_color_op (render,
- clip_type,
+ shader_clip,
&GRAPHENE_RECT_INIT (clipped.origin.x,
cover.origin.y + cover.size.height,
clipped.size.width,
}
gsk_vulkan_color_op (render,
- gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
+ gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds),
&rect,
graphene_point_zero (),
color);
GskRenderNode *node)
{
gsk_vulkan_linear_gradient_op (render,
- gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
+ gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds),
&node->bounds,
&state->offset,
gsk_linear_gradient_node_get_start (node),
GskRenderNode *node)
{
gsk_vulkan_border_op (render,
- gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
+ gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds),
gsk_border_node_get_outline (node),
&state->offset,
gsk_border_node_get_widths (node),
}
gsk_vulkan_texture_op (render,
- gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
+ gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds),
image,
GSK_VULKAN_SAMPLER_DEFAULT,
&node->bounds,
}
gsk_vulkan_texture_op (render,
- gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
+ gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds),
image,
sampler,
&node->bounds,
FALLBACK ("Blur support not implemented for inset shadows");
gsk_vulkan_inset_shadow_op (render,
- gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
+ gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds),
gsk_inset_shadow_node_get_outline (node),
&state->offset,
gsk_inset_shadow_node_get_color (node),
FALLBACK ("Blur support not implemented for outset shadows");
gsk_vulkan_outset_shadow_op (render,
- gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
+ gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds),
gsk_outset_shadow_node_get_outline (node),
&state->offset,
gsk_outset_shadow_node_get_color (node),
return TRUE;
gsk_vulkan_color_matrix_op_opacity (render,
- gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
+ gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds),
image,
&node->bounds,
&state->offset,
return TRUE;
gsk_vulkan_color_matrix_op (render,
- gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
+ gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds),
image,
&node->bounds,
&state->offset,
gsk_repeat_node_get_child (node));
gsk_vulkan_texture_op (render,
- gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
+ gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds),
image,
GSK_VULKAN_SAMPLER_REPEAT,
&node->bounds,
}
gsk_vulkan_blend_mode_op (render,
- gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
+ gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds),
&node->bounds,
&state->offset,
gsk_blend_node_get_blend_mode (node),
return TRUE;
gsk_vulkan_color_matrix_op_opacity (render,
- gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &end_child->bounds),
+ gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &end_child->bounds),
end_image,
&node->bounds,
&state->offset,
else if (end_image == NULL)
{
gsk_vulkan_color_matrix_op_opacity (render,
- gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &start_child->bounds),
+ gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &start_child->bounds),
start_image,
&node->bounds,
&state->offset,
}
gsk_vulkan_cross_fade_op (render,
- gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
+ gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds),
&node->bounds,
&state->offset,
progress,
glyph->draw_height / glyph->th);
if (gsk_text_node_has_color_glyphs (node))
gsk_vulkan_texture_op (render,
- gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &glyph_bounds),
+ gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &glyph_bounds),
glyph->atlas_image,
GSK_VULKAN_SAMPLER_DEFAULT,
&glyph_bounds,
&glyph_tex_rect);
else
gsk_vulkan_glyph_op (render,
- gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &glyph_bounds),
+ gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &glyph_bounds),
glyph->atlas_image,
&glyph_bounds,
&state->offset,
return TRUE;
gsk_vulkan_blur_op (render,
- gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
+ gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds),
image,
&node->bounds,
&state->offset,
graphene_rect_t bounds;
if (graphene_rect_intersection (&source->bounds, &mask->bounds, &bounds))
gsk_vulkan_glyph_op (render,
- gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &bounds),
+ gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &bounds),
mask_image,
&bounds,
&state->offset,
return TRUE;
gsk_vulkan_mask_op (render,
- gsk_vulkan_clip_get_clip_type (&state->clip, &state->offset, &node->bounds),
+ gsk_vulkan_clip_get_shader_clip (&state->clip, &state->offset, &node->bounds),
&state->offset,
source_image,
&source->bounds,
#include <gdk/gdk.h>
#include <gsk/gskrendernode.h>
+#include "gskvulkanclipprivate.h"
#include "gskvulkanimageprivate.h"
#include "gskvulkanprivate.h"
#include "gskvulkanrenderpassprivate.h"
VkPipelineLayout gsk_vulkan_render_get_pipeline_layout (GskVulkanRender *self);
VkPipeline gsk_vulkan_render_get_pipeline (GskVulkanRender *self,
const GskVulkanOpClass *op_class,
- const char *clip_type,
+ GskVulkanShaderClip clip,
VkRenderPass render_pass);
VkRenderPass gsk_vulkan_render_get_render_pass (GskVulkanRender *self,
VkFormat format,
VK_PIPELINE_BIND_POINT_GRAPHICS,
gsk_vulkan_render_get_pipeline (render,
op->op_class,
- self->clip_type,
+ self->clip,
render_pass));
vkCmdDraw (command_buffer,
return gsk_vulkan_shader_op_command_n (op, render, render_pass, command_buffer, 1);
}
+GskVulkanShaderOp *
+gsk_vulkan_shader_op_alloc (GskVulkanRender *render,
+ const GskVulkanShaderOpClass *op_class,
+ GskVulkanShaderClip clip)
+{
+ GskVulkanShaderOp *self;
+
+ self = (GskVulkanShaderOp *) gsk_vulkan_op_alloc (render, &op_class->parent_class);
+
+ self->clip = clip;
+
+ return self;
+}
#include "gskvulkanopprivate.h"
+#include "gskvulkanclipprivate.h"
+
G_BEGIN_DECLS
typedef struct _GskVulkanShaderOp GskVulkanShaderOp;
{
GskVulkanOp parent_op;
- const /* interned */ char *clip_type;
+ GskVulkanShaderClip clip;
gsize vertex_offset;
};
const VkPipelineVertexInputStateCreateInfo *vertex_input_state;
};
+GskVulkanShaderOp * gsk_vulkan_shader_op_alloc (GskVulkanRender *render,
+ const GskVulkanShaderOpClass *op_class,
+ GskVulkanShaderClip clip);
+
gsize gsk_vulkan_shader_op_count_vertex_data (GskVulkanOp *op,
gsize n_bytes);
GskVulkanOp * gsk_vulkan_shader_op_command_n (GskVulkanOp *op,
void
gsk_vulkan_texture_op (GskVulkanRender *render,
- const char *clip_type,
+ GskVulkanShaderClip clip,
GskVulkanImage *image,
GskVulkanRenderSampler sampler,
const graphene_rect_t *rect,
{
GskVulkanTextureOp *self;
- self = (GskVulkanTextureOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_TEXTURE_OP_CLASS.parent_class);
+ self = (GskVulkanTextureOp *) gsk_vulkan_shader_op_alloc (render, &GSK_VULKAN_TEXTURE_OP_CLASS, clip);
- ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type);
self->image = g_object_ref (image);
self->sampler = sampler;
graphene_rect_offset_r (rect, offset->x, offset->y, &self->rect);
G_BEGIN_DECLS
void gsk_vulkan_texture_op (GskVulkanRender *render,
- const char *clip_type,
+ GskVulkanShaderClip clip,
GskVulkanImage *image,
GskVulkanRenderSampler sampler,
const graphene_rect_t *rect,