125 void cleanup(vk::Device
device);
131 [[nodiscard]] vk::Pipeline get()
const {
return m_pipeline; }
137 [[nodiscard]] vk::PipelineLayout
get_layout()
const {
return m_layout; }
152 void bind(vk::CommandBuffer
cmd)
const;
171 void bind_descriptor_sets(
172 vk::CommandBuffer
cmd,
173 const std::vector<vk::DescriptorSet>& descriptor_sets,
174 uint32_t first_set = 0,
175 const std::vector<uint32_t>& dynamic_offsets = {})
const;
195 vk::CommandBuffer
cmd,
196 vk::ShaderStageFlags stage_flags,
199 const void* data)
const;
219 vk::CommandBuffer
cmd,
220 uint32_t group_count_x,
221 uint32_t group_count_y,
222 uint32_t group_count_z)
const;
239 vk::CommandBuffer
cmd,
240 uint32_t element_count,
241 uint32_t local_size_x)
const;
258 vk::CommandBuffer
cmd,
259 uint32_t width_elements,
260 uint32_t height_elements,
261 uint32_t local_size_x,
262 uint32_t local_size_y)
const;
275 vk::CommandBuffer
cmd,
276 uint32_t width_elements,
277 uint32_t height_elements,
278 uint32_t depth_elements,
279 uint32_t local_size_x,
280 uint32_t local_size_y,
281 uint32_t local_size_z)
const;
296 [[nodiscard]] std::optional<std::array<uint32_t, 3>> get_workgroup_size()
const;
308 bool create_specialized(
310 const ComputePipelineConfig& config,
311 const std::unordered_map<uint32_t, uint32_t>& specialization_data);
322 static std::array<uint32_t, 3> calculate_dispatch_1d(
323 uint32_t element_count,
324 uint32_t workgroup_size);
329 static std::array<uint32_t, 3> calculate_dispatch_2d(
331 uint32_t workgroup_x, uint32_t workgroup_y);
336 static std::array<uint32_t, 3> calculate_dispatch_3d(
338 uint32_t workgroup_x, uint32_t workgroup_y, uint32_t workgroup_z);
346 template <
typename T>
349 static_assert(
sizeof(T) <= 128,
"Push constants typically limited to 128 bytes");
350 cmd.pushConstants(m_layout, vk::ShaderStageFlagBits::eCompute,
351 0,
sizeof(T), &data);
363 void dispatch_indirect(vk::CommandBuffer
cmd,
365 vk::DeviceSize
offset = 0);
382 return m_pipeline !=
nullptr && m_layout !=
nullptr;
393 vk::Pipeline m_pipeline =
nullptr;
394 vk::PipelineLayout m_layout =
nullptr;
408 vk::PipelineLayout create_pipeline_layout(
418 static uint32_t calculate_workgroups(uint32_t element_count, uint32_t workgroup_size);