From 8ad0539cf75b55bcf4ea7b1fa87f6b01f06180eb Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 22 Sep 2017 13:30:26 -0400 Subject: [PATCH] vulkan: Drop GskVulkanPipelineLayout We already move the descriptor set layout out of it, so we can just as well keep the pipeline layouts in the render object as well, and get rid of this extra object. Update all callers. --- gsk/gskvulkanblendpipeline.c | 5 +- gsk/gskvulkanblendpipelineprivate.h | 3 +- gsk/gskvulkanblurpipeline.c | 5 +- gsk/gskvulkanblurpipelineprivate.h | 3 +- gsk/gskvulkanborderpipeline.c | 9 +- gsk/gskvulkanborderpipelineprivate.h | 3 +- gsk/gskvulkanboxshadowpipeline.c | 9 +- gsk/gskvulkanboxshadowpipelineprivate.h | 3 +- gsk/gskvulkancolorpipeline.c | 5 +- gsk/gskvulkancolorpipelineprivate.h | 3 +- gsk/gskvulkancolortextpipeline.c | 5 +- gsk/gskvulkancolortextpipelineprivate.h | 3 +- gsk/gskvulkaneffectpipeline.c | 5 +- gsk/gskvulkaneffectpipelineprivate.h | 3 +- gsk/gskvulkanlineargradientpipeline.c | 5 +- gsk/gskvulkanlineargradientpipelineprivate.h | 3 +- gsk/gskvulkanpipeline.c | 106 ++++--------------- gsk/gskvulkanpipelineprivate.h | 16 +-- gsk/gskvulkanrender.c | 32 ++++-- gsk/gskvulkanrenderpass.c | 6 +- gsk/gskvulkanrenderpassprivate.h | 2 +- gsk/gskvulkantextpipeline.c | 9 +- gsk/gskvulkantextpipelineprivate.h | 7 +- 23 files changed, 101 insertions(+), 149 deletions(-) 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);