It's the new base class for shaders now.
We're doing deep inheritance now, woohoo!
Also, port all the shader ops to it.
'vulkan/gskvulkanrenderpass.c',
'vulkan/gskvulkanrenderpassop.c',
'vulkan/gskvulkanscissorop.c',
+ 'vulkan/gskvulkanshaderop.c',
'vulkan/gskvulkantextureop.c',
'vulkan/gskvulkanuploadop.c',
])
#include "gskvulkanblendmodeopprivate.h"
#include "gskvulkanprivate.h"
+#include "gskvulkanshaderopprivate.h"
#include "vulkan/resources/blend-mode.vert.h"
struct _GskVulkanBlendModeOp
{
- GskVulkanOp op;
+ GskVulkanShaderOp op;
graphene_rect_t bounds;
GskBlendMode blend_mode;
guchar *data)
{
GskVulkanBlendModeOp *self = (GskVulkanBlendModeOp *) op;
- GskVulkanBlendModeInstance *instance = (GskVulkanBlendModeInstance *) (data + op->vertex_offset);
+ GskVulkanBlendModeInstance *instance = (GskVulkanBlendModeInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset);
gsk_vulkan_rect_to_float (&self->bounds, instance->rect);
gsk_vulkan_rect_to_float (&self->top.rect, instance->top_rect);
GSK_VULKAN_SAMPLER_DEFAULT);
}
-static GskVulkanOp *
-gsk_vulkan_blend_mode_op_command (GskVulkanOp *op,
- GskVulkanRender *render,
- VkPipelineLayout pipeline_layout,
- VkCommandBuffer command_buffer)
-{
- GskVulkanBlendModeOp *self = (GskVulkanBlendModeOp *) op;
-
- vkCmdDraw (command_buffer,
- 6, 1,
- 0, self->vertex_offset / gsk_vulkan_blend_mode_info.pVertexBindingDescriptions[0].stride);
-
- return op->next;
-}
-
static const GskVulkanShaderOpClass GSK_VULKAN_BLEND_MODE_OP_CLASS = {
- GSK_VULKAN_OP_SIZE (GskVulkanBlendModeOp),
- GSK_VULKAN_STAGE_COMMAND,
+ {
+ GSK_VULKAN_OP_SIZE (GskVulkanBlendModeOp),
+ GSK_VULKAN_STAGE_COMMAND,
+ gsk_vulkan_blend_mode_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_blend_mode_op_reserve_descriptor_sets,
+ gsk_vulkan_shader_op_command
+ },
"blend-mode",
&gsk_vulkan_blend_mode_info,
- gsk_vulkan_blend_mode_op_finish,
- gsk_vulkan_blend_mode_op_print,
- gsk_vulkan_op_draw_count_vertex_data,
- gsk_vulkan_blend_mode_op_collect_vertex_data,
- gsk_vulkan_blend_mode_op_reserve_descriptor_sets,
- gsk_vulkan_op_draw_command
};
void
{
GskVulkanBlendModeOp *self;
- self = (GskVulkanBlendModeOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_BLEND_MODE_OP_CLASS);
+ self = (GskVulkanBlendModeOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_BLEND_MODE_OP_CLASS.parent_class);
- ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
+ ((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;
#include "gskvulkanbluropprivate.h"
#include "gskvulkanprivate.h"
+#include "gskvulkanshaderopprivate.h"
#include "vulkan/resources/blur.vert.h"
struct _GskVulkanBlurOp
{
- GskVulkanOp op;
+ GskVulkanShaderOp op;
GskVulkanImage *image;
graphene_rect_t rect;
guchar *data)
{
GskVulkanBlurOp *self = (GskVulkanBlurOp *) op;
- GskVulkanBlurInstance *instance = (GskVulkanBlurInstance *) (data + op->vertex_offset);
+ GskVulkanBlurInstance *instance = (GskVulkanBlurInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset);
gsk_vulkan_rect_to_float (&self->rect, instance->rect);
gsk_vulkan_rect_to_float (&self->tex_rect, instance->tex_rect);
GSK_VULKAN_SAMPLER_DEFAULT);
}
-static const GskVulkanOpClass GSK_VULKAN_BLUR_OP_CLASS = {
- GSK_VULKAN_OP_SIZE (GskVulkanBlurOp),
- GSK_VULKAN_STAGE_COMMAND,
+static const GskVulkanShaderOpClass GSK_VULKAN_BLUR_OP_CLASS = {
+ {
+ GSK_VULKAN_OP_SIZE (GskVulkanBlurOp),
+ GSK_VULKAN_STAGE_COMMAND,
+ gsk_vulkan_blur_op_finish,
+ gsk_vulkan_blur_op_print,
+ gsk_vulkan_shader_op_count_vertex_data,
+ gsk_vulkan_blur_op_collect_vertex_data,
+ gsk_vulkan_blur_op_reserve_descriptor_sets,
+ gsk_vulkan_shader_op_command
+ },
"blur",
&gsk_vulkan_blur_info,
- gsk_vulkan_blur_op_finish,
- gsk_vulkan_blur_op_print,
- gsk_vulkan_op_draw_count_vertex_data,
- gsk_vulkan_blur_op_collect_vertex_data,
- gsk_vulkan_blur_op_reserve_descriptor_sets,
- gsk_vulkan_op_draw_command
};
void
g_assert (radius > 0);
- self = (GskVulkanBlurOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_BLUR_OP_CLASS);
+ self = (GskVulkanBlurOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_BLUR_OP_CLASS.parent_class);
- ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
+ ((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);
#include "gskvulkanborderopprivate.h"
#include "gskvulkanprivate.h"
+#include "gskvulkanshaderopprivate.h"
#include "gsk/gskroundedrectprivate.h"
#include "vulkan/resources/border.vert.h"
struct _GskVulkanBorderOp
{
- GskVulkanOp op;
+ GskVulkanShaderOp op;
GskRoundedRect outline;
float widths[4];
guchar *data)
{
GskVulkanBorderOp *self = (GskVulkanBorderOp *) op;
- GskVulkanBorderInstance *instance = (GskVulkanBorderInstance *) (data + op->vertex_offset);
+ GskVulkanBorderInstance *instance = (GskVulkanBorderInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset);
guint i;
gsk_rounded_rect_to_float (&self->outline, graphene_point_zero (), instance->rect);
}
static GskVulkanOp *
-gsk_vulkan_border_op_command (GskVulkanOp *op,
+gsk_vulkan_border_op_command (GskVulkanOp *op,
GskVulkanRender *render,
- VkPipelineLayout pipeline_layout,
- VkCommandBuffer command_buffer)
+ VkRenderPass render_pass,
+ VkCommandBuffer command_buffer)
{
- return gsk_vulkan_op_draw_command_n (op, render, pipeline_layout, command_buffer, 8);
+ return gsk_vulkan_shader_op_command_n (op, render, render_pass, command_buffer, 8);
}
-static const GskVulkanOpClass GSK_VULKAN_BORDER_OP_CLASS = {
- GSK_VULKAN_OP_SIZE (GskVulkanBorderOp),
- GSK_VULKAN_STAGE_COMMAND,
+static const GskVulkanShaderOpClass GSK_VULKAN_BORDER_OP_CLASS = {
+ {
+ GSK_VULKAN_OP_SIZE (GskVulkanBorderOp),
+ GSK_VULKAN_STAGE_COMMAND,
+ gsk_vulkan_border_op_finish,
+ gsk_vulkan_border_op_print,
+ gsk_vulkan_shader_op_count_vertex_data,
+ gsk_vulkan_border_op_collect_vertex_data,
+ gsk_vulkan_border_op_reserve_descriptor_sets,
+ gsk_vulkan_border_op_command
+ },
"border",
&gsk_vulkan_border_info,
- gsk_vulkan_border_op_finish,
- gsk_vulkan_border_op_print,
- gsk_vulkan_op_draw_count_vertex_data,
- gsk_vulkan_border_op_collect_vertex_data,
- gsk_vulkan_border_op_reserve_descriptor_sets,
- gsk_vulkan_border_op_command
};
void
GskVulkanBorderOp *self;
guint i;
- self = (GskVulkanBorderOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_BORDER_OP_CLASS);
+ self = (GskVulkanBorderOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_BORDER_OP_CLASS.parent_class);
- ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
+ ((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++)
static GskVulkanOp *
gsk_vulkan_clear_op_command (GskVulkanOp *op,
GskVulkanRender *render,
- VkPipelineLayout pipeline_layout,
+ VkRenderPass render_pass,
VkCommandBuffer command_buffer)
{
GskVulkanClearOp *self = (GskVulkanClearOp *) op;
static const GskVulkanOpClass GSK_VULKAN_SCISSOR_OP_CLASS = {
GSK_VULKAN_OP_SIZE (GskVulkanClearOp),
GSK_VULKAN_STAGE_COMMAND,
- NULL,
- NULL,
gsk_vulkan_clear_op_finish,
gsk_vulkan_clear_op_print,
gsk_vulkan_clear_op_count_vertex_data,
#include "gskvulkancolormatrixopprivate.h"
#include "gskvulkanprivate.h"
+#include "gskvulkanshaderopprivate.h"
#include "vulkan/resources/color-matrix.vert.h"
struct _GskVulkanColorMatrixOp
{
- GskVulkanOp op;
+ GskVulkanShaderOp op;
GskVulkanImage *image;
graphene_matrix_t color_matrix;
guchar *data)
{
GskVulkanColorMatrixOp *self = (GskVulkanColorMatrixOp *) op;
- GskVulkanColorMatrixInstance *instance = (GskVulkanColorMatrixInstance *) (data + op->vertex_offset);
+ GskVulkanColorMatrixInstance *instance = (GskVulkanColorMatrixInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset);
instance->rect[0] = self->rect.origin.x;
instance->rect[1] = self->rect.origin.y;
GSK_VULKAN_SAMPLER_DEFAULT);
}
-static const GskVulkanOpClass GSK_VULKAN_COLOR_MATRIX_OP_CLASS = {
- GSK_VULKAN_OP_SIZE (GskVulkanColorMatrixOp),
- GSK_VULKAN_STAGE_COMMAND,
+static const GskVulkanShaderOpClass GSK_VULKAN_COLOR_MATRIX_OP_CLASS = {
+ {
+ GSK_VULKAN_OP_SIZE (GskVulkanColorMatrixOp),
+ GSK_VULKAN_STAGE_COMMAND,
+ gsk_vulkan_color_matrix_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_color_matrix_op_reserve_descriptor_sets,
+ gsk_vulkan_shader_op_command
+ },
"color-matrix",
&gsk_vulkan_color_matrix_info,
- gsk_vulkan_color_matrix_op_finish,
- gsk_vulkan_color_matrix_op_print,
- gsk_vulkan_op_draw_count_vertex_data,
- gsk_vulkan_color_matrix_op_collect_vertex_data,
- gsk_vulkan_color_matrix_op_reserve_descriptor_sets,
- gsk_vulkan_op_draw_command
};
void
{
GskVulkanColorMatrixOp *self;
- self = (GskVulkanColorMatrixOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_COLOR_MATRIX_OP_CLASS);
+ self = (GskVulkanColorMatrixOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_COLOR_MATRIX_OP_CLASS.parent_class);
- ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
+ ((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);
#include "gskvulkancoloropprivate.h"
#include "gskvulkanprivate.h"
+#include "gskvulkanshaderopprivate.h"
#include "vulkan/resources/color.vert.h"
struct _GskVulkanColorOp
{
- GskVulkanOp op;
+ GskVulkanShaderOp op;
graphene_rect_t rect;
GdkRGBA color;
guchar *data)
{
GskVulkanColorOp *self = (GskVulkanColorOp *) op;
- GskVulkanColorInstance *instance = (GskVulkanColorInstance *) (data + op->vertex_offset);
+ GskVulkanColorInstance *instance = (GskVulkanColorInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset);
instance->rect[0] = self->rect.origin.x;
instance->rect[1] = self->rect.origin.y;
{
}
-static const GskVulkanOpClass GSK_VULKAN_COLOR_OP_CLASS = {
- GSK_VULKAN_OP_SIZE (GskVulkanColorOp),
- GSK_VULKAN_STAGE_COMMAND,
+static const GskVulkanShaderOpClass GSK_VULKAN_COLOR_OP_CLASS = {
+ {
+ GSK_VULKAN_OP_SIZE (GskVulkanColorOp),
+ GSK_VULKAN_STAGE_COMMAND,
+ gsk_vulkan_color_op_finish,
+ gsk_vulkan_color_op_print,
+ gsk_vulkan_shader_op_count_vertex_data,
+ gsk_vulkan_color_op_collect_vertex_data,
+ gsk_vulkan_color_op_reserve_descriptor_sets,
+ gsk_vulkan_shader_op_command
+ },
"color",
&gsk_vulkan_color_info,
- gsk_vulkan_color_op_finish,
- gsk_vulkan_color_op_print,
- gsk_vulkan_op_draw_count_vertex_data,
- gsk_vulkan_color_op_collect_vertex_data,
- gsk_vulkan_color_op_reserve_descriptor_sets,
- gsk_vulkan_op_draw_command
};
void
{
GskVulkanColorOp *self;
- self = (GskVulkanColorOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_COLOR_OP_CLASS);
+ self = (GskVulkanColorOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_COLOR_OP_CLASS.parent_class);
- ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
+ ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type);
graphene_rect_offset_r (rect, offset->x, offset->y, &self->rect);
self->color = *color;
}
#include "gskvulkancrossfadeopprivate.h"
#include "gskvulkanprivate.h"
+#include "gskvulkanshaderopprivate.h"
#include "vulkan/resources/cross-fade.vert.h"
struct _GskVulkanCrossFadeOp
{
- GskVulkanOp op;
+ GskVulkanShaderOp op;
graphene_rect_t bounds;
float progress;
guchar *data)
{
GskVulkanCrossFadeOp *self = (GskVulkanCrossFadeOp *) op;
- GskVulkanCrossFadeInstance *instance = (GskVulkanCrossFadeInstance *) (data + op->vertex_offset);
+ GskVulkanCrossFadeInstance *instance = (GskVulkanCrossFadeInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset);
gsk_vulkan_rect_to_float (&self->bounds, instance->rect);
gsk_vulkan_rect_to_float (&self->start.rect, instance->start_rect);
GSK_VULKAN_SAMPLER_DEFAULT);
}
-static const GskVulkanOpClass GSK_VULKAN_CROSS_FADE_OP_CLASS = {
- GSK_VULKAN_OP_SIZE (GskVulkanCrossFadeOp),
- GSK_VULKAN_STAGE_COMMAND,
+static const GskVulkanShaderOpClass GSK_VULKAN_CROSS_FADE_OP_CLASS = {
+ {
+ GSK_VULKAN_OP_SIZE (GskVulkanCrossFadeOp),
+ GSK_VULKAN_STAGE_COMMAND,
+ gsk_vulkan_cross_fade_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_cross_fade_op_reserve_descriptor_sets,
+ gsk_vulkan_shader_op_command
+ },
"cross-fade",
&gsk_vulkan_cross_fade_info,
- gsk_vulkan_cross_fade_op_finish,
- gsk_vulkan_cross_fade_op_print,
- gsk_vulkan_op_draw_count_vertex_data,
- gsk_vulkan_cross_fade_op_collect_vertex_data,
- gsk_vulkan_cross_fade_op_reserve_descriptor_sets,
- gsk_vulkan_op_draw_command
};
void
{
GskVulkanCrossFadeOp *self;
- self = (GskVulkanCrossFadeOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_CROSS_FADE_OP_CLASS);
+ self = (GskVulkanCrossFadeOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_CROSS_FADE_OP_CLASS.parent_class);
- ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
+ ((GskVulkanShaderOp *) self)->clip_type = g_intern_string (clip_type);
graphene_rect_offset_r (bounds, offset->x, offset->y, &self->bounds);
self->progress = progress;
static GskVulkanOp *
gsk_vulkan_download_op_command_with_area (GskVulkanOp *op,
GskVulkanRender *render,
- VkPipelineLayout pipeline_layout,
VkCommandBuffer command_buffer,
GskVulkanImage *image,
const cairo_rectangle_int_t *area,
static GskVulkanOp *
gsk_vulkan_download_op_command (GskVulkanOp *op,
GskVulkanRender *render,
- VkPipelineLayout pipeline_layout,
+ VkRenderPass render_pass,
VkCommandBuffer command_buffer)
{
GskVulkanDownloadOp *self = (GskVulkanDownloadOp *) op;
return gsk_vulkan_download_op_command_with_area (op,
render,
- pipeline_layout,
command_buffer,
self->image,
&(cairo_rectangle_int_t) {
static const GskVulkanOpClass GSK_VULKAN_DOWNLOAD_OP_CLASS = {
GSK_VULKAN_OP_SIZE (GskVulkanDownloadOp),
GSK_VULKAN_STAGE_COMMAND,
- NULL,
- NULL,
gsk_vulkan_download_op_finish,
gsk_vulkan_download_op_print,
gsk_vulkan_download_op_count_vertex_data,
#include "gskvulkanglyphopprivate.h"
#include "gskvulkanprivate.h"
+#include "gskvulkanshaderopprivate.h"
#include "vulkan/resources/glyph.vert.h"
struct _GskVulkanGlyphOp
{
- GskVulkanOp op;
+ GskVulkanShaderOp op;
GskVulkanImage *image;
graphene_rect_t rect;
guchar *data)
{
GskVulkanGlyphOp *self = (GskVulkanGlyphOp *) op;
- GskVulkanGlyphInstance *instance = (GskVulkanGlyphInstance *) (data + op->vertex_offset);
+ GskVulkanGlyphInstance *instance = (GskVulkanGlyphInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset);
gsk_vulkan_rect_to_float (&self->rect, instance->rect);
gsk_vulkan_rect_to_float (&self->tex_rect, instance->tex_rect);
self->image_descriptor = gsk_vulkan_render_get_image_descriptor (render, self->image, GSK_VULKAN_SAMPLER_DEFAULT);
}
-static const GskVulkanOpClass GSK_VULKAN_GLYPH_OP_CLASS = {
- GSK_VULKAN_OP_SIZE (GskVulkanGlyphOp),
- GSK_VULKAN_STAGE_COMMAND,
+static const GskVulkanShaderOpClass GSK_VULKAN_GLYPH_OP_CLASS = {
+ {
+ GSK_VULKAN_OP_SIZE (GskVulkanGlyphOp),
+ GSK_VULKAN_STAGE_COMMAND,
+ gsk_vulkan_glyph_op_finish,
+ gsk_vulkan_glyph_op_print,
+ gsk_vulkan_shader_op_count_vertex_data,
+ gsk_vulkan_glyph_op_collect_vertex_data,
+ gsk_vulkan_glyph_op_reserve_descriptor_sets,
+ gsk_vulkan_shader_op_command
+ },
"glyph",
&gsk_vulkan_glyph_info,
- gsk_vulkan_glyph_op_finish,
- gsk_vulkan_glyph_op_print,
- gsk_vulkan_op_draw_count_vertex_data,
- gsk_vulkan_glyph_op_collect_vertex_data,
- gsk_vulkan_glyph_op_reserve_descriptor_sets,
- gsk_vulkan_op_draw_command
};
void
{
GskVulkanGlyphOp *self;
- self = (GskVulkanGlyphOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_GLYPH_OP_CLASS);
+ self = (GskVulkanGlyphOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_GLYPH_OP_CLASS.parent_class);
- ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
+ ((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);
#include "gskvulkaninsetshadowopprivate.h"
#include "gskvulkanprivate.h"
+#include "gskvulkanshaderopprivate.h"
#include "gsk/gskroundedrectprivate.h"
#include "vulkan/resources/inset-shadow.vert.h"
struct _GskVulkanInsetShadowOp
{
- GskVulkanOp op;
+ GskVulkanShaderOp op;
GskRoundedRect outline;
GdkRGBA color;
guchar *data)
{
GskVulkanInsetShadowOp *self = (GskVulkanInsetShadowOp *) op;
- GskVulkanInsetShadowInstance *instance = (GskVulkanInsetShadowInstance *) (data + op->vertex_offset);
+ GskVulkanInsetShadowInstance *instance = (GskVulkanInsetShadowInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset);
gsk_rounded_rect_to_float (&self->outline, graphene_point_zero (), instance->outline);
gsk_vulkan_rgba_to_float (&self->color, instance->color);
{
}
-static const GskVulkanOpClass GSK_VULKAN_INSET_SHADOW_OP_CLASS = {
- GSK_VULKAN_OP_SIZE (GskVulkanInsetShadowOp),
- GSK_VULKAN_STAGE_COMMAND,
+static const GskVulkanShaderOpClass GSK_VULKAN_INSET_SHADOW_OP_CLASS = {
+ {
+ GSK_VULKAN_OP_SIZE (GskVulkanInsetShadowOp),
+ GSK_VULKAN_STAGE_COMMAND,
+ gsk_vulkan_inset_shadow_op_finish,
+ gsk_vulkan_inset_shadow_op_print,
+ gsk_vulkan_shader_op_count_vertex_data,
+ gsk_vulkan_inset_shadow_op_collect_vertex_data,
+ gsk_vulkan_inset_shadow_op_reserve_descriptor_sets,
+ gsk_vulkan_shader_op_command
+ },
"inset-shadow",
&gsk_vulkan_inset_shadow_info,
- gsk_vulkan_inset_shadow_op_finish,
- gsk_vulkan_inset_shadow_op_print,
- gsk_vulkan_op_draw_count_vertex_data,
- gsk_vulkan_inset_shadow_op_collect_vertex_data,
- gsk_vulkan_inset_shadow_op_reserve_descriptor_sets,
- gsk_vulkan_op_draw_command
};
void
{
GskVulkanInsetShadowOp *self;
- self = (GskVulkanInsetShadowOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_INSET_SHADOW_OP_CLASS);
+ self = (GskVulkanInsetShadowOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_INSET_SHADOW_OP_CLASS.parent_class);
- ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
+ ((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;
#include "gskvulkanlineargradientopprivate.h"
#include "gskvulkanprivate.h"
+#include "gskvulkanshaderopprivate.h"
#include "vulkan/resources/linear.vert.h"
struct _GskVulkanLinearGradientOp
{
- GskVulkanOp op;
+ GskVulkanShaderOp op;
graphene_rect_t rect;
graphene_point_t start;
guchar *data)
{
GskVulkanLinearGradientOp *self = (GskVulkanLinearGradientOp *) op;
- GskVulkanLinearInstance *instance = (GskVulkanLinearInstance *) (data + op->vertex_offset);
+ GskVulkanLinearInstance *instance = (GskVulkanLinearInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset);
gsk_vulkan_rect_to_float (&self->rect, instance->rect);
gsk_vulkan_point_to_float (&self->start, instance->start);
memcpy (mem, self->stops, self->n_stops * sizeof (GskColorStop));
}
-static const GskVulkanOpClass GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS = {
- GSK_VULKAN_OP_SIZE (GskVulkanLinearGradientOp),
- GSK_VULKAN_STAGE_COMMAND,
+static const GskVulkanShaderOpClass GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS = {
+ {
+ GSK_VULKAN_OP_SIZE (GskVulkanLinearGradientOp),
+ GSK_VULKAN_STAGE_COMMAND,
+ gsk_vulkan_linear_gradient_op_finish,
+ gsk_vulkan_linear_gradient_op_print,
+ gsk_vulkan_shader_op_count_vertex_data,
+ gsk_vulkan_linear_gradient_op_collect_vertex_data,
+ gsk_vulkan_linear_gradient_op_reserve_descriptor_sets,
+ gsk_vulkan_shader_op_command
+ },
"linear",
&gsk_vulkan_linear_info,
- gsk_vulkan_linear_gradient_op_finish,
- gsk_vulkan_linear_gradient_op_print,
- gsk_vulkan_op_draw_count_vertex_data,
- gsk_vulkan_linear_gradient_op_collect_vertex_data,
- gsk_vulkan_linear_gradient_op_reserve_descriptor_sets,
- gsk_vulkan_op_draw_command
};
void
{
GskVulkanLinearGradientOp *self;
- self = (GskVulkanLinearGradientOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS);
+ self = (GskVulkanLinearGradientOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_LINEAR_GRADIENT_OP_CLASS.parent_class);
- ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
+ ((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);
#include "gskvulkanmaskopprivate.h"
#include "gskvulkanprivate.h"
+#include "gskvulkanshaderopprivate.h"
#include "vulkan/resources/mask.vert.h"
struct _GskVulkanMaskOp
{
- GskVulkanOp op;
+ GskVulkanShaderOp op;
struct {
GskVulkanImage *image;
guchar *data)
{
GskVulkanMaskOp *self = (GskVulkanMaskOp *) op;
- GskVulkanMaskInstance *instance = (GskVulkanMaskInstance *) (data + op->vertex_offset);
+ GskVulkanMaskInstance *instance = (GskVulkanMaskInstance *) (data + ((GskVulkanShaderOp *) 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);
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,
+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_mask_op_print,
+ gsk_vulkan_shader_op_count_vertex_data,
+ gsk_vulkan_mask_op_collect_vertex_data,
+ gsk_vulkan_mask_op_reserve_descriptor_sets,
+ gsk_vulkan_shader_op_command
+ },
"mask",
&gsk_vulkan_mask_info,
- gsk_vulkan_mask_op_finish,
- gsk_vulkan_mask_op_print,
- 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
{
GskVulkanMaskOp *self;
- self = (GskVulkanMaskOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_COLOR_MASK_OP_CLASS);
+ self = (GskVulkanMaskOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_COLOR_MASK_OP_CLASS.parent_class);
- ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
+ ((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);
GskVulkanOp *
gsk_vulkan_op_command (GskVulkanOp *op,
GskVulkanRender *render,
- VkPipelineLayout pipeline_layout,
+ VkRenderPass render_pass,
VkCommandBuffer command_buffer)
{
- return op->op_class->command (op, render, pipeline_layout, command_buffer);
-}
-
-static inline gsize
-round_up (gsize number, gsize divisor)
-{
- return (number + divisor - 1) / divisor * divisor;
-}
-
-gsize
-gsk_vulkan_op_draw_count_vertex_data (GskVulkanOp *op,
- gsize n_bytes)
-{
- gsize vertex_stride;
-
- vertex_stride = op->op_class->vertex_input_state->pVertexBindingDescriptions[0].stride;
- n_bytes = round_up (n_bytes, vertex_stride);
- op->vertex_offset = n_bytes;
- n_bytes += vertex_stride;
- return n_bytes;
-}
-
-GskVulkanOp *
-gsk_vulkan_op_draw_command_n (GskVulkanOp *op,
- GskVulkanRender *render,
- VkPipelineLayout pipeline_layout,
- VkCommandBuffer command_buffer,
- gsize instance_scale)
-{
- GskVulkanOp *next;
- gsize stride = op->op_class->vertex_input_state->pVertexBindingDescriptions[0].stride;
- gsize i;
-
- i = 1;
- for (next = op->next; next && i < 10 * 1000; next = next->next)
- {
- if (next->op_class != op->op_class ||
- next->vertex_offset != op->vertex_offset + i * stride)
- break;
-
- i++;
- }
-
- vkCmdDraw (command_buffer,
- 6 * instance_scale, i,
- 0, op->vertex_offset / stride);
-
- return next;
-}
-
-GskVulkanOp *
-gsk_vulkan_op_draw_command (GskVulkanOp *op,
- GskVulkanRender *render,
- VkPipelineLayout pipeline_layout,
- VkCommandBuffer command_buffer)
-{
- return gsk_vulkan_op_draw_command_n (op, render, pipeline_layout, command_buffer, 1);
+ return op->op_class->command (op, render, render_pass, command_buffer);
}
{
const GskVulkanOpClass *op_class;
- const /* interned */ char *clip_type;
GskVulkanOp *next;
- gsize vertex_offset;
};
struct _GskVulkanOpClass
gsize size;
GskVulkanStage stage;
- const char * shader_name;
- const VkPipelineVertexInputStateCreateInfo *vertex_input_state;
-
void (* finish) (GskVulkanOp *op);
void (* print) (GskVulkanOp *op,
GskVulkanRender *render);
GskVulkanOp * (* command) (GskVulkanOp *op,
GskVulkanRender *render,
- VkPipelineLayout pipeline_layout,
+ VkRenderPass render_pass,
VkCommandBuffer command_buffer);
};
GskVulkanRender *render);
GskVulkanOp * gsk_vulkan_op_command (GskVulkanOp *op,
GskVulkanRender *render,
- VkPipelineLayout pipeline_layout,
- VkCommandBuffer command_buffer);
-
-gsize gsk_vulkan_op_draw_count_vertex_data (GskVulkanOp *op,
- gsize n_bytes);
-GskVulkanOp * gsk_vulkan_op_draw_command_n (GskVulkanOp *op,
- GskVulkanRender *render,
- VkPipelineLayout pipeline_layout,
- VkCommandBuffer command_buffer,
- gsize instance_scale);
-GskVulkanOp * gsk_vulkan_op_draw_command (GskVulkanOp *op,
- GskVulkanRender *render,
- VkPipelineLayout pipeline_layout,
+ VkRenderPass render_pass,
VkCommandBuffer command_buffer);
G_END_DECLS
#include "gskvulkanoutsetshadowopprivate.h"
#include "gskvulkanprivate.h"
+#include "gskvulkanshaderopprivate.h"
#include "gsk/gskroundedrectprivate.h"
#include "vulkan/resources/outset-shadow.vert.h"
struct _GskVulkanOutsetShadowOp
{
- GskVulkanOp op;
+ GskVulkanShaderOp op;
GskRoundedRect outline;
GdkRGBA color;
guchar *data)
{
GskVulkanOutsetShadowOp *self = (GskVulkanOutsetShadowOp *) op;
- GskVulkanOutsetShadowInstance *instance = (GskVulkanOutsetShadowInstance *) (data + op->vertex_offset);
+ GskVulkanOutsetShadowInstance *instance = (GskVulkanOutsetShadowInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset);
gsk_rounded_rect_to_float (&self->outline, graphene_point_zero (), instance->outline);
gsk_vulkan_rgba_to_float (&self->color, instance->color);
{
}
-static const GskVulkanOpClass GSK_VULKAN_OUTSET_SHADOW_OP_CLASS = {
- GSK_VULKAN_OP_SIZE (GskVulkanOutsetShadowOp),
- GSK_VULKAN_STAGE_COMMAND,
+static const GskVulkanShaderOpClass GSK_VULKAN_OUTSET_SHADOW_OP_CLASS = {
+ {
+ GSK_VULKAN_OP_SIZE (GskVulkanOutsetShadowOp),
+ GSK_VULKAN_STAGE_COMMAND,
+ gsk_vulkan_outset_shadow_op_finish,
+ gsk_vulkan_outset_shadow_op_print,
+ gsk_vulkan_shader_op_count_vertex_data,
+ gsk_vulkan_outset_shadow_op_collect_vertex_data,
+ gsk_vulkan_outset_shadow_op_reserve_descriptor_sets,
+ gsk_vulkan_shader_op_command
+ },
"outset-shadow",
&gsk_vulkan_outset_shadow_info,
- gsk_vulkan_outset_shadow_op_finish,
- gsk_vulkan_outset_shadow_op_print,
- gsk_vulkan_op_draw_count_vertex_data,
- gsk_vulkan_outset_shadow_op_collect_vertex_data,
- gsk_vulkan_outset_shadow_op_reserve_descriptor_sets,
- gsk_vulkan_op_draw_command
};
void
{
GskVulkanOutsetShadowOp *self;
- self = (GskVulkanOutsetShadowOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_OUTSET_SHADOW_OP_CLASS);
+ self = (GskVulkanOutsetShadowOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_OUTSET_SHADOW_OP_CLASS.parent_class);
- ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
+ ((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;
static GskVulkanOp *
gsk_vulkan_push_constants_op_command (GskVulkanOp *op,
GskVulkanRender *render,
- VkPipelineLayout pipeline_layout,
+ VkRenderPass render_pass,
VkCommandBuffer command_buffer)
{
GskVulkanPushConstantsOp *self = (GskVulkanPushConstantsOp *) op;
vkCmdPushConstants (command_buffer,
- pipeline_layout,
+ gsk_vulkan_render_get_pipeline_layout (render),
VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT,
0,
sizeof (self->instance),
static const GskVulkanOpClass GSK_VULKAN_PUSH_CONSTANTS_OP_CLASS = {
GSK_VULKAN_OP_SIZE (GskVulkanPushConstantsOp),
GSK_VULKAN_STAGE_COMMAND,
- NULL,
- NULL,
gsk_vulkan_push_constants_op_finish,
gsk_vulkan_push_constants_op_print,
gsk_vulkan_push_constants_op_count_vertex_data,
#include "gskvulkanrendererprivate.h"
#include "gskvulkanrenderpassprivate.h"
#include "gskvulkanrenderpassopprivate.h"
+#include "gskvulkanshaderopprivate.h"
#include "gdk/gdkvulkancontextprivate.h"
gsk_vulkan_render_verbose_print (self, "after sort");
}
+VkPipelineLayout
+gsk_vulkan_render_get_pipeline_layout (GskVulkanRender *self)
+{
+ return self->pipeline_layout;
+}
+
VkPipeline
gsk_vulkan_render_get_pipeline (GskVulkanRender *self,
const GskVulkanOpClass *op_class,
const char *clip_type,
- VkFormat format,
VkRenderPass render_pass)
{
+ const GskVulkanShaderOpClass *shader_op_class = (const GskVulkanShaderOpClass *) op_class;
PipelineCacheKey cache_key;
VkPipeline pipeline;
GdkDisplay *display;
cache_key = (PipelineCacheKey) {
.op_class = op_class,
.clip_type = clip_type,
- .format = format,
+ .format = gsk_vulkan_image_get_vk_format (self->target)
};
pipeline = g_hash_table_lookup (self->pipeline_cache, &cache_key);
if (pipeline)
return pipeline;
display = gdk_draw_context_get_display (GDK_DRAW_CONTEXT (self->vulkan));
- vertex_shader_name = g_strconcat ("/org/gtk/libgsk/vulkan/", op_class->shader_name, clip_type, ".vert.spv", NULL);
- fragment_shader_name = g_strconcat ("/org/gtk/libgsk/vulkan/", op_class->shader_name, clip_type, ".frag.spv", NULL);
+ 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);
GSK_VK_CHECK (vkCreateGraphicsPipelines, gdk_vulkan_context_get_device (self->vulkan),
gdk_vulkan_context_get_pipeline_cache (self->vulkan),
.pName = "main",
},
},
- .pVertexInputState = op_class->vertex_input_state,
+ .pVertexInputState = shader_op_class->vertex_input_state,
.pInputAssemblyState = &(VkPipelineInputAssemblyStateCreateInfo) {
.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,
op = self->first_op;
while (op)
{
- op = gsk_vulkan_op_command (op, self, self->pipeline_layout, command_buffer);
+ op = gsk_vulkan_op_command (op, self, VK_NULL_HANDLE, command_buffer);
}
gsk_vulkan_command_pool_submit_buffer (self->command_pool,
static GskVulkanOp *
gsk_vulkan_render_pass_op_command (GskVulkanOp *op,
GskVulkanRender *render,
- VkPipelineLayout pipeline_layout,
+ VkRenderPass render_pass,
VkCommandBuffer command_buffer)
{
GskVulkanRenderPassOp *self = (GskVulkanRenderPassOp *) op;
- VkPipeline current_pipeline = VK_NULL_HANDLE;
- const GskVulkanOpClass *current_pipeline_class = NULL;
- const char *current_pipeline_clip_type = NULL;
VkRenderPass vk_render_pass;
+ /* nesting render passes not allowed */
+ g_assert (render_pass == VK_NULL_HANDLE);
+
vk_render_pass = gsk_vulkan_render_get_render_pass (render,
gsk_vulkan_image_get_vk_format (self->image),
self->initial_layout,
op = op->next;
while (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 (render,
- op->op_class,
- op->clip_type,
- gsk_vulkan_image_get_vk_format (self->image),
- 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, render, pipeline_layout, command_buffer);
+ op = gsk_vulkan_op_command (op, render, vk_render_pass, command_buffer);
}
- op = gsk_vulkan_op_command (op, render, pipeline_layout, command_buffer);
+ op = gsk_vulkan_op_command (op, render, vk_render_pass, command_buffer);
return op;
}
static const GskVulkanOpClass GSK_VULKAN_RENDER_PASS_OP_CLASS = {
GSK_VULKAN_OP_SIZE (GskVulkanRenderPassOp),
GSK_VULKAN_STAGE_BEGIN_PASS,
- NULL,
- NULL,
gsk_vulkan_render_pass_op_finish,
gsk_vulkan_render_pass_op_print,
gsk_vulkan_render_pass_op_count_vertex_data,
static GskVulkanOp *
gsk_vulkan_render_pass_end_op_command (GskVulkanOp *op,
GskVulkanRender *render,
- VkPipelineLayout pipeline_layout,
+ VkRenderPass render_pass,
VkCommandBuffer command_buffer)
{
GskVulkanRenderPassEndOp *self = (GskVulkanRenderPassEndOp *) op;
static const GskVulkanOpClass GSK_VULKAN_RENDER_PASS_END_OP_CLASS = {
GSK_VULKAN_OP_SIZE (GskVulkanRenderPassEndOp),
GSK_VULKAN_STAGE_END_PASS,
- NULL,
- NULL,
gsk_vulkan_render_pass_end_op_finish,
gsk_vulkan_render_pass_end_op_print,
gsk_vulkan_render_pass_end_op_count_vertex_data,
gpointer gsk_vulkan_render_alloc_op (GskVulkanRender *self,
gsize size);
+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,
- VkFormat format,
VkRenderPass render_pass);
VkRenderPass gsk_vulkan_render_get_render_pass (GskVulkanRender *self,
VkFormat format,
static GskVulkanOp *
gsk_vulkan_scissor_op_command (GskVulkanOp *op,
GskVulkanRender *render,
- VkPipelineLayout pipeline_layout,
+ VkRenderPass render_pass,
VkCommandBuffer command_buffer)
{
GskVulkanScissorOp *self = (GskVulkanScissorOp *) op;
static const GskVulkanOpClass GSK_VULKAN_SCISSOR_OP_CLASS = {
GSK_VULKAN_OP_SIZE (GskVulkanScissorOp),
GSK_VULKAN_STAGE_COMMAND,
- NULL,
- NULL,
gsk_vulkan_scissor_op_finish,
gsk_vulkan_scissor_op_print,
gsk_vulkan_scissor_op_count_vertex_data,
--- /dev/null
+#include "config.h"
+
+#include "gskvulkanshaderopprivate.h"
+
+static inline gsize
+round_up (gsize number, gsize divisor)
+{
+ return (number + divisor - 1) / divisor * divisor;
+}
+
+gsize
+gsk_vulkan_shader_op_count_vertex_data (GskVulkanOp *op,
+ gsize n_bytes)
+{
+ GskVulkanShaderOp *self = (GskVulkanShaderOp *) op;
+ GskVulkanShaderOpClass *shader_op_class = ((GskVulkanShaderOpClass *) op->op_class);
+ gsize vertex_stride;
+
+ vertex_stride = shader_op_class->vertex_input_state->pVertexBindingDescriptions[0].stride;
+ n_bytes = round_up (n_bytes, vertex_stride);
+ self->vertex_offset = n_bytes;
+ n_bytes += vertex_stride;
+ return n_bytes;
+}
+
+GskVulkanOp *
+gsk_vulkan_shader_op_command_n (GskVulkanOp *op,
+ GskVulkanRender *render,
+ VkRenderPass render_pass,
+ VkCommandBuffer command_buffer,
+ gsize instance_scale)
+{
+ GskVulkanShaderOp *self = (GskVulkanShaderOp *) op;
+ GskVulkanShaderOpClass *shader_op_class = ((GskVulkanShaderOpClass *) op->op_class);
+ GskVulkanOp *next;
+ gsize stride = shader_op_class->vertex_input_state->pVertexBindingDescriptions[0].stride;
+ gsize i;
+
+ i = 1;
+ for (next = op->next; next && i < 10 * 1000; next = next->next)
+ {
+ GskVulkanShaderOp *next_shader = (GskVulkanShaderOp *) next;
+
+ if (next->op_class != op->op_class ||
+ next_shader->vertex_offset != self->vertex_offset + i * stride)
+ break;
+
+ i++;
+ }
+
+ vkCmdBindPipeline (command_buffer,
+ VK_PIPELINE_BIND_POINT_GRAPHICS,
+ gsk_vulkan_render_get_pipeline (render,
+ op->op_class,
+ self->clip_type,
+ render_pass));
+
+ vkCmdDraw (command_buffer,
+ 6 * instance_scale, i,
+ 0, self->vertex_offset / stride);
+
+ return next;
+}
+
+GskVulkanOp *
+gsk_vulkan_shader_op_command (GskVulkanOp *op,
+ GskVulkanRender *render,
+ VkRenderPass render_pass,
+ VkCommandBuffer command_buffer)
+{
+ return gsk_vulkan_shader_op_command_n (op, render, render_pass, command_buffer, 1);
+}
+
--- /dev/null
+#pragma once
+
+#include "gskvulkanopprivate.h"
+
+G_BEGIN_DECLS
+
+typedef struct _GskVulkanShaderOp GskVulkanShaderOp;
+typedef struct _GskVulkanShaderOpClass GskVulkanShaderOpClass;
+
+struct _GskVulkanShaderOp
+{
+ GskVulkanOp parent_op;
+
+ const /* interned */ char *clip_type;
+ gsize vertex_offset;
+};
+
+struct _GskVulkanShaderOpClass
+{
+ GskVulkanOpClass parent_class;
+
+ const char * shader_name;
+ const VkPipelineVertexInputStateCreateInfo *vertex_input_state;
+};
+
+gsize gsk_vulkan_shader_op_count_vertex_data (GskVulkanOp *op,
+ gsize n_bytes);
+GskVulkanOp * gsk_vulkan_shader_op_command_n (GskVulkanOp *op,
+ GskVulkanRender *render,
+ VkRenderPass render_pass,
+ VkCommandBuffer command_buffer,
+ gsize instance_scale);
+GskVulkanOp * gsk_vulkan_shader_op_command (GskVulkanOp *op,
+ GskVulkanRender *render,
+ VkRenderPass render_pass,
+ VkCommandBuffer command_buffer);
+
+G_END_DECLS
+
#include "gskvulkantextureopprivate.h"
#include "gskvulkanprivate.h"
+#include "gskvulkanshaderopprivate.h"
#include "vulkan/resources/texture.vert.h"
struct _GskVulkanTextureOp
{
- GskVulkanOp op;
+ GskVulkanShaderOp op;
GskVulkanImage *image;
GskVulkanRenderSampler sampler;
guchar *data)
{
GskVulkanTextureOp *self = (GskVulkanTextureOp *) op;
- GskVulkanTextureInstance *instance = (GskVulkanTextureInstance *) (data + op->vertex_offset);
+ GskVulkanTextureInstance *instance = (GskVulkanTextureInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset);
instance->rect[0] = self->rect.origin.x;
instance->rect[1] = self->rect.origin.y;
self->image_descriptor = gsk_vulkan_render_get_image_descriptor (render, self->image, self->sampler);
}
-static const GskVulkanOpClass GSK_VULKAN_TEXTURE_OP_CLASS = {
- GSK_VULKAN_OP_SIZE (GskVulkanTextureOp),
- GSK_VULKAN_STAGE_COMMAND,
+static const GskVulkanShaderOpClass GSK_VULKAN_TEXTURE_OP_CLASS = {
+ {
+ GSK_VULKAN_OP_SIZE (GskVulkanTextureOp),
+ GSK_VULKAN_STAGE_COMMAND,
+ gsk_vulkan_texture_op_finish,
+ gsk_vulkan_texture_op_print,
+ gsk_vulkan_shader_op_count_vertex_data,
+ gsk_vulkan_texture_op_collect_vertex_data,
+ gsk_vulkan_texture_op_reserve_descriptor_sets,
+ gsk_vulkan_shader_op_command
+ },
"texture",
&gsk_vulkan_texture_info,
- gsk_vulkan_texture_op_finish,
- gsk_vulkan_texture_op_print,
- gsk_vulkan_op_draw_count_vertex_data,
- gsk_vulkan_texture_op_collect_vertex_data,
- gsk_vulkan_texture_op_reserve_descriptor_sets,
- gsk_vulkan_op_draw_command
};
void
{
GskVulkanTextureOp *self;
- self = (GskVulkanTextureOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_TEXTURE_OP_CLASS);
+ self = (GskVulkanTextureOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_TEXTURE_OP_CLASS.parent_class);
- ((GskVulkanOp *) self)->clip_type = g_intern_string (clip_type);
+ ((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);
static GskVulkanOp *
gsk_vulkan_upload_op_command_with_area (GskVulkanOp *op,
GskVulkanRender *render,
- VkPipelineLayout pipeline_layout,
VkCommandBuffer command_buffer,
GskVulkanImage *image,
const cairo_rectangle_int_t *area,
static GskVulkanOp *
gsk_vulkan_upload_op_command (GskVulkanOp *op,
GskVulkanRender *render,
- VkPipelineLayout pipeline_layout,
VkCommandBuffer command_buffer,
GskVulkanImage *image,
void (* draw_func) (GskVulkanOp *, guchar *, gsize),
return gsk_vulkan_upload_op_command_with_area (op,
render,
- pipeline_layout,
command_buffer,
image,
&(cairo_rectangle_int_t) {
static GskVulkanOp *
gsk_vulkan_upload_texture_op_command (GskVulkanOp *op,
GskVulkanRender *render,
- VkPipelineLayout pipeline_layout,
+ VkRenderPass render_pass,
VkCommandBuffer command_buffer)
{
GskVulkanUploadTextureOp *self = (GskVulkanUploadTextureOp *) op;
return gsk_vulkan_upload_op_command (op,
render,
- pipeline_layout,
command_buffer,
self->image,
gsk_vulkan_upload_texture_op_draw,
static const GskVulkanOpClass GSK_VULKAN_UPLOAD_TEXTURE_OP_CLASS = {
GSK_VULKAN_OP_SIZE (GskVulkanUploadTextureOp),
GSK_VULKAN_STAGE_UPLOAD,
- NULL,
- NULL,
gsk_vulkan_upload_texture_op_finish,
gsk_vulkan_upload_texture_op_print,
gsk_vulkan_upload_op_count_vertex_data,
static GskVulkanOp *
gsk_vulkan_upload_cairo_op_command (GskVulkanOp *op,
GskVulkanRender *render,
- VkPipelineLayout pipeline_layout,
+ VkRenderPass render_pass,
VkCommandBuffer command_buffer)
{
GskVulkanUploadCairoOp *self = (GskVulkanUploadCairoOp *) op;
return gsk_vulkan_upload_op_command (op,
render,
- pipeline_layout,
command_buffer,
self->image,
gsk_vulkan_upload_cairo_op_draw,
static const GskVulkanOpClass GSK_VULKAN_UPLOAD_CAIRO_OP_CLASS = {
GSK_VULKAN_OP_SIZE (GskVulkanUploadCairoOp),
GSK_VULKAN_STAGE_UPLOAD,
- NULL,
- NULL,
gsk_vulkan_upload_cairo_op_finish,
gsk_vulkan_upload_cairo_op_print,
gsk_vulkan_upload_op_count_vertex_data,
static GskVulkanOp *
gsk_vulkan_upload_glyph_op_command (GskVulkanOp *op,
GskVulkanRender *render,
- VkPipelineLayout pipeline_layout,
+ VkRenderPass render_pass,
VkCommandBuffer command_buffer)
{
GskVulkanUploadGlyphOp *self = (GskVulkanUploadGlyphOp *) op;
return gsk_vulkan_upload_op_command_with_area (op,
render,
- pipeline_layout,
command_buffer,
self->image,
&self->area,
static const GskVulkanOpClass GSK_VULKAN_UPLOAD_GLYPH_OP_CLASS = {
GSK_VULKAN_OP_SIZE (GskVulkanUploadGlyphOp),
GSK_VULKAN_STAGE_UPLOAD,
- NULL,
- NULL,
gsk_vulkan_upload_glyph_op_finish,
gsk_vulkan_upload_glyph_op_print,
gsk_vulkan_upload_op_count_vertex_data,