• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "flutter/vulkan/vulkan_command_buffer.h"
6 
7 #ifdef RS_ENABLE_VK
8 #include "flutter/vulkan/vulkan_hilog.h"
9 #endif
10 #include "flutter/vulkan/vulkan_proc_table.h"
11 
12 namespace vulkan {
13 
VulkanCommandBuffer(const VulkanProcTable & p_vk,const VulkanHandle<VkDevice> & device,const VulkanHandle<VkCommandPool> & pool)14 VulkanCommandBuffer::VulkanCommandBuffer(
15     const VulkanProcTable& p_vk,
16     const VulkanHandle<VkDevice>& device,
17     const VulkanHandle<VkCommandPool>& pool)
18     : vk(p_vk), device_(device), pool_(pool), valid_(false) {
19   const VkCommandBufferAllocateInfo allocate_info = {
20       .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
21       .pNext = nullptr,
22       .commandPool = pool_,
23       .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
24       .commandBufferCount = 1,
25   };
26 
27   VkCommandBuffer buffer = VK_NULL_HANDLE;
28 
29   if (VK_CALL_LOG_ERROR(vk.AllocateCommandBuffers(device_, &allocate_info,
30                                                   &buffer)) != VK_SUCCESS) {
31 #ifdef RS_ENABLE_VK
32     LOGE("Could not allocate command buffers.");
33 #else
34     FML_DLOG(INFO) << "Could not allocate command buffers.";
35 #endif
36     return;
37   }
38 
39   auto buffer_collect = [this](VkCommandBuffer buffer) {
40     vk.FreeCommandBuffers(device_, pool_, 1, &buffer);
41   };
42 
43   handle_ = {buffer, buffer_collect};
44 
45   valid_ = true;
46 }
47 
48 VulkanCommandBuffer::~VulkanCommandBuffer() = default;
49 
IsValid() const50 bool VulkanCommandBuffer::IsValid() const {
51   return valid_;
52 }
53 
Handle() const54 VkCommandBuffer VulkanCommandBuffer::Handle() const {
55   return handle_;
56 }
57 
Begin() const58 bool VulkanCommandBuffer::Begin() const {
59   const VkCommandBufferBeginInfo info{
60       .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
61       .pNext = nullptr,
62       .flags = 0,
63       .pInheritanceInfo = nullptr,
64   };
65 
66   return VK_CALL_LOG_ERROR(vk.BeginCommandBuffer(handle_, &info)) == VK_SUCCESS;
67 }
68 
End() const69 bool VulkanCommandBuffer::End() const {
70   return VK_CALL_LOG_ERROR(vk.EndCommandBuffer(handle_)) == VK_SUCCESS;
71 }
72 
InsertPipelineBarrier(VkPipelineStageFlagBits src_stage_flags,VkPipelineStageFlagBits dest_stage_flags,uint32_t 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) const73 bool VulkanCommandBuffer::InsertPipelineBarrier(
74     VkPipelineStageFlagBits src_stage_flags,
75     VkPipelineStageFlagBits dest_stage_flags,
76     uint32_t /* mask of VkDependencyFlagBits */ dependency_flags,
77     uint32_t memory_barrier_count,
78     const VkMemoryBarrier* memory_barriers,
79     uint32_t buffer_memory_barrier_count,
80     const VkBufferMemoryBarrier* buffer_memory_barriers,
81     uint32_t image_memory_barrier_count,
82     const VkImageMemoryBarrier* image_memory_barriers) const {
83   vk.CmdPipelineBarrier(handle_, src_stage_flags, dest_stage_flags,
84                         dependency_flags, memory_barrier_count, memory_barriers,
85                         buffer_memory_barrier_count, buffer_memory_barriers,
86                         image_memory_barrier_count, image_memory_barriers);
87   return true;
88 }
89 
90 }  // namespace vulkan
91