Flutter Engine
The Flutter Engine
GrVkCommandPool.cpp
Go to the documentation of this file.
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
9
14
17 if (gpu->protectedContext()) {
18 cmdPoolCreateFlags |= VK_COMMAND_POOL_CREATE_PROTECTED_BIT;
19 }
20
21 const VkCommandPoolCreateInfo cmdPoolInfo = {
23 nullptr, // pNext
24 cmdPoolCreateFlags, // CmdPoolCreateFlags
25 gpu->queueIndex(), // queueFamilyIndex
26 };
28 VkCommandPool pool;
29 GR_VK_CALL_RESULT(gpu, result, CreateCommandPool(gpu->device(), &cmdPoolInfo, nullptr, &pool));
30 if (result != VK_SUCCESS) {
31 return nullptr;
32 }
33
35 if (!primaryCmdBuffer) {
36 GR_VK_CALL(gpu->vkInterface(), DestroyCommandPool(gpu->device(), pool, nullptr));
37 return nullptr;
38 }
39
40 return new GrVkCommandPool(gpu, pool, primaryCmdBuffer);
41}
42
43GrVkCommandPool::GrVkCommandPool(GrVkGpu* gpu, VkCommandPool commandPool,
44 GrVkPrimaryCommandBuffer* primaryCmdBuffer)
46 , fCommandPool(commandPool)
47 , fPrimaryCommandBuffer(primaryCmdBuffer)
48 , fMaxCachedSecondaryCommandBuffers(
49 gpu->vkCaps().maxPerPoolCachedSecondaryCommandBuffers()) {
50}
51
52std::unique_ptr<GrVkSecondaryCommandBuffer> GrVkCommandPool::findOrCreateSecondaryCommandBuffer(
53 GrVkGpu* gpu) {
54 std::unique_ptr<GrVkSecondaryCommandBuffer> result;
55 if (!fAvailableSecondaryBuffers.empty()) {
56 result = std::move(fAvailableSecondaryBuffers.back());
57 fAvailableSecondaryBuffers.pop_back();
58 } else{
60 }
61 return result;
62}
63
65 std::unique_ptr<GrVkSecondaryCommandBuffer> scb(buffer);
66 if (fAvailableSecondaryBuffers.size() < fMaxCachedSecondaryCommandBuffers) {
67 fAvailableSecondaryBuffers.push_back(std::move(scb));
68 } else {
69 VkCommandBuffer vkBuffer = buffer->vkCommandBuffer();
71 FreeCommandBuffers(fGpu->device(), fCommandPool, 1, &vkBuffer));
72 }
73}
74
76 fOpen = false;
77}
78
80 TRACE_EVENT0("skia.gpu", TRACE_FUNC);
81 SkASSERT(!fOpen);
82 // We can't use the normal result macro calls here because we may call reset on a different
83 // thread and we can't be modifying the lost state on the GrVkGpu. We just call
84 // vkResetCommandPool and assume the "next" vulkan call will catch the lost device.
86 ResetCommandPool(gpu->device(), fCommandPool, 0));
88
89 // It should be safe to release the resources before actually resetting the VkCommandPool.
90 // However, on qualcomm devices running R drivers there was a few months period where the driver
91 // had a bug which it incorrectly was accessing objects on the command buffer while it was being
92 // reset. If these objects were already destroyed (which is a valid thing to do) it would crash.
93 // So to be safe we do the reset first since it doesn't really matter when single threaded. If
94 // we ever add back in threaded resets we'll want to add checks to make sure everything happens
95 // in the right order (and probably do single threaded resets on bad devices).
96 this->releaseResources();
97
98 fOpen = true;
99}
100
101void GrVkCommandPool::releaseResources() {
102 TRACE_EVENT0("skia.gpu", TRACE_FUNC);
103 SkASSERT(!fOpen);
104 fPrimaryCommandBuffer->releaseResources();
105 fPrimaryCommandBuffer->recycleSecondaryCommandBuffers(this);
106}
107
108void GrVkCommandPool::freeGPUData() const {
109 // TODO: having freeGPUData virtual on GrManagedResource be const seems like a bad restriction since
110 // we are changing the internal objects of these classes when it is called. We should go back a
111 // revisit how much of a headache it would be to make this function non-const
112 GrVkCommandPool* nonConstThis = const_cast<GrVkCommandPool*>(this);
113 nonConstThis->close();
114 nonConstThis->releaseResources();
115 fPrimaryCommandBuffer->freeGPUData(fGpu, fCommandPool);
116 for (const auto& buffer : fAvailableSecondaryBuffers) {
117 buffer->freeGPUData(fGpu, fCommandPool);
118 }
119 if (fCommandPool != VK_NULL_HANDLE) {
121 DestroyCommandPool(fGpu->device(), fCommandPool, nullptr));
122 }
123}
AutoreleasePool pool
#define GR_VK_CALL(IFACE, X)
Definition: GrVkUtil.h:24
#define GR_VK_CALL_RESULT(GPU, RESULT, X)
Definition: GrVkUtil.h:35
#define SkASSERT(cond)
Definition: SkAssert.h:116
SkDEBUGCODE(SK_SPI) SkThreadID SkGetThreadID()
#define TRACE_FUNC
Definition: SkTraceEvent.h:30
void recycleSecondaryCommandBuffer(GrVkSecondaryCommandBuffer *buffer)
static GrVkCommandPool * Create(GrVkGpu *gpu)
void reset(GrVkGpu *gpu)
std::unique_ptr< GrVkSecondaryCommandBuffer > findOrCreateSecondaryCommandBuffer(GrVkGpu *gpu)
uint32_t queueIndex() const
Definition: GrVkGpu.h:73
const skgpu::VulkanInterface * vkInterface() const
Definition: GrVkGpu.h:60
VkDevice device() const
Definition: GrVkGpu.h:71
bool protectedContext() const
Definition: GrVkGpu.h:81
static GrVkPrimaryCommandBuffer * Create(GrVkGpu *gpu, VkCommandPool cmdPool)
static GrVkSecondaryCommandBuffer * Create(GrVkGpu *gpu, GrVkCommandPool *cmdPool)
bool empty() const
Definition: SkTArray.h:199
int size() const
Definition: SkTArray.h:421
GAsyncResult * result
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir Path to the cache directory This is different from the persistent_cache_path in embedder which is used for Skia shader cache icu native lib Path to the library file that exports the ICU data vm service The hostname IP address on which the Dart VM Service should be served If not defaults to or::depending on whether ipv6 is specified vm service A custom Dart VM Service port The default is to pick a randomly available open port disable vm Disable the Dart VM Service The Dart VM Service is never available in release mode disable vm service Disable mDNS Dart VM Service publication Bind to the IPv6 localhost address for the Dart VM Service Ignored if vm service host is set endless trace buffer
Definition: switches.h:126
#define TRACE_EVENT0(category_group, name)
Definition: trace_event.h:131
VkFlags VkCommandPoolCreateFlags
Definition: vulkan_core.h:2821
VkResult
Definition: vulkan_core.h:140
@ VK_ERROR_DEVICE_LOST
Definition: vulkan_core.h:150
@ VK_SUCCESS
Definition: vulkan_core.h:141
#define VK_NULL_HANDLE
Definition: vulkan_core.h:46
@ VK_COMMAND_POOL_CREATE_TRANSIENT_BIT
Definition: vulkan_core.h:2816
@ VK_COMMAND_POOL_CREATE_PROTECTED_BIT
Definition: vulkan_core.h:2818
@ VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO
Definition: vulkan_core.h:241