vulkan_command_pool.cc 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // 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. #include "gpu/vulkan/vulkan_command_pool.h"
  5. #include "base/logging.h"
  6. #include "gpu/vulkan/vulkan_command_buffer.h"
  7. #include "gpu/vulkan/vulkan_device_queue.h"
  8. #include "gpu/vulkan/vulkan_function_pointers.h"
  9. namespace gpu {
  10. VulkanCommandPool::VulkanCommandPool(VulkanDeviceQueue* device_queue)
  11. : device_queue_(device_queue) {}
  12. VulkanCommandPool::~VulkanCommandPool() {
  13. DCHECK_EQ(0u, command_buffer_count_);
  14. DCHECK_EQ(static_cast<VkCommandPool>(VK_NULL_HANDLE), handle_);
  15. }
  16. bool VulkanCommandPool::Initialize() {
  17. VkCommandPoolCreateInfo command_pool_create_info = {};
  18. command_pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
  19. command_pool_create_info.flags =
  20. VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
  21. command_pool_create_info.queueFamilyIndex =
  22. device_queue_->GetVulkanQueueIndex();
  23. VkResult result =
  24. vkCreateCommandPool(device_queue_->GetVulkanDevice(),
  25. &command_pool_create_info, nullptr, &handle_);
  26. if (VK_SUCCESS != result) {
  27. DLOG(ERROR) << "vkCreateCommandPool() failed: " << result;
  28. return false;
  29. }
  30. return true;
  31. }
  32. void VulkanCommandPool::Destroy() {
  33. DCHECK_EQ(0u, command_buffer_count_);
  34. if (VK_NULL_HANDLE != handle_) {
  35. vkDestroyCommandPool(device_queue_->GetVulkanDevice(), handle_, nullptr);
  36. handle_ = VK_NULL_HANDLE;
  37. }
  38. }
  39. std::unique_ptr<VulkanCommandBuffer>
  40. VulkanCommandPool::CreatePrimaryCommandBuffer() {
  41. std::unique_ptr<VulkanCommandBuffer> command_buffer(
  42. new VulkanCommandBuffer(device_queue_, this, true));
  43. if (!command_buffer->Initialize())
  44. return nullptr;
  45. return command_buffer;
  46. }
  47. std::unique_ptr<VulkanCommandBuffer>
  48. VulkanCommandPool::CreateSecondaryCommandBuffer() {
  49. auto command_buffer =
  50. std::make_unique<VulkanCommandBuffer>(device_queue_, this, false);
  51. if (!command_buffer->Initialize())
  52. return nullptr;
  53. return command_buffer;
  54. }
  55. void VulkanCommandPool::IncrementCommandBufferCount() {
  56. command_buffer_count_++;
  57. }
  58. void VulkanCommandPool::DecrementCommandBufferCount() {
  59. DCHECK_LT(0u, command_buffer_count_);
  60. command_buffer_count_--;
  61. }
  62. } // namespace gpu