[gtk+/wip/otte/rendernode: 91/100] vulkan: Make GskVulkanPipeline derivable



commit e87e4222396c02a677dc250e04a728c751cb39b0
Author: Benjamin Otte <otte redhat com>
Date:   Sun Dec 18 00:33:53 2016 +0100

    vulkan: Make GskVulkanPipeline derivable

 gsk/gskvulkanpipeline.c        |   41 ++++++++++++++++++++++++---------------
 gsk/gskvulkanpipelineprivate.h |    7 +++++-
 2 files changed, 31 insertions(+), 17 deletions(-)
---
diff --git a/gsk/gskvulkanpipeline.c b/gsk/gskvulkanpipeline.c
index 2888c62..9d9d098 100644
--- a/gsk/gskvulkanpipeline.c
+++ b/gsk/gskvulkanpipeline.c
@@ -7,6 +7,8 @@
 
 #include <graphene.h>
 
+typedef struct _GskVulkanPipelinePrivate GskVulkanPipelinePrivate;
+
 struct _GskVulkanPipelineLayout
 {
   volatile gint ref_count;
@@ -16,7 +18,7 @@ struct _GskVulkanPipelineLayout
   VkDescriptorSetLayout descriptor_set_layout;
 };
 
-struct _GskVulkanPipeline
+struct _GskVulkanPipelinePrivate
 {
   GObject parent_instance;
 
@@ -28,22 +30,23 @@ struct _GskVulkanPipeline
   GskVulkanShader *fragment_shader;
 };
 
-G_DEFINE_TYPE (GskVulkanPipeline, gsk_vulkan_pipeline, G_TYPE_OBJECT)
+G_DEFINE_TYPE_WITH_PRIVATE (GskVulkanPipeline, gsk_vulkan_pipeline, G_TYPE_OBJECT)
 
 static void
 gsk_vulkan_pipeline_finalize (GObject *gobject)
 {
-  GskVulkanPipeline *self = GSK_VULKAN_PIPELINE (gobject);
-  VkDevice device = gdk_vulkan_context_get_device (self->layout->vulkan);
+  GskVulkanPipelinePrivate *priv = gsk_vulkan_pipeline_get_instance_private (GSK_VULKAN_PIPELINE (gobject));
+
+  VkDevice device = gdk_vulkan_context_get_device (priv->layout->vulkan);
 
   vkDestroyPipeline (device,
-                     self->pipeline,
+                     priv->pipeline,
                      NULL);
   
-  g_clear_pointer (&self->fragment_shader, gsk_vulkan_shader_free);
-  g_clear_pointer (&self->vertex_shader, gsk_vulkan_shader_free);
+  g_clear_pointer (&priv->fragment_shader, gsk_vulkan_shader_free);
+  g_clear_pointer (&priv->vertex_shader, gsk_vulkan_shader_free);
 
-  g_clear_pointer (&self->layout, gsk_vulkan_pipeline_layout_unref);
+  g_clear_pointer (&priv->layout, gsk_vulkan_pipeline_layout_unref);
 
   G_OBJECT_CLASS (gsk_vulkan_pipeline_parent_class)->finalize (gobject);
 }
@@ -64,7 +67,9 @@ gsk_vulkan_pipeline_new (GskVulkanPipelineLayout *layout,
                          const char              *shader_name,
                          VkRenderPass             render_pass)
 {
+  GskVulkanPipelinePrivate *priv;
   GskVulkanPipeline *self;
+  
   VkDevice device;
 
   g_return_val_if_fail (layout != NULL, NULL);
@@ -73,12 +78,14 @@ gsk_vulkan_pipeline_new (GskVulkanPipelineLayout *layout,
 
   self = g_object_new (GSK_TYPE_VULKAN_PIPELINE, NULL);
 
-  self->layout = gsk_vulkan_pipeline_layout_ref (layout);
+  priv = gsk_vulkan_pipeline_get_instance_private (self);
+
+  priv->layout = gsk_vulkan_pipeline_layout_ref (layout);
 
   device = gdk_vulkan_context_get_device (layout->vulkan);
 
-  self->vertex_shader = gsk_vulkan_shader_new_from_resource (layout->vulkan, GSK_VULKAN_SHADER_VERTEX, 
shader_name, NULL);
-  self->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 (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);
 
   GSK_VK_CHECK (vkCreateGraphicsPipelines, device,
                                            VK_NULL_HANDLE,
@@ -87,8 +94,8 @@ gsk_vulkan_pipeline_new (GskVulkanPipelineLayout *layout,
                                                .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
                                                .stageCount = 2,
                                                .pStages = (VkPipelineShaderStageCreateInfo[2]) {
-                                                   GST_VULKAN_SHADER_STAGE_CREATE_INFO (self->vertex_shader),
-                                                   GST_VULKAN_SHADER_STAGE_CREATE_INFO 
(self->fragment_shader)
+                                                   GST_VULKAN_SHADER_STAGE_CREATE_INFO (priv->vertex_shader),
+                                                   GST_VULKAN_SHADER_STAGE_CREATE_INFO 
(priv->fragment_shader)
                                                },
                                                .pVertexInputState = &(VkPipelineVertexInputStateCreateInfo) {
                                                    .sType = 
VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,
@@ -170,14 +177,14 @@ gsk_vulkan_pipeline_new (GskVulkanPipelineLayout *layout,
                                                        VK_DYNAMIC_STATE_SCISSOR
                                                    },
                                                },
-                                               .layout = gsk_vulkan_pipeline_layout_get_pipeline_layout 
(self->layout),
+                                               .layout = gsk_vulkan_pipeline_layout_get_pipeline_layout 
(priv->layout),
                                                .renderPass = render_pass,
                                                .subpass = 0,
                                                .basePipelineHandle = VK_NULL_HANDLE,
                                                .basePipelineIndex = -1,
                                            },
                                            NULL,
-                                           &self->pipeline);
+                                           &priv->pipeline);
 
   return self;
 }
@@ -185,7 +192,9 @@ gsk_vulkan_pipeline_new (GskVulkanPipelineLayout *layout,
 VkPipeline
 gsk_vulkan_pipeline_get_pipeline (GskVulkanPipeline *self)
 {
-  return self->pipeline;
+  GskVulkanPipelinePrivate *priv = gsk_vulkan_pipeline_get_instance_private (self);
+
+  return priv->pipeline;
 }
 
 /*** GskVulkanPipelineLayout ***/
diff --git a/gsk/gskvulkanpipelineprivate.h b/gsk/gskvulkanpipelineprivate.h
index 75a57db..8c1548d 100644
--- a/gsk/gskvulkanpipelineprivate.h
+++ b/gsk/gskvulkanpipelineprivate.h
@@ -11,7 +11,12 @@ typedef struct _GskVulkanPipelineLayout GskVulkanPipelineLayout;
 
 #define GSK_TYPE_VULKAN_PIPELINE (gsk_vulkan_pipeline_get_type ())
 
-G_DECLARE_FINAL_TYPE (GskVulkanPipeline, gsk_vulkan_pipeline, GSK, VULKAN_PIPELINE, GObject)
+G_DECLARE_DERIVABLE_TYPE (GskVulkanPipeline, gsk_vulkan_pipeline, GSK, VULKAN_PIPELINE, GObject)
+
+struct _GskVulkanPipelineClass
+{
+  GObjectClass parent_class;
+};
 
 static inline VkResult
 gsk_vulkan_handle_result (VkResult    res,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]