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 "GrVkCommandPool.h"
9
10 #include "GrContextPriv.h"
11 #include "GrVkCommandBuffer.h"
12 #include "GrVkGpu.h"
13
Create(const GrVkGpu * gpu)14 GrVkCommandPool* GrVkCommandPool::Create(const GrVkGpu* gpu) {
15 const VkCommandPoolCreateInfo cmdPoolInfo = {
16 VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, // sType
17 nullptr, // pNext
18 VK_COMMAND_POOL_CREATE_TRANSIENT_BIT |
19 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, // CmdPoolCreateFlags
20 gpu->queueIndex(), // queueFamilyIndex
21 };
22 VkCommandPool pool;
23 GR_VK_CALL_ERRCHECK(gpu->vkInterface(), CreateCommandPool(gpu->device(), &cmdPoolInfo,
24 nullptr, &pool));
25 return new GrVkCommandPool(gpu, pool);
26 }
27
GrVkCommandPool(const GrVkGpu * gpu,VkCommandPool commandPool)28 GrVkCommandPool::GrVkCommandPool(const GrVkGpu* gpu, VkCommandPool commandPool)
29 : fCommandPool(commandPool) {
30 fPrimaryCommandBuffer = GrVkPrimaryCommandBuffer::Create(gpu, this);
31 }
32
findOrCreateSecondaryCommandBuffer(GrVkGpu * gpu)33 GrVkSecondaryCommandBuffer* GrVkCommandPool::findOrCreateSecondaryCommandBuffer(GrVkGpu* gpu) {
34 if (fAvailableSecondaryBuffers.count()) {
35 GrVkSecondaryCommandBuffer* result = fAvailableSecondaryBuffers.back();
36 fAvailableSecondaryBuffers.pop_back();
37 return result;
38 }
39 return GrVkSecondaryCommandBuffer::Create(gpu, this);
40 }
41
recycleSecondaryCommandBuffer(GrVkSecondaryCommandBuffer * buffer)42 void GrVkCommandPool::recycleSecondaryCommandBuffer(GrVkSecondaryCommandBuffer* buffer) {
43 SkASSERT(buffer->commandPool() == this);
44 fAvailableSecondaryBuffers.push_back(buffer);
45 }
46
close()47 void GrVkCommandPool::close() {
48 fOpen = false;
49 }
50
reset(GrVkGpu * gpu)51 void GrVkCommandPool::reset(GrVkGpu* gpu) {
52 SkASSERT(!fOpen);
53 fOpen = true;
54 fPrimaryCommandBuffer->recycleSecondaryCommandBuffers();
55 GR_VK_CALL_ERRCHECK(gpu->vkInterface(), ResetCommandPool(gpu->device(), fCommandPool, 0));
56 }
57
releaseResources(GrVkGpu * gpu)58 void GrVkCommandPool::releaseResources(GrVkGpu* gpu) {
59 SkASSERT(!fOpen);
60 fPrimaryCommandBuffer->releaseResources(gpu);
61 for (GrVkSecondaryCommandBuffer* buffer : fAvailableSecondaryBuffers) {
62 buffer->releaseResources(gpu);
63 }
64 }
65
abandonGPUData() const66 void GrVkCommandPool::abandonGPUData() const {
67 fPrimaryCommandBuffer->unrefAndAbandon();
68 for (GrVkSecondaryCommandBuffer* buffer : fAvailableSecondaryBuffers) {
69 SkASSERT(buffer->unique());
70 buffer->unrefAndAbandon();
71 }
72 }
73
freeGPUData(GrVkGpu * gpu) const74 void GrVkCommandPool::freeGPUData(GrVkGpu* gpu) const {
75 fPrimaryCommandBuffer->unref(gpu);
76 for (GrVkSecondaryCommandBuffer* buffer : fAvailableSecondaryBuffers) {
77 SkASSERT(buffer->unique());
78 buffer->unref(gpu);
79 }
80 if (fCommandPool != VK_NULL_HANDLE) {
81 GR_VK_CALL(gpu->vkInterface(),
82 DestroyCommandPool(gpu->device(), fCommandPool, nullptr));
83 }
84 }
85