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 }