| 100 | } |
| 101 | |
| 102 | bool vulkan_renderer::create_cmd_buffer() { |
| 103 | const auto& vk_queue = (const vulkan_queue&)cqueue; |
| 104 | #if defined(FLOOR_DEBUG) |
| 105 | const char* cmd_buffer_label = (!cur_pipeline->get_description(multi_view).debug_label.empty() ? |
| 106 | cur_pipeline->get_description(multi_view).debug_label.c_str() : |
| 107 | "vk_renderer_cmd_buffer"); |
| 108 | #else |
| 109 | static constexpr const char* cmd_buffer_label = "vk_renderer_cmd_buffer"; |
| 110 | #endif |
| 111 | render_cmd_buffer = vk_queue.make_command_buffer(cmd_buffer_label); |
| 112 | const VkCommandBufferBeginInfo begin_info{ |
| 113 | .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, |
| 114 | .pNext = nullptr, |
| 115 | .flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, |
| 116 | .pInheritanceInfo = nullptr, |
| 117 | }; |
| 118 | VK_CALL_ERR_EXEC(vkBeginCommandBuffer(render_cmd_buffer.cmd_buffer, &begin_info), |
| 119 | "failed to begin command buffer", valid = false; return false;) |
| 120 | |
| 121 | // register completion callback to destroy all framebuffers once we're done |
| 122 | vk_queue.add_completion_handler(render_cmd_buffer, [this]() { |
| 123 | for (const auto& fb : framebuffers) { |
| 124 | vkDestroyFramebuffer(((const vulkan_device&)cqueue.get_device()).device, fb, nullptr); |
| 125 | } |
| 126 | framebuffers.clear(); |
| 127 | }); |
| 128 | |
| 129 | // can now use this cmd buffer + reuse it for every begin/end until commit is called |
| 130 | did_begin_cmd_buffer = true; |
| 131 | return true; |
| 132 | } |
| 133 | |
| 134 | bool vulkan_renderer::begin(const dynamic_render_state_t dynamic_render_state) { |
| 135 | #if defined(FLOOR_DEBUG) |
nothing calls this directly
no test coverage detected