mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2025-01-12 21:40:19 +00:00
2aba50efa0
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.
130 lines
4.1 KiB
C
130 lines
4.1 KiB
C
#include "config.h"
|
|
|
|
#include "gskvulkanmaskopprivate.h"
|
|
|
|
#include "gskvulkanprivate.h"
|
|
|
|
#include "vulkan/resources/mask.vert.h"
|
|
|
|
typedef struct _GskVulkanMaskOp GskVulkanMaskOp;
|
|
|
|
struct _GskVulkanMaskOp
|
|
{
|
|
GskVulkanOp op;
|
|
|
|
struct {
|
|
GskVulkanImage *image;
|
|
graphene_rect_t rect;
|
|
graphene_rect_t tex_rect;
|
|
guint32 image_descriptor;
|
|
} source, mask;
|
|
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,
|
|
guint indent)
|
|
{
|
|
GskVulkanMaskOp *self = (GskVulkanMaskOp *) op;
|
|
|
|
print_indent (string, indent);
|
|
print_rect (string, &self->source.rect);
|
|
g_string_append (string, "mask ");
|
|
print_rect (string, &self->mask.rect);
|
|
switch (self->mask_mode)
|
|
{
|
|
case GSK_MASK_MODE_ALPHA:
|
|
g_string_append (string, "alpha ");
|
|
break;
|
|
case GSK_MASK_MODE_INVERTED_ALPHA:
|
|
g_string_append (string, "inverted-alpha ");
|
|
break;
|
|
case GSK_MASK_MODE_LUMINANCE:
|
|
g_string_append (string, "luminance ");
|
|
break;
|
|
case GSK_MASK_MODE_INVERTED_LUMINANCE:
|
|
g_string_append (string, "inverted-luminance ");
|
|
break;
|
|
default:
|
|
g_assert_not_reached ();
|
|
break;
|
|
}
|
|
print_newline (string);
|
|
}
|
|
|
|
static void
|
|
gsk_vulkan_mask_op_collect_vertex_data (GskVulkanOp *op,
|
|
guchar *data)
|
|
{
|
|
GskVulkanMaskOp *self = (GskVulkanMaskOp *) op;
|
|
GskVulkanMaskInstance *instance = (GskVulkanMaskInstance *) (data + op->vertex_offset);
|
|
|
|
gsk_vulkan_rect_to_float (&self->source.rect, instance->source_rect);
|
|
gsk_vulkan_rect_to_float (&self->source.tex_rect, instance->source_tex_rect);
|
|
instance->source_id = self->source.image_descriptor;
|
|
gsk_vulkan_rect_to_float (&self->mask.rect, instance->mask_rect);
|
|
gsk_vulkan_rect_to_float (&self->mask.tex_rect, instance->mask_tex_rect);
|
|
instance->mask_id = self->mask.image_descriptor;
|
|
instance->mask_mode = self->mask_mode;
|
|
}
|
|
|
|
static void
|
|
gsk_vulkan_mask_op_reserve_descriptor_sets (GskVulkanOp *op,
|
|
GskVulkanRender *render)
|
|
{
|
|
GskVulkanMaskOp *self = (GskVulkanMaskOp *) 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);
|
|
}
|
|
|
|
static const GskVulkanOpClass GSK_VULKAN_COLOR_MASK_OP_CLASS = {
|
|
GSK_VULKAN_OP_SIZE (GskVulkanMaskOp),
|
|
GSK_VULKAN_STAGE_COMMAND,
|
|
"mask",
|
|
&gsk_vulkan_mask_info,
|
|
gsk_vulkan_mask_op_finish,
|
|
gsk_vulkan_mask_op_print,
|
|
gsk_vulkan_op_draw_upload,
|
|
gsk_vulkan_op_draw_count_vertex_data,
|
|
gsk_vulkan_mask_op_collect_vertex_data,
|
|
gsk_vulkan_mask_op_reserve_descriptor_sets,
|
|
gsk_vulkan_op_draw_command
|
|
};
|
|
|
|
void
|
|
gsk_vulkan_mask_op (GskVulkanRender *render,
|
|
const char *clip_type,
|
|
const graphene_point_t *offset,
|
|
GskVulkanImage *source,
|
|
const graphene_rect_t *source_rect,
|
|
const graphene_rect_t *source_tex_rect,
|
|
GskVulkanImage *mask,
|
|
const graphene_rect_t *mask_rect,
|
|
const graphene_rect_t *mask_tex_rect,
|
|
GskMaskMode mask_mode)
|
|
{
|
|
GskVulkanMaskOp *self;
|
|
|
|
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);
|
|
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;
|
|
}
|