| // Copyright (c) 2016 The Chromium 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 "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<VkCommandPool>(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<VulkanCommandBuffer> | 
 | VulkanCommandPool::CreatePrimaryCommandBuffer() { | 
 |   std::unique_ptr<VulkanCommandBuffer> command_buffer( | 
 |       new VulkanCommandBuffer(device_queue_, this, true)); | 
 |   if (!command_buffer->Initialize()) | 
 |     return nullptr; | 
 |  | 
 |   return command_buffer; | 
 | } | 
 |  | 
 | std::unique_ptr<VulkanCommandBuffer> | 
 | VulkanCommandPool::CreateSecondaryCommandBuffer() { | 
 |   std::unique_ptr<VulkanCommandBuffer> command_buffer( | 
 |       new VulkanCommandBuffer(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 |