diff --git a/gsk/gskvulkanblendpipeline.c b/gsk/gskvulkanblendpipeline.c index 8a98fbcf83..6d939ca296 100644 --- a/gsk/gskvulkanblendpipeline.c +++ b/gsk/gskvulkanblendpipeline.c @@ -76,11 +76,12 @@ gsk_vulkan_blend_pipeline_init (GskVulkanBlendPipeline *self) } GskVulkanPipeline * -gsk_vulkan_blend_pipeline_new (GskVulkanPipelineLayout *layout, +gsk_vulkan_blend_pipeline_new (GdkVulkanContext *context, + VkPipelineLayout layout, const char *shader_name, VkRenderPass render_pass) { - return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_BLEND_PIPELINE, layout, shader_name, render_pass); + return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_BLEND_PIPELINE, context, layout, shader_name, render_pass); } gsize diff --git a/gsk/gskvulkanblendpipelineprivate.h b/gsk/gskvulkanblendpipelineprivate.h index 2d8bed5deb..eb471981b8 100644 --- a/gsk/gskvulkanblendpipelineprivate.h +++ b/gsk/gskvulkanblendpipelineprivate.h @@ -13,7 +13,8 @@ typedef struct _GskVulkanBlendPipelineLayout GskVulkanBlendPipelineLayout; G_DECLARE_FINAL_TYPE (GskVulkanBlendPipeline, gsk_vulkan_blend_pipeline, GSK, VULKAN_BLEND_PIPELINE, GskVulkanPipeline) -GskVulkanPipeline * gsk_vulkan_blend_pipeline_new (GskVulkanPipelineLayout * layout, +GskVulkanPipeline * gsk_vulkan_blend_pipeline_new (GdkVulkanContext *context, + VkPipelineLayout layout, const char *shader_name, VkRenderPass render_pass); diff --git a/gsk/gskvulkanblurpipeline.c b/gsk/gskvulkanblurpipeline.c index 779bf81ec0..6e9bff19a3 100644 --- a/gsk/gskvulkanblurpipeline.c +++ b/gsk/gskvulkanblurpipeline.c @@ -83,11 +83,12 @@ gsk_vulkan_blur_pipeline_init (GskVulkanBlurPipeline *self) } GskVulkanPipeline * -gsk_vulkan_blur_pipeline_new (GskVulkanPipelineLayout *layout, +gsk_vulkan_blur_pipeline_new (GdkVulkanContext *context, + VkPipelineLayout layout, const char *shader_name, VkRenderPass render_pass) { - return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_BLUR_PIPELINE, layout, shader_name, render_pass); + return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_BLUR_PIPELINE, context, layout, shader_name, render_pass); } gsize diff --git a/gsk/gskvulkanblurpipelineprivate.h b/gsk/gskvulkanblurpipelineprivate.h index 44b139d4bf..2fc4273668 100644 --- a/gsk/gskvulkanblurpipelineprivate.h +++ b/gsk/gskvulkanblurpipelineprivate.h @@ -13,7 +13,8 @@ typedef struct _GskVulkanBlurPipelineLayout GskVulkanBlurPipelineLayout; G_DECLARE_FINAL_TYPE (GskVulkanBlurPipeline, gsk_vulkan_blur_pipeline, GSK, VULKAN_BLUR_PIPELINE, GskVulkanPipeline) -GskVulkanPipeline * gsk_vulkan_blur_pipeline_new (GskVulkanPipelineLayout *layout, +GskVulkanPipeline * gsk_vulkan_blur_pipeline_new (GdkVulkanContext *context, + VkPipelineLayout layout, const char *shader_name, VkRenderPass render_pass); diff --git a/gsk/gskvulkanborderpipeline.c b/gsk/gskvulkanborderpipeline.c index ab6509b785..a0da43962b 100644 --- a/gsk/gskvulkanborderpipeline.c +++ b/gsk/gskvulkanborderpipeline.c @@ -115,11 +115,12 @@ gsk_vulkan_border_pipeline_init (GskVulkanBorderPipeline *self) } GskVulkanPipeline * -gsk_vulkan_border_pipeline_new (GskVulkanPipelineLayout *layout, - const char *shader_name, - VkRenderPass render_pass) +gsk_vulkan_border_pipeline_new (GdkVulkanContext *context, + VkPipelineLayout layout, + const char *shader_name, + VkRenderPass render_pass) { - return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_BORDER_PIPELINE, layout, shader_name, render_pass); + return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_BORDER_PIPELINE, context, layout, shader_name, render_pass); } gsize diff --git a/gsk/gskvulkanborderpipelineprivate.h b/gsk/gskvulkanborderpipelineprivate.h index de6d1768a7..d82679259d 100644 --- a/gsk/gskvulkanborderpipelineprivate.h +++ b/gsk/gskvulkanborderpipelineprivate.h @@ -14,7 +14,8 @@ typedef struct _GskVulkanBorderPipelineLayout GskVulkanBorderPipelineLayout; G_DECLARE_FINAL_TYPE (GskVulkanBorderPipeline, gsk_vulkan_border_pipeline, GSK, VULKAN_BORDER_PIPELINE, GskVulkanPipeline) -GskVulkanPipeline * gsk_vulkan_border_pipeline_new (GskVulkanPipelineLayout * layout, +GskVulkanPipeline * gsk_vulkan_border_pipeline_new (GdkVulkanContext *context, + VkPipelineLayout layout, const char *shader_name, VkRenderPass render_pass); diff --git a/gsk/gskvulkanboxshadowpipeline.c b/gsk/gskvulkanboxshadowpipeline.c index f5261261ab..fb272176d4 100644 --- a/gsk/gskvulkanboxshadowpipeline.c +++ b/gsk/gskvulkanboxshadowpipeline.c @@ -111,11 +111,12 @@ gsk_vulkan_box_shadow_pipeline_init (GskVulkanBoxShadowPipeline *self) } GskVulkanPipeline * -gsk_vulkan_box_shadow_pipeline_new (GskVulkanPipelineLayout *layout, - const char *shader_name, - VkRenderPass render_pass) +gsk_vulkan_box_shadow_pipeline_new (GdkVulkanContext *context, + VkPipelineLayout layout, + const char *shader_name, + VkRenderPass render_pass) { - return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_BOX_SHADOW_PIPELINE, layout, shader_name, render_pass); + return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_BOX_SHADOW_PIPELINE, context, layout, shader_name, render_pass); } gsize diff --git a/gsk/gskvulkanboxshadowpipelineprivate.h b/gsk/gskvulkanboxshadowpipelineprivate.h index 930480de15..975338bcf1 100644 --- a/gsk/gskvulkanboxshadowpipelineprivate.h +++ b/gsk/gskvulkanboxshadowpipelineprivate.h @@ -14,7 +14,8 @@ typedef struct _GskVulkanBoxShadowPipelineLayout GskVulkanBoxShadowPipelineLayou G_DECLARE_FINAL_TYPE (GskVulkanBoxShadowPipeline, gsk_vulkan_box_shadow_pipeline, GSK, VULKAN_BOX_SHADOW_PIPELINE, GskVulkanPipeline) -GskVulkanPipeline * gsk_vulkan_box_shadow_pipeline_new (GskVulkanPipelineLayout * layout, +GskVulkanPipeline * gsk_vulkan_box_shadow_pipeline_new (GdkVulkanContext *context, + VkPipelineLayout layout, const char *shader_name, VkRenderPass render_pass); diff --git a/gsk/gskvulkancolorpipeline.c b/gsk/gskvulkancolorpipeline.c index 29e44ce7ba..cd6867a1a4 100644 --- a/gsk/gskvulkancolorpipeline.c +++ b/gsk/gskvulkancolorpipeline.c @@ -76,11 +76,12 @@ gsk_vulkan_color_pipeline_init (GskVulkanColorPipeline *self) } GskVulkanPipeline * -gsk_vulkan_color_pipeline_new (GskVulkanPipelineLayout *layout, +gsk_vulkan_color_pipeline_new (GdkVulkanContext *context, + VkPipelineLayout layout, const char *shader_name, VkRenderPass render_pass) { - return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_COLOR_PIPELINE, layout, shader_name, render_pass); + return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_COLOR_PIPELINE, context, layout, shader_name, render_pass); } gsize diff --git a/gsk/gskvulkancolorpipelineprivate.h b/gsk/gskvulkancolorpipelineprivate.h index 07e63827c8..b9ae514d29 100644 --- a/gsk/gskvulkancolorpipelineprivate.h +++ b/gsk/gskvulkancolorpipelineprivate.h @@ -13,7 +13,8 @@ typedef struct _GskVulkanColorPipelineLayout GskVulkanColorPipelineLayout; G_DECLARE_FINAL_TYPE (GskVulkanColorPipeline, gsk_vulkan_color_pipeline, GSK, VULKAN_COLOR_PIPELINE, GskVulkanPipeline) -GskVulkanPipeline * gsk_vulkan_color_pipeline_new (GskVulkanPipelineLayout * layout, +GskVulkanPipeline * gsk_vulkan_color_pipeline_new (GdkVulkanContext *context, + VkPipelineLayout layout, const char *shader_name, VkRenderPass render_pass); diff --git a/gsk/gskvulkancolortextpipeline.c b/gsk/gskvulkancolortextpipeline.c index 42b4e8c639..a35e7342c7 100644 --- a/gsk/gskvulkancolortextpipeline.c +++ b/gsk/gskvulkancolortextpipeline.c @@ -76,11 +76,12 @@ gsk_vulkan_color_text_pipeline_init (GskVulkanColorTextPipeline *self) } GskVulkanPipeline * -gsk_vulkan_color_text_pipeline_new (GskVulkanPipelineLayout *layout, +gsk_vulkan_color_text_pipeline_new (GdkVulkanContext *context, + VkPipelineLayout layout, const char *shader_name, VkRenderPass render_pass) { - return gsk_vulkan_pipeline_new_full (GSK_TYPE_VULKAN_COLOR_TEXT_PIPELINE, layout, shader_name, render_pass, + return gsk_vulkan_pipeline_new_full (GSK_TYPE_VULKAN_COLOR_TEXT_PIPELINE, context, layout, shader_name, render_pass, VK_BLEND_FACTOR_SRC_ALPHA, VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA); } diff --git a/gsk/gskvulkancolortextpipelineprivate.h b/gsk/gskvulkancolortextpipelineprivate.h index 8c4a8c35c4..bf116c31f9 100644 --- a/gsk/gskvulkancolortextpipelineprivate.h +++ b/gsk/gskvulkancolortextpipelineprivate.h @@ -14,7 +14,8 @@ typedef struct _GskVulkanColorTextPipelineLayout GskVulkanColorTextPipelineLayou G_DECLARE_FINAL_TYPE (GskVulkanColorTextPipeline, gsk_vulkan_color_text_pipeline, GSK, VULKAN_COLOR_TEXT_PIPELINE, GskVulkanPipeline) -GskVulkanPipeline * gsk_vulkan_color_text_pipeline_new (GskVulkanPipelineLayout *layout, +GskVulkanPipeline * gsk_vulkan_color_text_pipeline_new (GdkVulkanContext *context, + VkPipelineLayout layout, const char *shader_name, VkRenderPass render_pass); diff --git a/gsk/gskvulkaneffectpipeline.c b/gsk/gskvulkaneffectpipeline.c index 8572da56dc..1db9ec6350 100644 --- a/gsk/gskvulkaneffectpipeline.c +++ b/gsk/gskvulkaneffectpipeline.c @@ -108,11 +108,12 @@ gsk_vulkan_effect_pipeline_init (GskVulkanEffectPipeline *self) } GskVulkanPipeline * -gsk_vulkan_effect_pipeline_new (GskVulkanPipelineLayout *layout, +gsk_vulkan_effect_pipeline_new (GdkVulkanContext *context, + VkPipelineLayout layout, const char *shader_name, VkRenderPass render_pass) { - return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_EFFECT_PIPELINE, layout, shader_name, render_pass); + return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_EFFECT_PIPELINE, context, layout, shader_name, render_pass); } gsize diff --git a/gsk/gskvulkaneffectpipelineprivate.h b/gsk/gskvulkaneffectpipelineprivate.h index d2bff8105c..8e3b976bdb 100644 --- a/gsk/gskvulkaneffectpipelineprivate.h +++ b/gsk/gskvulkaneffectpipelineprivate.h @@ -13,7 +13,8 @@ typedef struct _GskVulkanEffectPipelineLayout GskVulkanEffectPipelineLayout; G_DECLARE_FINAL_TYPE (GskVulkanEffectPipeline, gsk_vulkan_effect_pipeline, GSK, VULKAN_EFFECT_PIPELINE, GskVulkanPipeline) -GskVulkanPipeline * gsk_vulkan_effect_pipeline_new (GskVulkanPipelineLayout *layout, +GskVulkanPipeline * gsk_vulkan_effect_pipeline_new (GdkVulkanContext *context, + VkPipelineLayout layout, const char *shader_name, VkRenderPass render_pass); diff --git a/gsk/gskvulkanlineargradientpipeline.c b/gsk/gskvulkanlineargradientpipeline.c index cc699495fa..058a2f8416 100644 --- a/gsk/gskvulkanlineargradientpipeline.c +++ b/gsk/gskvulkanlineargradientpipeline.c @@ -159,11 +159,12 @@ gsk_vulkan_linear_gradient_pipeline_init (GskVulkanLinearGradientPipeline *self) } GskVulkanPipeline * -gsk_vulkan_linear_gradient_pipeline_new (GskVulkanPipelineLayout *layout, +gsk_vulkan_linear_gradient_pipeline_new (GdkVulkanContext *context, + VkPipelineLayout layout, const char *shader_name, VkRenderPass render_pass) { - return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_LINEAR_GRADIENT_PIPELINE, layout, shader_name, render_pass); + return gsk_vulkan_pipeline_new (GSK_TYPE_VULKAN_LINEAR_GRADIENT_PIPELINE, context, layout, shader_name, render_pass); } gsize diff --git a/gsk/gskvulkanlineargradientpipelineprivate.h b/gsk/gskvulkanlineargradientpipelineprivate.h index 50b986e3d5..71b6559dc2 100644 --- a/gsk/gskvulkanlineargradientpipelineprivate.h +++ b/gsk/gskvulkanlineargradientpipelineprivate.h @@ -16,7 +16,8 @@ typedef struct _GskVulkanLinearGradientPipelineLayout GskVulkanLinearGradientPip G_DECLARE_FINAL_TYPE (GskVulkanLinearGradientPipeline, gsk_vulkan_linear_gradient_pipeline, GSK, VULKAN_LINEAR_GRADIENT_PIPELINE, GskVulkanPipeline) -GskVulkanPipeline * gsk_vulkan_linear_gradient_pipeline_new (GskVulkanPipelineLayout * layout, +GskVulkanPipeline * gsk_vulkan_linear_gradient_pipeline_new (GdkVulkanContext *context, + VkPipelineLayout layout, const char *shader_name, VkRenderPass render_pass); diff --git a/gsk/gskvulkanpipeline.c b/gsk/gskvulkanpipeline.c index 6a834c5d9e..38d5a5795f 100644 --- a/gsk/gskvulkanpipeline.c +++ b/gsk/gskvulkanpipeline.c @@ -9,21 +9,14 @@ typedef struct _GskVulkanPipelinePrivate GskVulkanPipelinePrivate; -struct _GskVulkanPipelineLayout -{ - volatile gint ref_count; - GdkVulkanContext *vulkan; - - VkPipelineLayout pipeline_layout; -}; - struct _GskVulkanPipelinePrivate { GObject parent_instance; - GskVulkanPipelineLayout *layout; + GdkVulkanContext *context; VkPipeline pipeline; + VkPipelineLayout layout; GskVulkanShader *vertex_shader; GskVulkanShader *fragment_shader; @@ -35,18 +28,17 @@ static void gsk_vulkan_pipeline_finalize (GObject *gobject) { GskVulkanPipelinePrivate *priv = gsk_vulkan_pipeline_get_instance_private (GSK_VULKAN_PIPELINE (gobject)); + VkDevice device; - VkDevice device = gdk_vulkan_context_get_device (priv->layout->vulkan); + device = gdk_vulkan_context_get_device (priv->context); vkDestroyPipeline (device, priv->pipeline, NULL); - + g_clear_pointer (&priv->fragment_shader, gsk_vulkan_shader_free); g_clear_pointer (&priv->vertex_shader, gsk_vulkan_shader_free); - g_clear_pointer (&priv->layout, gsk_vulkan_pipeline_layout_unref); - G_OBJECT_CLASS (gsk_vulkan_pipeline_parent_class)->finalize (gobject); } @@ -63,18 +55,20 @@ gsk_vulkan_pipeline_init (GskVulkanPipeline *self) GskVulkanPipeline * gsk_vulkan_pipeline_new (GType pipeline_type, - GskVulkanPipelineLayout *layout, + GdkVulkanContext *context, + VkPipelineLayout layout, const char *shader_name, VkRenderPass render_pass) { - return gsk_vulkan_pipeline_new_full (pipeline_type, layout, shader_name, render_pass, + return gsk_vulkan_pipeline_new_full (pipeline_type, context, layout, shader_name, render_pass, VK_BLEND_FACTOR_ONE, VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA); } GskVulkanPipeline * gsk_vulkan_pipeline_new_full (GType pipeline_type, - GskVulkanPipelineLayout *layout, + GdkVulkanContext *context, + VkPipelineLayout layout, const char *shader_name, VkRenderPass render_pass, VkBlendFactor srcBlendFactor, @@ -82,11 +76,10 @@ gsk_vulkan_pipeline_new_full (GType pipeline_type, { GskVulkanPipelinePrivate *priv; GskVulkanPipeline *self; - VkDevice device; g_return_val_if_fail (g_type_is_a (pipeline_type, GSK_TYPE_VULKAN_PIPELINE), NULL); - g_return_val_if_fail (layout != NULL, NULL); + g_return_val_if_fail (layout != VK_NULL_HANDLE, NULL); g_return_val_if_fail (shader_name != NULL, NULL); g_return_val_if_fail (render_pass != VK_NULL_HANDLE, NULL); @@ -94,12 +87,13 @@ gsk_vulkan_pipeline_new_full (GType pipeline_type, priv = gsk_vulkan_pipeline_get_instance_private (self); - priv->layout = gsk_vulkan_pipeline_layout_ref (layout); + device = gdk_vulkan_context_get_device (context); - device = gdk_vulkan_context_get_device (layout->vulkan); + priv->context = context; + priv->layout = layout; - priv->vertex_shader = gsk_vulkan_shader_new_from_resource (layout->vulkan, GSK_VULKAN_SHADER_VERTEX, shader_name, NULL); - priv->fragment_shader = gsk_vulkan_shader_new_from_resource (layout->vulkan, GSK_VULKAN_SHADER_FRAGMENT, shader_name, NULL); + priv->vertex_shader = gsk_vulkan_shader_new_from_resource (context, GSK_VULKAN_SHADER_VERTEX, shader_name, NULL); + priv->fragment_shader = gsk_vulkan_shader_new_from_resource (context, GSK_VULKAN_SHADER_FRAGMENT, shader_name, NULL); GSK_VK_CHECK (vkCreateGraphicsPipelines, device, VK_NULL_HANDLE, @@ -166,7 +160,7 @@ gsk_vulkan_pipeline_new_full (GType pipeline_type, VK_DYNAMIC_STATE_SCISSOR }, }, - .layout = gsk_vulkan_pipeline_layout_get_pipeline_layout (priv->layout), + .layout = priv->layout, .renderPass = render_pass, .subpass = 0, .basePipelineHandle = VK_NULL_HANDLE, @@ -191,69 +185,5 @@ gsk_vulkan_pipeline_get_pipeline_layout (GskVulkanPipeline *self) { GskVulkanPipelinePrivate *priv = gsk_vulkan_pipeline_get_instance_private (self); - return priv->layout->pipeline_layout; -} - -/*** GskVulkanPipelineLayout ***/ - -GskVulkanPipelineLayout * -gsk_vulkan_pipeline_layout_new (GdkVulkanContext *context, - guint layout_count, - VkDescriptorSetLayout *descriptor_set_layout) -{ - GskVulkanPipelineLayout *self; - VkDevice device; - - self = g_slice_new0 (GskVulkanPipelineLayout); - self->ref_count = 1; - self->vulkan = g_object_ref (context); - - device = gdk_vulkan_context_get_device (context); - - GSK_VK_CHECK (vkCreatePipelineLayout, device, - &(VkPipelineLayoutCreateInfo) { - .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, - .setLayoutCount = layout_count, - .pSetLayouts = descriptor_set_layout, - .pushConstantRangeCount = gst_vulkan_push_constants_get_range_count (), - .pPushConstantRanges = gst_vulkan_push_constants_get_ranges () - }, - NULL, - &self->pipeline_layout); - - return self; -} - -GskVulkanPipelineLayout * -gsk_vulkan_pipeline_layout_ref (GskVulkanPipelineLayout *self) -{ - self->ref_count++; - - return self; -} - -void -gsk_vulkan_pipeline_layout_unref (GskVulkanPipelineLayout *self) -{ - VkDevice device; - - self->ref_count--; - - if (self->ref_count > 0) - return; - - device = gdk_vulkan_context_get_device (self->vulkan); - - vkDestroyPipelineLayout (device, - self->pipeline_layout, - NULL); - - g_slice_free (GskVulkanPipelineLayout, self); -} - - -VkPipelineLayout -gsk_vulkan_pipeline_layout_get_pipeline_layout (GskVulkanPipelineLayout *self) -{ - return self->pipeline_layout; + return priv->layout; } diff --git a/gsk/gskvulkanpipelineprivate.h b/gsk/gskvulkanpipelineprivate.h index 648f04ddf1..33660e1ecc 100644 --- a/gsk/gskvulkanpipelineprivate.h +++ b/gsk/gskvulkanpipelineprivate.h @@ -7,8 +7,6 @@ G_BEGIN_DECLS -typedef struct _GskVulkanPipelineLayout GskVulkanPipelineLayout; - #define GSK_TYPE_VULKAN_PIPELINE (gsk_vulkan_pipeline_get_type ()) G_DECLARE_DERIVABLE_TYPE (GskVulkanPipeline, gsk_vulkan_pipeline, GSK, VULKAN_PIPELINE, GObject) @@ -34,21 +32,15 @@ gsk_vulkan_handle_result (VkResult res, #define GSK_VK_CHECK(func, ...) gsk_vulkan_handle_result (func (__VA_ARGS__), G_STRINGIFY (func)) -GskVulkanPipelineLayout * gsk_vulkan_pipeline_layout_new (GdkVulkanContext *context, - guint layout_count, - VkDescriptorSetLayout *descriptor_set_layout); -GskVulkanPipelineLayout * gsk_vulkan_pipeline_layout_ref (GskVulkanPipelineLayout *self); -void gsk_vulkan_pipeline_layout_unref (GskVulkanPipelineLayout *self); - -VkPipelineLayout gsk_vulkan_pipeline_layout_get_pipeline_layout - (GskVulkanPipelineLayout *self); GskVulkanPipeline * gsk_vulkan_pipeline_new (GType pipeline_type, - GskVulkanPipelineLayout *layout, + GdkVulkanContext *context, + VkPipelineLayout layout, const char *shader_name, VkRenderPass render_pass); GskVulkanPipeline * gsk_vulkan_pipeline_new_full (GType pipeline_type, - GskVulkanPipelineLayout *layout, + GdkVulkanContext *context, + VkPipelineLayout layout, const char *shader_name, VkRenderPass render_pass, VkBlendFactor srcBlendFactor, diff --git a/gsk/gskvulkanrender.c b/gsk/gskvulkanrender.c index 5a811cf142..e21bef67f2 100644 --- a/gsk/gskvulkanrender.c +++ b/gsk/gskvulkanrender.c @@ -19,6 +19,7 @@ #include "gskvulkaneffectpipelineprivate.h" #include "gskvulkanlineargradientpipelineprivate.h" #include "gskvulkantextpipelineprivate.h" +#include "gskvulkanpushconstantsprivate.h" #define ORTHO_NEAR_PLANE -10000 #define ORTHO_FAR_PLANE 10000 @@ -41,7 +42,7 @@ struct _GskVulkanRender VkFence fence; VkRenderPass render_pass; VkDescriptorSetLayout descriptor_set_layout; - GskVulkanPipelineLayout *layout[3]; /* indexed by number of textures */ + VkPipelineLayout pipeline_layout[3]; /* indexed by number of textures */ GskVulkanUploader *uploader; GskVulkanBuffer *vertex_buffer; @@ -201,7 +202,17 @@ gsk_vulkan_render_new (GskRenderer *renderer, self->descriptor_set_layout, self->descriptor_set_layout }; - self->layout[i] = gsk_vulkan_pipeline_layout_new (self->vulkan, i, layouts); + + GSK_VK_CHECK (vkCreatePipelineLayout, device, + &(VkPipelineLayoutCreateInfo) { + .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, + .setLayoutCount = i, + .pSetLayouts = layouts, + .pushConstantRangeCount = gst_vulkan_push_constants_get_range_count (), + .pPushConstantRanges = gst_vulkan_push_constants_get_ranges () + }, + NULL, + &self->pipeline_layout[i]); } self->uploader = gsk_vulkan_uploader_new (self->vulkan, self->command_pool); @@ -345,7 +356,7 @@ gsk_vulkan_render_get_pipeline (GskVulkanRender *self, static const struct { const char *name; guint num_textures; - GskVulkanPipeline * (* create_func) (GskVulkanPipelineLayout *layout, const char *name, VkRenderPass render_pass); + GskVulkanPipeline * (* create_func) (GdkVulkanContext *context, VkPipelineLayout layout, const char *name, VkRenderPass render_pass); } pipeline_info[GSK_VULKAN_N_PIPELINES] = { { "blend", 1, gsk_vulkan_blend_pipeline_new }, { "blend-clip", 1, gsk_vulkan_blend_pipeline_new }, @@ -382,11 +393,10 @@ gsk_vulkan_render_get_pipeline (GskVulkanRender *self, g_return_val_if_fail (type < GSK_VULKAN_N_PIPELINES, NULL); if (self->pipelines[type] == NULL) - { - self->pipelines[type] = pipeline_info[type].create_func (self->layout[pipeline_info[type].num_textures], - pipeline_info[type].name, - self->render_pass); - } + self->pipelines[type] = pipeline_info[type].create_func (self->vulkan, + self->pipeline_layout[pipeline_info[type].num_textures], + pipeline_info[type].name, + self->render_pass); return self->pipelines[type]; } @@ -570,7 +580,7 @@ gsk_vulkan_render_draw (GskVulkanRender *self, for (l = self->render_passes; l; l = l->next) { - gsk_vulkan_render_pass_draw (l->data, self, self->vertex_buffer, 3, self->layout, command_buffer); + gsk_vulkan_render_pass_draw (l->data, self, self->vertex_buffer, 3, self->pipeline_layout, command_buffer); } vkCmdEndRenderPass (command_buffer); @@ -664,7 +674,9 @@ gsk_vulkan_render_free (GskVulkanRender *self) g_clear_pointer (&self->uploader, gsk_vulkan_uploader_free); for (i = 0; i < 3; i++) - g_clear_pointer (&self->layout[i], gsk_vulkan_pipeline_layout_unref); + vkDestroyPipelineLayout (device, + self->pipeline_layout[i], + NULL); vkDestroyRenderPass (device, self->render_pass, diff --git a/gsk/gskvulkanrenderpass.c b/gsk/gskvulkanrenderpass.c index 245c753cae..9fe3764323 100644 --- a/gsk/gskvulkanrenderpass.c +++ b/gsk/gskvulkanrenderpass.c @@ -1035,7 +1035,7 @@ gsk_vulkan_render_pass_draw (GskVulkanRenderPass *self, GskVulkanRender *render, GskVulkanBuffer *vertex_buffer, guint layout_count, - GskVulkanPipelineLayout **layout, + VkPipelineLayout *pipeline_layout, VkCommandBuffer command_buffer) { GskVulkanPipeline *current_pipeline = NULL; @@ -1316,8 +1316,8 @@ gsk_vulkan_render_pass_draw (GskVulkanRenderPass *self, case GSK_VULKAN_OP_PUSH_VERTEX_CONSTANTS: for (int i = 0; i < layout_count; i++) gsk_vulkan_push_constants_push (&op->constants.constants, - command_buffer, - gsk_vulkan_pipeline_layout_get_pipeline_layout (layout[i])); + command_buffer, + pipeline_layout[i]); break; default: diff --git a/gsk/gskvulkanrenderpassprivate.h b/gsk/gskvulkanrenderpassprivate.h index d38189966c..56bc9ad587 100644 --- a/gsk/gskvulkanrenderpassprivate.h +++ b/gsk/gskvulkanrenderpassprivate.h @@ -37,7 +37,7 @@ void gsk_vulkan_render_pass_draw (GskVulk GskVulkanRender *render, GskVulkanBuffer *vertex_buffer, guint layout_count, - GskVulkanPipelineLayout **layout, + VkPipelineLayout *pipeline_layout, VkCommandBuffer command_buffer); G_END_DECLS diff --git a/gsk/gskvulkantextpipeline.c b/gsk/gskvulkantextpipeline.c index e3295c4f72..2539ad3b87 100644 --- a/gsk/gskvulkantextpipeline.c +++ b/gsk/gskvulkantextpipeline.c @@ -83,11 +83,12 @@ gsk_vulkan_text_pipeline_init (GskVulkanTextPipeline *self) } GskVulkanPipeline * -gsk_vulkan_text_pipeline_new (GskVulkanPipelineLayout *layout, - const char *shader_name, - VkRenderPass render_pass) +gsk_vulkan_text_pipeline_new (GdkVulkanContext *context, + VkPipelineLayout layout, + const char *shader_name, + VkRenderPass render_pass) { - return gsk_vulkan_pipeline_new_full (GSK_TYPE_VULKAN_TEXT_PIPELINE, layout, shader_name, render_pass, + return gsk_vulkan_pipeline_new_full (GSK_TYPE_VULKAN_TEXT_PIPELINE, context, layout, shader_name, render_pass, VK_BLEND_FACTOR_SRC_ALPHA, VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA); } diff --git a/gsk/gskvulkantextpipelineprivate.h b/gsk/gskvulkantextpipelineprivate.h index 09a58c0468..7701fbb4bb 100644 --- a/gsk/gskvulkantextpipelineprivate.h +++ b/gsk/gskvulkantextpipelineprivate.h @@ -14,9 +14,10 @@ typedef struct _GskVulkanTextPipelineLayout GskVulkanTextPipelineLayout; G_DECLARE_FINAL_TYPE (GskVulkanTextPipeline, gsk_vulkan_text_pipeline, GSK, VULKAN_TEXT_PIPELINE, GskVulkanPipeline) -GskVulkanPipeline * gsk_vulkan_text_pipeline_new (GskVulkanPipelineLayout * layout, - const char *shader_name, - VkRenderPass render_pass); +GskVulkanPipeline * gsk_vulkan_text_pipeline_new (GdkVulkanContext *context, + VkPipelineLayout layout, + const char *shader_name, + VkRenderPass render_pass); gsize gsk_vulkan_text_pipeline_count_vertex_data (GskVulkanTextPipeline *pipeline, int num_instances);