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_));
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);
64 auto submit_callback = [&
context, &vk_buffers](vk::Fence submit_fence) {
65 vk::SubmitInfo submit_info;
66 submit_info.setCommandBuffers(vk_buffers);
68 context->GetGraphicsQueue()->Submit(submit_info, submit_fence);
69 if (status != vk::Result::eSuccess) {
70 std::string submit_error =
71 "Failed to submit command: " + vk::to_string(status);
79 auto fence_complete_callback = [completion_callback,
81 std::move(tracked_objects)]()
mutable {
84 tracked_objects.clear();
85 if (completion_callback) {
92 auto fence_status =
context->GetFenceWaiter()->AddFence(
93 std::move(fence), submit_callback, std::move(fence_complete_callback));
94 if (!fence_status.ok()) {
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.