24 const std::vector<std::shared_ptr<CommandBuffer>>& buffers,
26 bool block_on_schedule) {
27 if (buffers.empty()) {
29 "No command buffers provided.");
33 if (completion_callback) {
38 std::vector<vk::CommandBuffer> vk_buffers;
39 std::vector<std::shared_ptr<TrackedObjectsVK>> tracked_objects;
40 vk_buffers.reserve(buffers.size());
41 tracked_objects.reserve(buffers.size());
42 for (
const std::shared_ptr<CommandBuffer>& buffer : buffers) {
46 "Failed to end command buffer.");
49 tracked_objects.push_back(std::move(command_buffer.tracked_objects_));
52 auto context = context_.lock();
57 auto [fence_result, fence] = context->GetDevice().createFenceUnique({});
58 if (fence_result != vk::Result::eSuccess) {
59 VALIDATION_LOG <<
"Failed to create fence: " << vk::to_string(fence_result);
63 vk::SubmitInfo submit_info;
64 submit_info.setCommandBuffers(vk_buffers);
65 auto status = context->GetGraphicsQueue()->Submit(submit_info, *fence);
66 if (status != vk::Result::eSuccess) {
67 VALIDATION_LOG <<
"Failed to submit queue: " << vk::to_string(status);
73 auto added_fence = context->GetFenceWaiter()->AddFence(
74 std::move(fence), [completion_callback, tracked_objects = std::move(
75 tracked_objects)]()
mutable {
78 tracked_objects.clear();
79 if (completion_callback) {
fml::Status Submit(const std::vector< std::shared_ptr< CommandBuffer > > &buffers, const CompletionCallback &completion_callback={}, bool block_on_schedule=false) override
Submit one or more command buffer objects to be encoded and executed on the GPU.