AronaCore/core/rhi/vulkan/pipeline.cpp
2024-02-19 18:31:59 +08:00

52 lines
2.0 KiB
C++

#include "pipeline.h"
#include "renderer_vk.h"
#include "application/application.h"
void pipeline::create_pipeline_layout() {
const auto renderer = application::get()->get_renderer();
const auto device = renderer->device;
vk::DescriptorSetLayoutCreateInfo descriptor_set_layout_create_info;
descriptor_set_layout_create_info.setBindings(descriptor_set_layout_bindings_);
vk::DescriptorSetLayout descriptor_set_layout = device.createDescriptorSetLayout(descriptor_set_layout_create_info);
vk::PipelineLayoutCreateInfo pipeline_layout_create_info;
pipeline_layout_create_info.setSetLayouts(descriptor_set_layout);
pipeline_layout_ = device.createPipelineLayout(pipeline_layout_create_info);
}
void pipeline::execute_pipeline() const {
#ifdef _DEBUG
if (pipeline_ == vk::Pipeline()) {
throw std::runtime_error("Pipeline not created");
}
#endif
const auto renderer = application::get()->get_renderer();
const auto device = renderer->device;
const auto command_pool = renderer->command_pool;
vk::CommandBufferAllocateInfo command_buffer_allocate_info;
command_buffer_allocate_info.setCommandPool(command_pool);
command_buffer_allocate_info.setLevel(vk::CommandBufferLevel::ePrimary);
command_buffer_allocate_info.setCommandBufferCount(1);
const vk::CommandBuffer command_buffer = device.allocateCommandBuffers(command_buffer_allocate_info)[0];
vk::CommandBufferBeginInfo command_buffer_begin_info;
command_buffer_begin_info.setFlags(vk::CommandBufferUsageFlagBits::eOneTimeSubmit);
command_buffer.begin(command_buffer_begin_info);
bind(command_buffer);
command_buffer.end();
vk::SubmitInfo submit_info;
submit_info.setCommandBufferCount(1);
submit_info.setPCommandBuffers(&command_buffer);
renderer->queue.submit(submit_info, nullptr);
renderer->queue.waitIdle();
device.freeCommandBuffers(command_pool, command_buffer);
device.destroyCommandPool(command_pool);
}