mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-09-19 21:40:22 +00:00
vulkan: Introduce GskVulkanShaderOp
It's the new base class for shaders now. We're doing deep inheritance now, woohoo! Also, port all the shader ops to it.
This commit is contained in:
parent
ca69fd2b7a
commit
f366ccc0b2
@ -133,6 +133,7 @@ if have_vulkan
|
||||
'vulkan/gskvulkanrenderpass.c',
|
||||
'vulkan/gskvulkanrenderpassop.c',
|
||||
'vulkan/gskvulkanscissorop.c',
|
||||
'vulkan/gskvulkanshaderop.c',
|
||||
'vulkan/gskvulkantextureop.c',
|
||||
'vulkan/gskvulkanuploadop.c',
|
||||
])
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include "gskvulkanblendmodeopprivate.h"
|
||||
|
||||
#include "gskvulkanprivate.h"
|
||||
#include "gskvulkanshaderopprivate.h"
|
||||
|
||||
#include "vulkan/resources/blend-mode.vert.h"
|
||||
|
||||
@ -10,7 +11,7 @@ typedef struct _GskVulkanBlendModeOp GskVulkanBlendModeOp;
|
||||
|
||||
struct _GskVulkanBlendModeOp
|
||||
{
|
||||
GskVulkanOp op;
|
||||
GskVulkanShaderOp op;
|
||||
|
||||
graphene_rect_t bounds;
|
||||
GskBlendMode blend_mode;
|
||||
@ -50,7 +51,7 @@ gsk_vulkan_blend_mode_op_collect_vertex_data (GskVulkanOp *op,
|
||||
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);
|
||||
@ -77,32 +78,19 @@ gsk_vulkan_blend_mode_op_reserve_descriptor_sets (GskVulkanOp *op,
|
||||
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
|
||||
@ -120,9 +108,9 @@ gsk_vulkan_blend_mode_op (GskVulkanRender *render,
|
||||
{
|
||||
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;
|
||||
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include "gskvulkanbluropprivate.h"
|
||||
|
||||
#include "gskvulkanprivate.h"
|
||||
#include "gskvulkanshaderopprivate.h"
|
||||
|
||||
#include "vulkan/resources/blur.vert.h"
|
||||
|
||||
@ -10,7 +11,7 @@ typedef struct _GskVulkanBlurOp GskVulkanBlurOp;
|
||||
|
||||
struct _GskVulkanBlurOp
|
||||
{
|
||||
GskVulkanOp op;
|
||||
GskVulkanShaderOp op;
|
||||
|
||||
GskVulkanImage *image;
|
||||
graphene_rect_t rect;
|
||||
@ -47,7 +48,7 @@ gsk_vulkan_blur_op_collect_vertex_data (GskVulkanOp *op,
|
||||
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);
|
||||
@ -66,17 +67,19 @@ gsk_vulkan_blur_op_reserve_descriptor_sets (GskVulkanOp *op,
|
||||
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
|
||||
@ -92,9 +95,9 @@ gsk_vulkan_blur_op (GskVulkanRender *render,
|
||||
|
||||
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);
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include "gskvulkanborderopprivate.h"
|
||||
|
||||
#include "gskvulkanprivate.h"
|
||||
#include "gskvulkanshaderopprivate.h"
|
||||
#include "gsk/gskroundedrectprivate.h"
|
||||
|
||||
#include "vulkan/resources/border.vert.h"
|
||||
@ -11,7 +12,7 @@ typedef struct _GskVulkanBorderOp GskVulkanBorderOp;
|
||||
|
||||
struct _GskVulkanBorderOp
|
||||
{
|
||||
GskVulkanOp op;
|
||||
GskVulkanShaderOp op;
|
||||
|
||||
GskRoundedRect outline;
|
||||
float widths[4];
|
||||
@ -56,7 +57,7 @@ gsk_vulkan_border_op_collect_vertex_data (GskVulkanOp *op,
|
||||
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);
|
||||
@ -74,25 +75,27 @@ gsk_vulkan_border_op_reserve_descriptor_sets (GskVulkanOp *op,
|
||||
}
|
||||
|
||||
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
|
||||
@ -106,9 +109,9 @@ gsk_vulkan_border_op (GskVulkanRender *render,
|
||||
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++)
|
||||
|
@ -62,7 +62,7 @@ gsk_vulkan_init_clear_value (VkClearValue *value,
|
||||
static GskVulkanOp *
|
||||
gsk_vulkan_clear_op_command (GskVulkanOp *op,
|
||||
GskVulkanRender *render,
|
||||
VkPipelineLayout pipeline_layout,
|
||||
VkRenderPass render_pass,
|
||||
VkCommandBuffer command_buffer)
|
||||
{
|
||||
GskVulkanClearOp *self = (GskVulkanClearOp *) op;
|
||||
@ -93,8 +93,6 @@ gsk_vulkan_clear_op_command (GskVulkanOp *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,
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include "gskvulkancolormatrixopprivate.h"
|
||||
|
||||
#include "gskvulkanprivate.h"
|
||||
#include "gskvulkanshaderopprivate.h"
|
||||
|
||||
#include "vulkan/resources/color-matrix.vert.h"
|
||||
|
||||
@ -10,7 +11,7 @@ typedef struct _GskVulkanColorMatrixOp GskVulkanColorMatrixOp;
|
||||
|
||||
struct _GskVulkanColorMatrixOp
|
||||
{
|
||||
GskVulkanOp op;
|
||||
GskVulkanShaderOp op;
|
||||
|
||||
GskVulkanImage *image;
|
||||
graphene_matrix_t color_matrix;
|
||||
@ -47,7 +48,7 @@ gsk_vulkan_color_matrix_op_collect_vertex_data (GskVulkanOp *op,
|
||||
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;
|
||||
@ -73,17 +74,19 @@ gsk_vulkan_color_matrix_op_reserve_descriptor_sets (GskVulkanOp *op,
|
||||
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
|
||||
@ -98,9 +101,9 @@ gsk_vulkan_color_matrix_op (GskVulkanRender *render,
|
||||
{
|
||||
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);
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include "gskvulkancoloropprivate.h"
|
||||
|
||||
#include "gskvulkanprivate.h"
|
||||
#include "gskvulkanshaderopprivate.h"
|
||||
|
||||
#include "vulkan/resources/color.vert.h"
|
||||
|
||||
@ -10,7 +11,7 @@ typedef struct _GskVulkanColorOp GskVulkanColorOp;
|
||||
|
||||
struct _GskVulkanColorOp
|
||||
{
|
||||
GskVulkanOp op;
|
||||
GskVulkanShaderOp op;
|
||||
|
||||
graphene_rect_t rect;
|
||||
GdkRGBA color;
|
||||
@ -40,7 +41,7 @@ gsk_vulkan_color_op_collect_vertex_data (GskVulkanOp *op,
|
||||
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;
|
||||
@ -58,17 +59,19 @@ gsk_vulkan_color_op_reserve_descriptor_sets (GskVulkanOp *op,
|
||||
{
|
||||
}
|
||||
|
||||
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
|
||||
@ -80,9 +83,9 @@ gsk_vulkan_color_op (GskVulkanRender *render,
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include "gskvulkancrossfadeopprivate.h"
|
||||
|
||||
#include "gskvulkanprivate.h"
|
||||
#include "gskvulkanshaderopprivate.h"
|
||||
|
||||
#include "vulkan/resources/cross-fade.vert.h"
|
||||
|
||||
@ -10,7 +11,7 @@ typedef struct _GskVulkanCrossFadeOp GskVulkanCrossFadeOp;
|
||||
|
||||
struct _GskVulkanCrossFadeOp
|
||||
{
|
||||
GskVulkanOp op;
|
||||
GskVulkanShaderOp op;
|
||||
|
||||
graphene_rect_t bounds;
|
||||
float progress;
|
||||
@ -50,7 +51,7 @@ gsk_vulkan_cross_fade_op_collect_vertex_data (GskVulkanOp *op,
|
||||
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);
|
||||
@ -77,17 +78,19 @@ gsk_vulkan_cross_fade_op_reserve_descriptor_sets (GskVulkanOp *op,
|
||||
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
|
||||
@ -105,9 +108,9 @@ gsk_vulkan_cross_fade_op (GskVulkanRender *render,
|
||||
{
|
||||
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;
|
||||
|
||||
|
@ -28,7 +28,6 @@ gsk_vulkan_download_op_reserve_descriptor_sets (GskVulkanOp *op,
|
||||
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,
|
||||
@ -190,14 +189,13 @@ gsk_vulkan_download_op_print (GskVulkanOp *op,
|
||||
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) {
|
||||
@ -211,8 +209,6 @@ gsk_vulkan_download_op_command (GskVulkanOp *op,
|
||||
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,
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include "gskvulkanglyphopprivate.h"
|
||||
|
||||
#include "gskvulkanprivate.h"
|
||||
#include "gskvulkanshaderopprivate.h"
|
||||
|
||||
#include "vulkan/resources/glyph.vert.h"
|
||||
|
||||
@ -10,7 +11,7 @@ typedef struct _GskVulkanGlyphOp GskVulkanGlyphOp;
|
||||
|
||||
struct _GskVulkanGlyphOp
|
||||
{
|
||||
GskVulkanOp op;
|
||||
GskVulkanShaderOp op;
|
||||
|
||||
GskVulkanImage *image;
|
||||
graphene_rect_t rect;
|
||||
@ -47,7 +48,7 @@ gsk_vulkan_glyph_op_collect_vertex_data (GskVulkanOp *op,
|
||||
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);
|
||||
@ -64,17 +65,19 @@ gsk_vulkan_glyph_op_reserve_descriptor_sets (GskVulkanOp *op,
|
||||
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
|
||||
@ -88,9 +91,9 @@ gsk_vulkan_glyph_op (GskVulkanRender *render,
|
||||
{
|
||||
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);
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include "gskvulkaninsetshadowopprivate.h"
|
||||
|
||||
#include "gskvulkanprivate.h"
|
||||
#include "gskvulkanshaderopprivate.h"
|
||||
#include "gsk/gskroundedrectprivate.h"
|
||||
|
||||
#include "vulkan/resources/inset-shadow.vert.h"
|
||||
@ -11,7 +12,7 @@ typedef struct _GskVulkanInsetShadowOp GskVulkanInsetShadowOp;
|
||||
|
||||
struct _GskVulkanInsetShadowOp
|
||||
{
|
||||
GskVulkanOp op;
|
||||
GskVulkanShaderOp op;
|
||||
|
||||
GskRoundedRect outline;
|
||||
GdkRGBA color;
|
||||
@ -45,7 +46,7 @@ gsk_vulkan_inset_shadow_op_collect_vertex_data (GskVulkanOp *op,
|
||||
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);
|
||||
@ -60,17 +61,19 @@ gsk_vulkan_inset_shadow_op_reserve_descriptor_sets (GskVulkanOp *op,
|
||||
{
|
||||
}
|
||||
|
||||
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
|
||||
@ -85,9 +88,9 @@ gsk_vulkan_inset_shadow_op (GskVulkanRender *render,
|
||||
{
|
||||
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;
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include "gskvulkanlineargradientopprivate.h"
|
||||
|
||||
#include "gskvulkanprivate.h"
|
||||
#include "gskvulkanshaderopprivate.h"
|
||||
|
||||
#include "vulkan/resources/linear.vert.h"
|
||||
|
||||
@ -10,7 +11,7 @@ typedef struct _GskVulkanLinearGradientOp GskVulkanLinearGradientOp;
|
||||
|
||||
struct _GskVulkanLinearGradientOp
|
||||
{
|
||||
GskVulkanOp op;
|
||||
GskVulkanShaderOp op;
|
||||
|
||||
graphene_rect_t rect;
|
||||
graphene_point_t start;
|
||||
@ -48,7 +49,7 @@ gsk_vulkan_linear_gradient_op_collect_vertex_data (GskVulkanOp *op,
|
||||
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);
|
||||
@ -72,17 +73,19 @@ gsk_vulkan_linear_gradient_op_reserve_descriptor_sets (GskVulkanOp *op,
|
||||
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
|
||||
@ -98,9 +101,9 @@ gsk_vulkan_linear_gradient_op (GskVulkanRender *render,
|
||||
{
|
||||
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);
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include "gskvulkanmaskopprivate.h"
|
||||
|
||||
#include "gskvulkanprivate.h"
|
||||
#include "gskvulkanshaderopprivate.h"
|
||||
|
||||
#include "vulkan/resources/mask.vert.h"
|
||||
|
||||
@ -10,7 +11,7 @@ typedef struct _GskVulkanMaskOp GskVulkanMaskOp;
|
||||
|
||||
struct _GskVulkanMaskOp
|
||||
{
|
||||
GskVulkanOp op;
|
||||
GskVulkanShaderOp op;
|
||||
|
||||
struct {
|
||||
GskVulkanImage *image;
|
||||
@ -67,7 +68,7 @@ gsk_vulkan_mask_op_collect_vertex_data (GskVulkanOp *op,
|
||||
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);
|
||||
@ -88,17 +89,19 @@ gsk_vulkan_mask_op_reserve_descriptor_sets (GskVulkanOp *op,
|
||||
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
|
||||
@ -115,9 +118,9 @@ gsk_vulkan_mask_op (GskVulkanRender *render,
|
||||
{
|
||||
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);
|
||||
|
@ -52,65 +52,9 @@ gsk_vulkan_op_reserve_descriptor_sets (GskVulkanOp *op,
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -19,9 +19,7 @@ struct _GskVulkanOp
|
||||
{
|
||||
const GskVulkanOpClass *op_class;
|
||||
|
||||
const /* interned */ char *clip_type;
|
||||
GskVulkanOp *next;
|
||||
gsize vertex_offset;
|
||||
};
|
||||
|
||||
struct _GskVulkanOpClass
|
||||
@ -29,9 +27,6 @@ struct _GskVulkanOpClass
|
||||
gsize size;
|
||||
GskVulkanStage stage;
|
||||
|
||||
const char * shader_name;
|
||||
const VkPipelineVertexInputStateCreateInfo *vertex_input_state;
|
||||
|
||||
void (* finish) (GskVulkanOp *op);
|
||||
|
||||
void (* print) (GskVulkanOp *op,
|
||||
@ -46,7 +41,7 @@ struct _GskVulkanOpClass
|
||||
GskVulkanRender *render);
|
||||
GskVulkanOp * (* command) (GskVulkanOp *op,
|
||||
GskVulkanRender *render,
|
||||
VkPipelineLayout pipeline_layout,
|
||||
VkRenderPass render_pass,
|
||||
VkCommandBuffer command_buffer);
|
||||
};
|
||||
|
||||
@ -69,19 +64,7 @@ void gsk_vulkan_op_reserve_descriptor_sets (GskVulk
|
||||
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
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include "gskvulkanoutsetshadowopprivate.h"
|
||||
|
||||
#include "gskvulkanprivate.h"
|
||||
#include "gskvulkanshaderopprivate.h"
|
||||
#include "gsk/gskroundedrectprivate.h"
|
||||
|
||||
#include "vulkan/resources/outset-shadow.vert.h"
|
||||
@ -11,7 +12,7 @@ typedef struct _GskVulkanOutsetShadowOp GskVulkanOutsetShadowOp;
|
||||
|
||||
struct _GskVulkanOutsetShadowOp
|
||||
{
|
||||
GskVulkanOp op;
|
||||
GskVulkanShaderOp op;
|
||||
|
||||
GskRoundedRect outline;
|
||||
GdkRGBA color;
|
||||
@ -45,7 +46,7 @@ gsk_vulkan_outset_shadow_op_collect_vertex_data (GskVulkanOp *op,
|
||||
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);
|
||||
@ -60,17 +61,19 @@ gsk_vulkan_outset_shadow_op_reserve_descriptor_sets (GskVulkanOp *op,
|
||||
{
|
||||
}
|
||||
|
||||
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
|
||||
@ -85,9 +88,9 @@ gsk_vulkan_outset_shadow_op (GskVulkanRender *render,
|
||||
{
|
||||
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;
|
||||
|
@ -79,13 +79,13 @@ gsk_vulkan_push_constants_op_reserve_descriptor_sets (GskVulkanOp *op,
|
||||
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),
|
||||
@ -97,8 +97,6 @@ gsk_vulkan_push_constants_op_command (GskVulkanOp *op,
|
||||
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,
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include "gskvulkanrendererprivate.h"
|
||||
#include "gskvulkanrenderpassprivate.h"
|
||||
#include "gskvulkanrenderpassopprivate.h"
|
||||
#include "gskvulkanshaderopprivate.h"
|
||||
|
||||
#include "gdk/gdkvulkancontextprivate.h"
|
||||
|
||||
@ -512,13 +513,19 @@ gsk_vulkan_render_add_node (GskVulkanRender *self,
|
||||
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;
|
||||
@ -527,15 +534,15 @@ gsk_vulkan_render_get_pipeline (GskVulkanRender *self,
|
||||
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),
|
||||
@ -557,7 +564,7 @@ gsk_vulkan_render_get_pipeline (GskVulkanRender *self,
|
||||
.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,
|
||||
@ -920,7 +927,7 @@ gsk_vulkan_render_submit (GskVulkanRender *self)
|
||||
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,
|
||||
|
@ -67,15 +67,15 @@ gsk_vulkan_render_pass_op_reserve_descriptor_sets (GskVulkanOp *op,
|
||||
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,
|
||||
@ -114,26 +114,10 @@ gsk_vulkan_render_pass_op_command (GskVulkanOp *op,
|
||||
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;
|
||||
}
|
||||
@ -141,8 +125,6 @@ gsk_vulkan_render_pass_op_command (GskVulkanOp *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,
|
||||
@ -204,7 +186,7 @@ gsk_vulkan_render_pass_end_op_reserve_descriptor_sets (GskVulkanOp *op,
|
||||
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;
|
||||
@ -220,8 +202,6 @@ gsk_vulkan_render_pass_end_op_command (GskVulkanOp *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,
|
||||
|
@ -41,10 +41,10 @@ GdkVulkanContext * gsk_vulkan_render_get_context (GskVulk
|
||||
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,
|
||||
|
@ -53,7 +53,7 @@ gsk_vulkan_scissor_op_reserve_descriptor_sets (GskVulkanOp *op,
|
||||
static GskVulkanOp *
|
||||
gsk_vulkan_scissor_op_command (GskVulkanOp *op,
|
||||
GskVulkanRender *render,
|
||||
VkPipelineLayout pipeline_layout,
|
||||
VkRenderPass render_pass,
|
||||
VkCommandBuffer command_buffer)
|
||||
{
|
||||
GskVulkanScissorOp *self = (GskVulkanScissorOp *) op;
|
||||
@ -72,8 +72,6 @@ gsk_vulkan_scissor_op_command (GskVulkanOp *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,
|
||||
|
73
gsk/vulkan/gskvulkanshaderop.c
Normal file
73
gsk/vulkan/gskvulkanshaderop.c
Normal file
@ -0,0 +1,73 @@
|
||||
#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);
|
||||
}
|
||||
|
39
gsk/vulkan/gskvulkanshaderopprivate.h
Normal file
39
gsk/vulkan/gskvulkanshaderopprivate.h
Normal file
@ -0,0 +1,39 @@
|
||||
#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
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include "gskvulkantextureopprivate.h"
|
||||
|
||||
#include "gskvulkanprivate.h"
|
||||
#include "gskvulkanshaderopprivate.h"
|
||||
|
||||
#include "vulkan/resources/texture.vert.h"
|
||||
|
||||
@ -10,7 +11,7 @@ typedef struct _GskVulkanTextureOp GskVulkanTextureOp;
|
||||
|
||||
struct _GskVulkanTextureOp
|
||||
{
|
||||
GskVulkanOp op;
|
||||
GskVulkanShaderOp op;
|
||||
|
||||
GskVulkanImage *image;
|
||||
GskVulkanRenderSampler sampler;
|
||||
@ -47,7 +48,7 @@ gsk_vulkan_texture_op_collect_vertex_data (GskVulkanOp *op,
|
||||
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;
|
||||
@ -69,17 +70,19 @@ gsk_vulkan_texture_op_reserve_descriptor_sets (GskVulkanOp *op,
|
||||
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
|
||||
@ -93,9 +96,9 @@ gsk_vulkan_texture_op (GskVulkanRender *render,
|
||||
{
|
||||
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);
|
||||
|
@ -28,7 +28,6 @@ gsk_vulkan_upload_op_reserve_descriptor_sets (GskVulkanOp *op,
|
||||
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,
|
||||
@ -147,7 +146,6 @@ gsk_vulkan_upload_op_command_with_area (GskVulkanOp *op,
|
||||
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),
|
||||
@ -173,7 +171,6 @@ gsk_vulkan_upload_op_command (GskVulkanOp *op,
|
||||
|
||||
return gsk_vulkan_upload_op_command_with_area (op,
|
||||
render,
|
||||
pipeline_layout,
|
||||
command_buffer,
|
||||
image,
|
||||
&(cairo_rectangle_int_t) {
|
||||
@ -237,14 +234,13 @@ gsk_vulkan_upload_texture_op_draw (GskVulkanOp *op,
|
||||
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,
|
||||
@ -254,8 +250,6 @@ gsk_vulkan_upload_texture_op_command (GskVulkanOp *op,
|
||||
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,
|
||||
@ -353,14 +347,13 @@ gsk_vulkan_upload_cairo_op_draw (GskVulkanOp *op,
|
||||
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,
|
||||
@ -370,8 +363,6 @@ gsk_vulkan_upload_cairo_op_command (GskVulkanOp *op,
|
||||
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,
|
||||
@ -483,14 +474,13 @@ gsk_vulkan_upload_glyph_op_draw (GskVulkanOp *op,
|
||||
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,
|
||||
@ -501,8 +491,6 @@ gsk_vulkan_upload_glyph_op_command (GskVulkanOp *op,
|
||||
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,
|
||||
|
Loading…
Reference in New Issue
Block a user