blob: 9f741f3c57ae37d1dd0d78f47b9d6da4d38ef704 [file] [log] [blame]
dyen4ec04ecc2016-03-30 22:45:461// Copyright (c) 2016 The Chromium 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 "gpu/vulkan/vulkan_command_pool.h"
6
7#include "base/logging.h"
8#include "gpu/vulkan/vulkan_command_buffer.h"
dyen8a145fb72016-03-31 00:37:519#include "gpu/vulkan/vulkan_device_queue.h"
dyen4ec04ecc2016-03-30 22:45:4610#include "gpu/vulkan/vulkan_implementation.h"
11
12namespace gpu {
13
dyen8a145fb72016-03-31 00:37:5114VulkanCommandPool::VulkanCommandPool(VulkanDeviceQueue* device_queue)
15 : device_queue_(device_queue) {}
dyen4ec04ecc2016-03-30 22:45:4616
17VulkanCommandPool::~VulkanCommandPool() {
18 DCHECK_EQ(0u, command_buffer_count_);
19 DCHECK_EQ(static_cast<VkCommandPool>(VK_NULL_HANDLE), handle_);
20}
21
22bool VulkanCommandPool::Initialize() {
23 VkCommandPoolCreateInfo command_pool_create_info = {};
24 command_pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
25 command_pool_create_info.flags =
26 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
dyen8a145fb72016-03-31 00:37:5127 command_pool_create_info.queueFamilyIndex =
28 device_queue_->GetVulkanQueueIndex();
dyen4ec04ecc2016-03-30 22:45:4629
dyen8a145fb72016-03-31 00:37:5130 VkResult result =
31 vkCreateCommandPool(device_queue_->GetVulkanDevice(),
32 &command_pool_create_info, nullptr, &handle_);
dyen4ec04ecc2016-03-30 22:45:4633 if (VK_SUCCESS != result) {
34 DLOG(ERROR) << "vkCreateCommandPool() failed: " << result;
35 return false;
36 }
37
38 return true;
39}
40
41void VulkanCommandPool::Destroy() {
42 DCHECK_EQ(0u, command_buffer_count_);
43 if (VK_NULL_HANDLE != handle_) {
dyen8a145fb72016-03-31 00:37:5144 vkDestroyCommandPool(device_queue_->GetVulkanDevice(), handle_, nullptr);
dyen4ec04ecc2016-03-30 22:45:4645 handle_ = VK_NULL_HANDLE;
46 }
47}
48
mostynb6682b1c42016-04-19 10:17:3049std::unique_ptr<VulkanCommandBuffer>
dyen4ec04ecc2016-03-30 22:45:4650VulkanCommandPool::CreatePrimaryCommandBuffer() {
mostynb6682b1c42016-04-19 10:17:3051 std::unique_ptr<VulkanCommandBuffer> command_buffer(
dyen8a145fb72016-03-31 00:37:5152 new VulkanCommandBuffer(device_queue_, this, true));
dyen4ec04ecc2016-03-30 22:45:4653 if (!command_buffer->Initialize())
54 return nullptr;
55
56 return command_buffer;
57}
58
mostynb6682b1c42016-04-19 10:17:3059std::unique_ptr<VulkanCommandBuffer>
dyen4ec04ecc2016-03-30 22:45:4660VulkanCommandPool::CreateSecondaryCommandBuffer() {
mostynb6682b1c42016-04-19 10:17:3061 std::unique_ptr<VulkanCommandBuffer> command_buffer(
dyen8a145fb72016-03-31 00:37:5162 new VulkanCommandBuffer(device_queue_, this, false));
dyen4ec04ecc2016-03-30 22:45:4663 if (!command_buffer->Initialize())
64 return nullptr;
65
66 return command_buffer;
67}
68
69void VulkanCommandPool::IncrementCommandBufferCount() {
70 command_buffer_count_++;
71}
72
73void VulkanCommandPool::DecrementCommandBufferCount() {
74 DCHECK_LT(0u, command_buffer_count_);
75 command_buffer_count_--;
76}
77
78} // namespace gpu