• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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