| 148 | } |
| 149 | |
| 150 | bool vulkan_renderer::create_cmd_buffer() { |
| 151 | const auto& vk_queue = (const vulkan_queue&)cqueue; |
| 152 | #if defined(FLOOR_DEBUG) |
| 153 | const char* cmd_buffer_label = (!cur_pipeline->get_description(multi_view).debug_label.empty() ? |
| 154 | cur_pipeline->get_description(multi_view).debug_label.c_str() : |
| 155 | "vk_renderer_cmd_buffer"); |
| 156 | #else |
| 157 | static constexpr const char* cmd_buffer_label = "vk_renderer_cmd_buffer"; |
| 158 | #endif |
| 159 | render_cmd_buffer = vk_queue.make_command_buffer(cmd_buffer_label); |
| 160 | const VkCommandBufferBeginInfo begin_info{ |
| 161 | .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, |
| 162 | .pNext = nullptr, |
| 163 | .flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, |
| 164 | .pInheritanceInfo = nullptr, |
| 165 | }; |
| 166 | VK_CALL_ERR_EXEC(vkBeginCommandBuffer(render_cmd_buffer.cmd_buffer, &begin_info), |
| 167 | "failed to begin command buffer", valid = false; return false;) |
| 168 | |
| 169 | // register completion callback to destroy all framebuffers once we're done |
| 170 | vk_queue.add_completion_handler(render_cmd_buffer, [this]() { |
| 171 | for (const auto& fb : framebuffers) { |
| 172 | vkDestroyFramebuffer(((const vulkan_device&)cqueue.get_device()).device, fb, nullptr); |
| 173 | } |
| 174 | framebuffers.clear(); |
| 175 | }); |
| 176 | |
| 177 | // can now use this cmd buffer + reuse it for every begin/end until commit is called |
| 178 | did_begin_cmd_buffer = true; |
| 179 | return true; |
| 180 | } |
| 181 | |
| 182 | bool vulkan_renderer::begin(const dynamic_render_state_t dynamic_render_state) { |
| 183 | #if defined(FLOOR_DEBUG) |
nothing calls this directly
no test coverage detected