Files
Martin Slachta a04f0dc262 initial
2026-07-18 14:31:15 +02:00

67 lines
1.8 KiB
C++

#pragma once
#include <volk.h>
#include <vector>
#include <optional>
#include "RenderContext.hpp"
#include "Shader.hpp"
#include "Gpu.hpp"
/**
* Abstracts a Vulkan pipeline
*/
class Pipeline {
VkPipeline m_pipeline;
VkPipelineLayout m_layout;
public:
/**
* Wraps new pipeline with layout
* @param layout pipeline layout
* @param pipeline pipeline
*/
Pipeline(VkPipelineLayout layout, VkPipeline pipeline) :
m_layout(layout), m_pipeline(pipeline) {
}
VkPipeline pipeline() const {
return m_pipeline;
}
VkPipelineLayout pipeline_layout() const {
return m_layout;
}
Pipeline& use(RenderContext *pRenderContext) {
vkCmdBindPipeline(pRenderContext->command_buffer(),
VK_PIPELINE_BIND_POINT_GRAPHICS,
m_pipeline);
return *this;
}
Pipeline& bind_input_set(RenderContext *pRenderContext, uint32_t idx, uint32_t num, VkDescriptorSet *pSets) {
vkCmdBindDescriptorSets(pRenderContext->command_buffer(),
VK_PIPELINE_BIND_POINT_GRAPHICS,
m_layout,
idx, num, pSets,
0, nullptr);
return *this;
}
inline void set_debug_name(const Gpu* gpu, const std::string name) const {
#if LOFT_DEBUG
VkDebugUtilsObjectNameInfoEXT nameInfo = {
.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT,
.objectType = VK_OBJECT_TYPE_PIPELINE,
.objectHandle = (uint64_t)pipeline(),
.pObjectName = name.c_str(),
};
vkSetDebugUtilsObjectNameEXT(gpu->dev(), &nameInfo);
#endif
}
};