// Copyright 2016 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "gpu/vulkan/vulkan_command_pool.h" #include "base/logging.h" #include "gpu/vulkan/vulkan_command_buffer.h" #include "gpu/vulkan/vulkan_device_queue.h" #include "gpu/vulkan/vulkan_function_pointers.h" namespace gpu { VulkanCommandPool::VulkanCommandPool(VulkanDeviceQueue* device_queue) : device_queue_(device_queue) {} VulkanCommandPool::~VulkanCommandPool() { DCHECK_EQ(0u, command_buffer_count_); DCHECK_EQ(static_cast(VK_NULL_HANDLE), handle_); } bool VulkanCommandPool::Initialize() { VkCommandPoolCreateInfo command_pool_create_info = {}; command_pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; command_pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; command_pool_create_info.queueFamilyIndex = device_queue_->GetVulkanQueueIndex(); VkResult result = vkCreateCommandPool(device_queue_->GetVulkanDevice(), &command_pool_create_info, nullptr, &handle_); if (VK_SUCCESS != result) { DLOG(ERROR) << "vkCreateCommandPool() failed: " << result; return false; } return true; } void VulkanCommandPool::Destroy() { DCHECK_EQ(0u, command_buffer_count_); if (VK_NULL_HANDLE != handle_) { vkDestroyCommandPool(device_queue_->GetVulkanDevice(), handle_, nullptr); handle_ = VK_NULL_HANDLE; } } std::unique_ptr VulkanCommandPool::CreatePrimaryCommandBuffer() { std::unique_ptr command_buffer( new VulkanCommandBuffer(device_queue_, this, true)); if (!command_buffer->Initialize()) return nullptr; return command_buffer; } std::unique_ptr VulkanCommandPool::CreateSecondaryCommandBuffer() { auto command_buffer = std::make_unique(device_queue_, this, false); if (!command_buffer->Initialize()) return nullptr; return command_buffer; } void VulkanCommandPool::IncrementCommandBufferCount() { command_buffer_count_++; } void VulkanCommandPool::DecrementCommandBufferCount() { DCHECK_LT(0u, command_buffer_count_); command_buffer_count_--; } } // namespace gpu