// Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "vulkan_command_buffer.h" #include "flutter/vulkan/procs/vulkan_proc_table.h" namespace vulkan { VulkanCommandBuffer::VulkanCommandBuffer( const VulkanProcTable& p_vk, const VulkanHandle& device, const VulkanHandle& pool) : vk_(p_vk), device_(device), pool_(pool), valid_(false) { const VkCommandBufferAllocateInfo allocate_info = { .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, .pNext = nullptr, .commandPool = pool_, .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY, .commandBufferCount = 1, }; VkCommandBuffer buffer = VK_NULL_HANDLE; if (VK_CALL_LOG_ERROR(vk_.AllocateCommandBuffers(device_, &allocate_info, &buffer)) != VK_SUCCESS) { FML_DLOG(INFO) << "Could not allocate command buffers."; return; } auto buffer_collect = [this](VkCommandBuffer buffer) { vk_.FreeCommandBuffers(device_, pool_, 1, &buffer); }; handle_ = VulkanHandle{buffer, buffer_collect}; valid_ = true; } VulkanCommandBuffer::~VulkanCommandBuffer() = default; bool VulkanCommandBuffer::IsValid() const { return valid_; } VkCommandBuffer VulkanCommandBuffer::Handle() const { return handle_; } bool VulkanCommandBuffer::Begin() const { const VkCommandBufferBeginInfo info{ .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, .pNext = nullptr, .flags = 0, .pInheritanceInfo = nullptr, }; return VK_CALL_LOG_ERROR(vk_.BeginCommandBuffer(handle_, &info)) == VK_SUCCESS; } bool VulkanCommandBuffer::End() const { return VK_CALL_LOG_ERROR(vk_.EndCommandBuffer(handle_)) == VK_SUCCESS; } bool VulkanCommandBuffer::InsertPipelineBarrier( VkPipelineStageFlagBits src_stage_flags, VkPipelineStageFlagBits dest_stage_flags, uint32_t /* mask of VkDependencyFlagBits */ dependency_flags, uint32_t memory_barrier_count, const VkMemoryBarrier* memory_barriers, uint32_t buffer_memory_barrier_count, const VkBufferMemoryBarrier* buffer_memory_barriers, uint32_t image_memory_barrier_count, const VkImageMemoryBarrier* image_memory_barriers) const { vk_.CmdPipelineBarrier(handle_, src_stage_flags, dest_stage_flags, dependency_flags, memory_barrier_count, memory_barriers, buffer_memory_barrier_count, buffer_memory_barriers, image_memory_barrier_count, image_memory_barriers); return true; } } // namespace vulkan