1 module gfx.vulkan.pipeline;
2 
3 package:
4 
5 import gfx.bindings.vulkan;
6 
7 import gfx.core.rc;
8 import gfx.graal.pipeline;
9 import gfx.vulkan;
10 import gfx.vulkan.device;
11 
12 class VulkanShaderModule : VulkanDevObj!(VkShaderModule, "DestroyShaderModule"), ShaderModule
13 {
14     mixin(atomicRcCode);
15     this(VkShaderModule vkObj, VulkanDevice dev, string entryPoint)
16     {
17         super(vkObj, dev);
18         _entryPoint = entryPoint;
19     }
20 
21     override @property string entryPoint() {
22         return _entryPoint;
23     }
24 
25     private string _entryPoint;
26 }
27 
28 class VulkanPipelineLayout : VulkanDevObj!(VkPipelineLayout, "DestroyPipelineLayout"), PipelineLayout
29 {
30     mixin(atomicRcCode);
31     this(VkPipelineLayout vkObj, VulkanDevice dev)
32     {
33         super(vkObj, dev);
34     }
35 }
36 
37 class VulkanPipeline : VulkanDevObj!(VkPipeline, "DestroyPipeline"), Pipeline
38 {
39     mixin(atomicRcCode);
40     this(VkPipeline vkObj, VulkanDevice dev, PipelineLayout pl)
41     {
42         super(vkObj, dev);
43         this.pl = pl;
44     }
45 
46     override void dispose() {
47         pl.unload();
48         super.dispose();
49     }
50 
51     private Rc!PipelineLayout pl;
52 }
53 
54 class VulkanDescriptorSetLayout : VulkanDevObj!(VkDescriptorSetLayout, "DestroyDescriptorSetLayout"), DescriptorSetLayout
55 {
56     mixin(atomicRcCode);
57     this(VkDescriptorSetLayout vkObj, VulkanDevice dev)
58     {
59         super(vkObj, dev);
60     }
61 }
62 
63 class VulkanDescriptorPool : VulkanDevObj!(VkDescriptorPool, "DestroyDescriptorPool"), DescriptorPool
64 {
65     mixin(atomicRcCode);
66     this(VkDescriptorPool vkObj, VulkanDevice dev)
67     {
68         super(vkObj, dev);
69     }
70 
71     override DescriptorSet[] allocate(DescriptorSetLayout[] layouts)
72     {
73         import std.algorithm : map;
74         import std.array : array;
75 
76         auto vkLayouts = layouts.map!(
77             l => enforce(
78                 cast(VulkanDescriptorSetLayout)l,
79                 "VulkanDescriptorPool.allocate: Did not supply a Vulkan DescriptorSetLayout"
80             ).vkObj
81         ).array;
82 
83         VkDescriptorSetAllocateInfo ai;
84         ai.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
85         ai.descriptorPool = vkObj;
86         ai.descriptorSetCount = cast(uint)vkLayouts.length;
87         ai.pSetLayouts = vkLayouts.ptr;
88 
89         auto vkSets = new VkDescriptorSet[vkLayouts.length];
90         vulkanEnforce(
91             vk.AllocateDescriptorSets(vkDev, &ai, &vkSets[0]),
92             "Could not allocate Vulkan descriptor sets"
93         );
94 
95         auto sets = vkSets.map!(
96             vkS => cast(DescriptorSet)new VulkanDescriptorSet(vkS, this)
97         ).array;
98 
99         _allocatedSets ~= sets;
100 
101         return sets;
102     }
103 
104     override void reset() {
105         vulkanEnforce(
106             vk.ResetDescriptorPool(vkDev, vkObj, 0),
107             "Could not reset Descriptor pool"
108         );
109         _allocatedSets = [];
110     }
111 
112     DescriptorSet[] _allocatedSets;
113 }
114 
115 class VulkanDescriptorSet : VulkanObj!(VkDescriptorSet), DescriptorSet
116 {
117     this (VkDescriptorSet vkObj, VulkanDescriptorPool pool)
118     {
119         super(vkObj);
120         _pool = pool;
121     }
122 
123     @property DescriptorPool pool() {
124         return _pool;
125     }
126 
127     VulkanDescriptorPool _pool;
128 }