1 module sbylib.wrapper.vulkan.pipeline;
2
3 import std;
4 import erupted;
5 import sbylib.wrapper.vulkan.device;
6 import sbylib.wrapper.vulkan.enums;
7 import sbylib.wrapper.vulkan.pipelinelayout;
8 import sbylib.wrapper.vulkan.renderpass;
9 import sbylib.wrapper.vulkan.shadermodule;
10 import sbylib.wrapper.vulkan.util;
11
12 class Pipeline {
13 static struct ShaderStageCreateInfo {
14
15 @vkProp() {
16 immutable VkPipelineShaderStageCreateFlags flags;
17 BitFlags!ShaderStage stage;
18 ShaderModule _module;
19 string pName;
20 const(VkSpecializationInfo)* pSpecializationInfo;
21 }
22
23 mixin VkTo!(VkPipelineShaderStageCreateInfo);
24 }
25
26 static struct VertexInputStateCreateInfo {
27 static struct VertexInputBindingDescription {
28 @vkProp() {
29 uint binding;
30 uint stride;
31 VertexInputRate inputRate;
32 }
33
34 const mixin VkTo!(VkVertexInputBindingDescription);
35 }
36
37 @vkProp() {
38 immutable VkPipelineVertexInputStateCreateFlags flags;
39 }
40
41 @vkProp("pVertexBindingDescriptions", "vertexBindingDescriptionCount") {
42 const VertexInputBindingDescription[] vertexBindingDescriptions;
43 }
44
45 @vkProp("pVertexAttributeDescriptions", "vertexAttributeDescriptionCount") {
46 const VkVertexInputAttributeDescription[] vertexAttributeDescriptions;
47 }
48
49 const mixin VkTo!(VkPipelineVertexInputStateCreateInfo);
50 }
51
52 static struct InputAssemblyStateCreateInfo {
53 @vkProp() {
54 VkPipelineInputAssemblyStateCreateFlags flags;
55 PrimitiveTopology topology;
56 bool primitiveRestartEnable;
57 }
58
59 const mixin VkTo!(VkPipelineInputAssemblyStateCreateInfo);
60 }
61
62 alias TessellationStateCreateInfo = VkPipelineTessellationStateCreateInfo;
63
64 static struct RasterizationStateCreateInfo {
65 @vkProp() {
66 VkPipelineRasterizationStateCreateFlags flags;
67 bool depthClampEnable;
68 bool rasterizerDiscardEnable;
69 PolygonMode polygonMode;
70 CullMode cullMode;
71 FrontFace frontFace;
72 bool depthBiasEnable;
73 float depthBiasConstantFactor;
74 float depthBiasClamp;
75 float depthBiasSlopeFactor;
76 float lineWidth;
77 }
78
79 const mixin VkTo!(VkPipelineRasterizationStateCreateInfo);
80 }
81
82 static struct MultisampleStateCreateInfo {
83 @vkProp() {
84 VkPipelineMultisampleStateCreateFlags flags;
85 SampleCount rasterizationSamples;
86 bool sampleShadingEnable;
87 float minSampleShading;
88 const(VkSampleMask)* pSampleMask;
89 bool alphaToCoverageEnable;
90 bool alphaToOneEnable;
91 }
92
93 const mixin VkTo!(VkPipelineMultisampleStateCreateInfo);
94 }
95
96 alias DepthStencilStateCreateInfo = VkPipelineDepthStencilStateCreateInfo;
97
98 static struct ViewportStateCreateInfo {
99 @vkProp() {
100 immutable VkPipelineViewportStateCreateFlags flags;
101 }
102
103 @vkProp("pViewports", "viewportCount") {
104 const VkViewport[] viewports;
105 }
106
107 @vkProp("pScissors", "scissorCount") {
108 const VkRect2D[] scissors;
109 }
110
111 const mixin VkTo!(VkPipelineViewportStateCreateInfo);
112 }
113
114 static struct ColorBlendStateCreateInfo {
115 static struct AttachmentState {
116 @vkProp() {
117 bool blendEnable;
118 BlendFactor srcColorBlendFactor;
119 BlendFactor dstColorBlendFactor;
120 BlendOp colorBlendOp;
121 BlendFactor srcAlphaBlendFactor;
122 BlendFactor dstAlphaBlendFactor;
123 BlendOp alphaBlendOp;
124 BitFlags!ColorComponent colorWriteMask;
125 }
126
127 const mixin VkTo!(VkPipelineColorBlendAttachmentState);
128 }
129
130 @vkProp() immutable {
131 VkPipelineColorBlendStateCreateFlags flags;
132 bool logicOpEnable;
133 LogicOp logicOp;
134 float[4] blendConstants;
135 }
136
137 @vkProp("pAttachments", "attachmentCount") {
138 const AttachmentState[] attachments;
139 }
140
141 const mixin VkTo!(VkPipelineColorBlendStateCreateInfo);
142 }
143
144 static struct DynamicStateCreateInfo {
145 @vkProp() immutable {
146 VkPipelineDynamicStateCreateFlags flags;
147 }
148
149 @vkProp("pDynamicStates", "dynamicStateCount") {
150 const VkDynamicState[] dynamicStates;
151 }
152
153 const mixin VkTo!(VkPipelineDynamicStateCreateInfo);
154 }
155
156 static struct GraphicsCreateInfo {
157 @vkProp() {
158 immutable VkPipelineCreateFlags flags;
159 PipelineLayout layout;
160 RenderPass renderPass;
161 immutable uint subpass;
162 Pipeline basePipelineHandle;
163 immutable int basePipelineIndex;
164 }
165
166 @vkProp("pStages", "stageCount") {
167 ShaderStageCreateInfo[] stages;
168 }
169
170 @vkProp("pVertexInputState") {
171 const VertexInputStateCreateInfo vertexInputState;
172 }
173
174 @vkProp("pInputAssemblyState") {
175 const InputAssemblyStateCreateInfo inputAssemblyState;
176 }
177
178 @vkProp("pTessellationState") {
179 const VkPipelineTessellationStateCreateInfo tessellationState;
180 }
181
182 @vkProp("pViewportState") {
183 const ViewportStateCreateInfo viewportState;
184 }
185
186 @vkProp("pRasterizationState") {
187 const RasterizationStateCreateInfo rasterizationState;
188 }
189
190 @vkProp("pMultisampleState") {
191 const MultisampleStateCreateInfo multisampleState;
192 }
193
194 @vkProp("pDepthStencilState") {
195 const VkPipelineDepthStencilStateCreateInfo depthStencilState;
196 }
197
198 @vkProp("pColorBlendState") {
199 const ColorBlendStateCreateInfo colorBlendState;
200 }
201
202 @vkProp("pDynamicState") {
203 const DynamicStateCreateInfo dynamicState;
204 }
205
206 mixin VkTo!(VkGraphicsPipelineCreateInfo);
207 }
208
209 static struct ComputeCreateInfo {
210 @vkProp() {
211 VkPipelineCreateFlags flags;
212 ShaderStageCreateInfo stage;
213 PipelineLayout layout;
214 Pipeline basePipelineHandle;
215 int basePipelineIndex;
216 }
217
218 mixin VkTo!(VkComputePipelineCreateInfo);
219 }
220
221 private Device device;
222 package VkPipeline pipeline;
223
224 mixin ImplNameSetter!(device, pipeline, DebugReportObjectType.Pipeline);
225
226 this(Device device, VkPipeline pipeline) {
227 this.device = device;
228 this.pipeline = pipeline;
229 }
230
231 ~this() {
232 vkDestroyPipeline(device.device, pipeline, null);
233 }
234
235 mixin VkTo!(VkPipeline);
236
237 static Pipeline[] create(Device device, GraphicsCreateInfo[] _infos) {
238
239 auto infos = _infos.map!(i => i.vkTo()).array;
240 VkPipeline[] pipelines = new VkPipeline[_infos.length];
241
242 enforceVK(vkCreateGraphicsPipelines(device.device, null /*pipeline cache */ ,
243 cast(uint) infos.length, infos.ptr, null, pipelines.ptr));
244
245 return pipelines.map!(p => new Pipeline(device, p)).array;
246 }
247
248 static Pipeline[] create(Device device, ComputeCreateInfo[] _infos) {
249
250 auto infos = _infos.map!(i => i.vkTo()).array;
251 VkPipeline[] pipelines = new VkPipeline[_infos.length];
252
253 enforceVK(vkCreateComputePipelines(device.device, null /*pipeline cache */ ,
254 cast(uint) infos.length, infos.ptr, null, pipelines.ptr));
255
256 return pipelines.map!(p => new Pipeline(device, p)).array;
257 }
258 }