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