1 /*
2 * Copyright 2018 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8 #include "src/gpu/vk/GrVkCommandPool.h"
9
10 #include "src/gpu/GrContextPriv.h"
11 #include "src/gpu/vk/GrVkCommandBuffer.h"
12 #include "src/gpu/vk/GrVkGpu.h"
13
Create(const GrVkGpu * gpu)14 GrVkCommandPool* GrVkCommandPool::Create(const GrVkGpu* gpu) {
15 VkCommandPoolCreateFlags cmdPoolCreateFlags =
16 VK_COMMAND_POOL_CREATE_TRANSIENT_BIT |
17 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18 if (gpu->protectedContext()) {
19 cmdPoolCreateFlags |= VK_COMMAND_POOL_CREATE_PROTECTED_BIT;
20 }
21
22 const VkCommandPoolCreateInfo cmdPoolInfo = {
23 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType
24 nullptr, // pNext
25 cmdPoolCreateFlags, // CmdPoolCreateFlags
26 gpu->queueIndex(), // queueFamilyIndex
27 };
28 VkCommandPool pool;
29 GR_VK_CALL_ERRCHECK(
30 gpu->vkInterface(),
31 CreateCommandPool(gpu->device(), &cmdPoolInfo, nullptr, &pool));
32 return new GrVkCommandPool(gpu, pool);
33 }
34
GrVkCommandPool(const GrVkGpu * gpu,VkCommandPool commandPool)35 GrVkCommandPool::GrVkCommandPool(const GrVkGpu* gpu, VkCommandPool commandPool)
36 : fCommandPool(commandPool) {
37 fPrimaryCommandBuffer.reset(GrVkPrimaryCommandBuffer::Create(gpu, this));
38 }
39
findOrCreateSecondaryCommandBuffer(GrVkGpu * gpu)40 std::unique_ptr<GrVkSecondaryCommandBuffer> GrVkCommandPool::findOrCreateSecondaryCommandBuffer(
41 GrVkGpu* gpu) {
42 std::unique_ptr<GrVkSecondaryCommandBuffer> result;
43 if (fAvailableSecondaryBuffers.count()) {
44 result = std::move(fAvailableSecondaryBuffers.back());
45 fAvailableSecondaryBuffers.pop_back();
46 } else{
47 result.reset(GrVkSecondaryCommandBuffer::Create(gpu, this));
48 }
49 return result;
50 }
51
recycleSecondaryCommandBuffer(GrVkSecondaryCommandBuffer * buffer)52 void GrVkCommandPool::recycleSecondaryCommandBuffer(GrVkSecondaryCommandBuffer* buffer) {
53 SkASSERT(buffer->commandPool() == this);
54 std::unique_ptr<GrVkSecondaryCommandBuffer> scb(buffer);
55 fAvailableSecondaryBuffers.push_back(std::move(scb));
56 }
57
close()58 void GrVkCommandPool::close() {
59 fOpen = false;
60 }
61
reset(GrVkGpu * gpu)62 void GrVkCommandPool::reset(GrVkGpu* gpu) {
63 SkASSERT(!fOpen);
64 fOpen = true;
65 fPrimaryCommandBuffer->recycleSecondaryCommandBuffers(gpu);
66 GR_VK_CALL_ERRCHECK(gpu->vkInterface(), ResetCommandPool(gpu->device(), fCommandPool, 0));
67 }
68
releaseResources(GrVkGpu * gpu)69 void GrVkCommandPool::releaseResources(GrVkGpu* gpu) {
70 TRACE_EVENT0("skia.gpu", TRACE_FUNC);
71 SkASSERT(!fOpen);
72 fPrimaryCommandBuffer->releaseResources(gpu);
73 }
74
abandonGPUData() const75 void GrVkCommandPool::abandonGPUData() const {
76 fPrimaryCommandBuffer->abandonGPUData();
77 for (const auto& buffer : fAvailableSecondaryBuffers) {
78 buffer->abandonGPUData();
79 }
80 }
81
freeGPUData(GrVkGpu * gpu) const82 void GrVkCommandPool::freeGPUData(GrVkGpu* gpu) const {
83 fPrimaryCommandBuffer->freeGPUData(gpu);
84 for (const auto& buffer : fAvailableSecondaryBuffers) {
85 buffer->freeGPUData(gpu);
86 }
87 if (fCommandPool != VK_NULL_HANDLE) {
88 GR_VK_CALL(gpu->vkInterface(),
89 DestroyCommandPool(gpu->device(), fCommandPool, nullptr));
90 }
91 }
92