planet::vk::engine::pipeline::lines::lines(parameters p)
: pipeline{planet::vk::engine::create_graphics_pipeline(
{.app = p.renderer.app,
.renderer = p.renderer,
.vertex_shader = p.vertex_shader,
.fragment_shader = p.fragment_shader,
.binding_descriptions =
vertex::binding_description<vertex::coloured>(),
.attribute_descriptions =
vertex::attribute_description<vertex::coloured>(),
.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST,
.blend_mode = p.blend_mode,
.pipeline_layout = std::move(p.layout)})} {}
namespace {
planet::telemetry::counter vertex_count{
"planet_vk_engine_pipeline_lines__render_vertices"};
planet::telemetry::counter index_count{
"planet_vk_engine_pipeline_lines__render_indices"};
}
void planet::vk::engine::pipeline::lines::render(render_parameters rp) {
if (this_frame.empty()) { return; }
vertex_count += this_frame.vertices.size();
index_count += this_frame.indices.size();
auto &vertex_buffer = vertex_buffers[rp.current_frame];
vertex_buffer = {
rp.renderer.per_frame_memory, this_frame.vertices,
VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
| VK_MEMORY_PROPERTY_HOST_COHERENT_BIT};
auto &index_buffer = index_buffers[rp.current_frame];
index_buffer = {
rp.renderer.per_frame_memory, this_frame.indices,
VK_BUFFER_USAGE_INDEX_BUFFER_BIT,
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
| VK_MEMORY_PROPERTY_HOST_COHERENT_BIT};
std::array buffers{vertex_buffer.get()};
std::array offset{VkDeviceSize{}};
vkCmdBindVertexBuffers(
rp.cb.get(), 0, buffers.size(), buffers.data(), offset.data());
vkCmdBindIndexBuffer(
rp.cb.get(), index_buffer.get(), 0, VK_INDEX_TYPE_UINT32);
vkCmdDrawIndexed(
rp.cb.get(), static_cast<uint32_t>(this_frame.indices.size()), 1, 0,
0, 0);
this_frame.clear();
}
void planet::vk::engine::pipeline::lines::draw(data const &d) {