36#ifndef ComputePipeline_h
37#define ComputePipeline_h
58 const std::string& shaderPath,
60 size_t pushConstantSize,
61 size_t numStorageImages = 0,
62 size_t numSampledImages = 0);
66 const std::string& shaderPath,
68 size_t pushConstantSize,
69 size_t numStorageImages = 0,
70 size_t numSampledImages = 0);
94 vk::WriteDescriptorSet(
nullptr, i, 0, vk::DescriptorType::eStorageBuffer, {},
m_bufferInfo[i]);
111 void BindStorageImage(
size_t i, vk::Sampler sampler, vk::ImageView view, vk::ImageLayout layout)
139 void BindSampledImage(
size_t i, vk::Sampler sampler, vk::ImageView view, vk::ImageLayout layout)
150 nullptr, i, 0, vk::DescriptorType::eCombinedImageSampler,
m_sampledImageInfo[numImage]);
176 LogWarning(
"Attempted to bind an empty buffer\n");
189 vk::WriteDescriptorSet(
nullptr, i, 0, vk::DescriptorType::eStorageBuffer, {},
m_bufferInfo[i]);
205 cmdBuf.pipelineBarrier(
206 vk::PipelineStageFlagBits::eComputeShader,
207 vk::PipelineStageFlagBits::eComputeShader,
209 vk::MemoryBarrier(vk::AccessFlagBits::eShaderWrite, vk::AccessFlagBits::eShaderRead),
219 void Bind(vk::raii::CommandBuffer& cmdBuf)
242 void Dispatch(vk::raii::CommandBuffer& cmdBuf, T pushConstants, uint32_t x, uint32_t y=1, uint32_t z=1)
248 cmdBuf.pushConstants<T>(
250 vk::ShaderStageFlagBits::eCompute,
256 cmdBuf.pushDescriptorSetKHR(
257 vk::PipelineBindPoint::eCompute,
265 cmdBuf.bindDescriptorSets(
266 vk::PipelineBindPoint::eCompute,
272 cmdBuf.dispatch(x, y, z);
291 void DispatchNoRebind(vk::raii::CommandBuffer& cmdBuf, T pushConstants, uint32_t x, uint32_t y=1, uint32_t z=1)
295 cmdBuf.pushDescriptorSetKHR(
296 vk::PipelineBindPoint::eCompute,
303 cmdBuf.pushConstants<T>(
305 vk::ShaderStageFlagBits::eCompute,
308 cmdBuf.dispatch(x, y, z);
Declaration of AcceleratorBuffer.
A buffer of memory which may be used by GPU acceleration.
Definition: AcceleratorBuffer.h:158
bool empty() const
Returns true if the container is empty.
Definition: AcceleratorBuffer.h:391
vk::DescriptorBufferInfo GetBufferInfo()
Returns a vk::DescriptorBufferInfo suitable for binding this object to.
Definition: AcceleratorBuffer.h:446
void PrepareForGpuAccess(bool outputOnly=false)
Prepares the buffer to be accessed from the GPU.
Definition: AcceleratorBuffer.h:899
void PrepareForGpuAccessNonblocking(bool outputOnly, vk::raii::CommandBuffer &cmdBuf)
Prepares the buffer to be accessed from the GPU.
Definition: AcceleratorBuffer.h:926
Encapsulates a Vulkan compute pipeline and all necessary resources to use it.
Definition: ComputePipeline.h:55
std::unique_ptr< vk::raii::DescriptorPool > m_descriptorPool
Pool for allocating m_descriptorSet from.
Definition: ComputePipeline.h:342
size_t m_numStorageImages
Number of output image bindings in the shader.
Definition: ComputePipeline.h:321
size_t m_numSampledImages
Number of input image bindings in the shader.
Definition: ComputePipeline.h:324
void BindBuffer(size_t i, AcceleratorBuffer< T > &buf, bool outputOnly=false)
Binds an input or output SSBO to a descriptor slot.
Definition: ComputePipeline.h:83
std::unique_ptr< vk::raii::DescriptorSetLayout > m_descriptorSetLayout
Layout of our descriptor set.
Definition: ComputePipeline.h:339
std::string m_shaderPath
Filesystem path to the compiled SPIR-V shader binary.
Definition: ComputePipeline.h:315
size_t m_pushConstantSize
Size of the push constants, in bytes.
Definition: ComputePipeline.h:327
std::vector< vk::WriteDescriptorSet > m_writeDescriptors
Set of bindings to be written to m_descriptorSet.
Definition: ComputePipeline.h:348
void BindStorageImage(size_t i, vk::Sampler sampler, vk::ImageView view, vk::ImageLayout layout)
Binds a storage (output) image to a descriptor slot.
Definition: ComputePipeline.h:111
std::unique_ptr< vk::raii::PipelineLayout > m_pipelineLayout
Layout of the compute pipeline.
Definition: ComputePipeline.h:336
std::unique_ptr< vk::raii::Pipeline > m_computePipeline
Handle to the Vulkan compute pipeline.
Definition: ComputePipeline.h:333
void BindBufferNonblocking(size_t i, AcceleratorBuffer< T > &buf, vk::raii::CommandBuffer &cmdBuf, bool outputOnly=false)
Binds an input or output SSBO to a descriptor slot.
Definition: ComputePipeline.h:171
void DispatchNoRebind(vk::raii::CommandBuffer &cmdBuf, T pushConstants, uint32_t x, uint32_t y=1, uint32_t z=1)
Similar to Dispatch() but does not bind descriptor sets.
Definition: ComputePipeline.h:291
static void AddComputeMemoryBarrier(vk::raii::CommandBuffer &cmdBuf)
Helper function to insert a shader write-to-read memory barrier in a command buffer.
Definition: ComputePipeline.h:203
std::vector< vk::DescriptorBufferInfo > m_bufferInfo
Details about our SSBOs.
Definition: ComputePipeline.h:351
void BindSampledImage(size_t i, vk::Sampler sampler, vk::ImageView view, vk::ImageLayout layout)
Binds a sampled (input) image to a descriptor slot.
Definition: ComputePipeline.h:139
std::unique_ptr< vk::raii::DescriptorSet > m_descriptorSet
The actual descriptor set storing our inputs and outputs.
Definition: ComputePipeline.h:345
void Dispatch(vk::raii::CommandBuffer &cmdBuf, T pushConstants, uint32_t x, uint32_t y=1, uint32_t z=1)
Adds a vkCmdDispatch operation to a command buffer to execute the compute shader.
Definition: ComputePipeline.h:242
std::unique_ptr< vk::raii::ShaderModule > m_shaderModule
Handle to the shader module object.
Definition: ComputePipeline.h:330
void Bind(vk::raii::CommandBuffer &cmdBuf)
Binds the pipeline to a command buffer.
Definition: ComputePipeline.h:219
ComputePipeline(const std::string &shaderPath, size_t numSSBOs, size_t pushConstantSize, size_t numStorageImages=0, size_t numSampledImages=0)
Construct a new compute pipeline.
Definition: ComputePipeline.cpp:56
std::vector< vk::DescriptorImageInfo > m_sampledImageInfo
Details about our input images.
Definition: ComputePipeline.h:357
void Reinitialize(const std::string &shaderPath, size_t numSSBOs, size_t pushConstantSize, size_t numStorageImages=0, size_t numSampledImages=0)
Wipes the state of this object and recreates it with a new shader binary and configuration.
Definition: ComputePipeline.cpp:86
size_t m_numSSBOs
Number of SSBO bindings in the shader.
Definition: ComputePipeline.h:318
std::vector< vk::DescriptorImageInfo > m_storageImageInfo
Details about our output images.
Definition: ComputePipeline.h:354
void DeferredInit()
Performs deferred initialization of the compute pipeline the first time the object is used.
Definition: ComputePipeline.cpp:128
bool g_hasPushDescriptor
Indicates whether the VK_KHR_push_descriptor extension is available.
Definition: VulkanInit.cpp:207
std::shared_ptr< vk::raii::Device > g_vkComputeDevice
The Vulkan device selected for compute operations (may or may not be same device as rendering)
Definition: VulkanInit.cpp:71
Main library include file.