blob: b4290ce6f0772ba053aede469872e42b083d60c4 [file] [log] [blame]
Greg Daniel164a9f02016-02-22 09:56:40 -05001/*
2* Copyright 2016 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 "GrVkResourceProvider.h"
9
Brian Salomon2bbdcc42017-09-07 12:36:34 -040010#include "GrSamplerState.h"
Greg Daniel164a9f02016-02-22 09:56:40 -050011#include "GrVkCommandBuffer.h"
egdanielbc9b2962016-09-27 08:00:53 -070012#include "GrVkCopyPipeline.h"
Greg Daniel6ecc9112017-06-16 16:17:03 +000013#include "GrVkGpu.h"
Greg Daniel164a9f02016-02-22 09:56:40 -050014#include "GrVkPipeline.h"
egdaniel066df7c2016-06-08 14:02:27 -070015#include "GrVkRenderTarget.h"
egdaniel8b6394c2016-03-04 07:35:10 -080016#include "GrVkSampler.h"
jvanverth4c6e47a2016-07-22 10:34:52 -070017#include "GrVkUniformBuffer.h"
Greg Daniel164a9f02016-02-22 09:56:40 -050018#include "GrVkUtil.h"
19
20#ifdef SK_TRACE_VK_RESOURCES
jvanverthd5f6e9a2016-07-07 08:21:48 -070021GrVkResource::Trace GrVkResource::fTrace;
egdaniel50ead532016-07-13 14:23:26 -070022uint32_t GrVkResource::fKeyCounter = 0;
Greg Daniel164a9f02016-02-22 09:56:40 -050023#endif
24
egdaniel778555c2016-05-02 06:50:36 -070025GrVkResourceProvider::GrVkResourceProvider(GrVkGpu* gpu)
26 : fGpu(gpu)
egdaniel707bbd62016-07-26 07:19:47 -070027 , fPipelineCache(VK_NULL_HANDLE) {
egdaniel22281c12016-03-23 13:49:40 -070028 fPipelineStateCache = new PipelineStateCache(gpu);
Greg Daniel164a9f02016-02-22 09:56:40 -050029}
30
31GrVkResourceProvider::~GrVkResourceProvider() {
egdanield62e28b2016-06-07 08:43:30 -070032 SkASSERT(0 == fRenderPassArray.count());
jvanverth03509ea2016-03-02 13:19:47 -080033 SkASSERT(VK_NULL_HANDLE == fPipelineCache);
egdaniel22281c12016-03-23 13:49:40 -070034 delete fPipelineStateCache;
jvanverth03509ea2016-03-02 13:19:47 -080035}
36
37void GrVkResourceProvider::init() {
38 VkPipelineCacheCreateInfo createInfo;
39 memset(&createInfo, 0, sizeof(VkPipelineCacheCreateInfo));
40 createInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
41 createInfo.pNext = nullptr;
42 createInfo.flags = 0;
43 createInfo.initialDataSize = 0;
44 createInfo.pInitialData = nullptr;
45 VkResult result = GR_VK_CALL(fGpu->vkInterface(),
46 CreatePipelineCache(fGpu->device(), &createInfo, nullptr,
47 &fPipelineCache));
48 SkASSERT(VK_SUCCESS == result);
49 if (VK_SUCCESS != result) {
50 fPipelineCache = VK_NULL_HANDLE;
51 }
egdaniel778555c2016-05-02 06:50:36 -070052
egdaniel707bbd62016-07-26 07:19:47 -070053 // Init uniform descriptor objects
Greg Daniel18f96022017-05-04 15:09:03 -040054 GrVkDescriptorSetManager* dsm = GrVkDescriptorSetManager::CreateUniformManager(fGpu);
55 fDescriptorSetManagers.emplace_back(dsm);
egdaniel707bbd62016-07-26 07:19:47 -070056 SkASSERT(1 == fDescriptorSetManagers.count());
57 fUniformDSHandle = GrVkDescriptorSetManager::Handle(0);
Greg Daniel164a9f02016-02-22 09:56:40 -050058}
59
Brian Salomonff168d92018-06-23 15:17:27 -040060GrVkPipeline* GrVkResourceProvider::createPipeline(const GrPrimitiveProcessor& primProc,
61 const GrPipeline& pipeline,
csmartdaltonc633abb2016-11-01 08:55:55 -070062 const GrStencilSettings& stencil,
Greg Daniel164a9f02016-02-22 09:56:40 -050063 VkPipelineShaderStageCreateInfo* shaderStageInfo,
64 int shaderStageCount,
65 GrPrimitiveType primitiveType,
66 const GrVkRenderPass& renderPass,
67 VkPipelineLayout layout) {
Brian Salomonff168d92018-06-23 15:17:27 -040068 return GrVkPipeline::Create(fGpu, primProc, pipeline, stencil, shaderStageInfo,
csmartdaltonc633abb2016-11-01 08:55:55 -070069 shaderStageCount, primitiveType, renderPass, layout,
70 fPipelineCache);
Greg Daniel164a9f02016-02-22 09:56:40 -050071}
72
egdanielbc9b2962016-09-27 08:00:53 -070073GrVkCopyPipeline* GrVkResourceProvider::findOrCreateCopyPipeline(
74 const GrVkRenderTarget* dst,
75 VkPipelineShaderStageCreateInfo* shaderStageInfo,
76 VkPipelineLayout pipelineLayout) {
77 // Find or Create a compatible pipeline
78 GrVkCopyPipeline* pipeline = nullptr;
79 for (int i = 0; i < fCopyPipelines.count() && !pipeline; ++i) {
80 if (fCopyPipelines[i]->isCompatible(*dst->simpleRenderPass())) {
81 pipeline = fCopyPipelines[i];
82 }
83 }
84 if (!pipeline) {
85 pipeline = GrVkCopyPipeline::Create(fGpu, shaderStageInfo,
86 pipelineLayout,
87 dst->numColorSamples(),
88 *dst->simpleRenderPass(),
89 fPipelineCache);
Greg Danielf3a4ef92018-03-01 11:34:59 -050090 if (!pipeline) {
91 return nullptr;
92 }
egdanielbc9b2962016-09-27 08:00:53 -070093 fCopyPipelines.push_back(pipeline);
94 }
95 SkASSERT(pipeline);
96 pipeline->ref();
97 return pipeline;
98}
Greg Daniel164a9f02016-02-22 09:56:40 -050099
100// To create framebuffers, we first need to create a simple RenderPass that is
halcanary9d524f22016-03-29 09:03:52 -0700101// only used for framebuffer creation. When we actually render we will create
Greg Daniel164a9f02016-02-22 09:56:40 -0500102// RenderPasses as needed that are compatible with the framebuffer.
halcanary9d524f22016-03-29 09:03:52 -0700103const GrVkRenderPass*
egdanield62e28b2016-06-07 08:43:30 -0700104GrVkResourceProvider::findCompatibleRenderPass(const GrVkRenderTarget& target,
105 CompatibleRPHandle* compatibleHandle) {
106 for (int i = 0; i < fRenderPassArray.count(); ++i) {
107 if (fRenderPassArray[i].isCompatible(target)) {
108 const GrVkRenderPass* renderPass = fRenderPassArray[i].getCompatibleRenderPass();
Greg Daniel164a9f02016-02-22 09:56:40 -0500109 renderPass->ref();
egdanield62e28b2016-06-07 08:43:30 -0700110 if (compatibleHandle) {
111 *compatibleHandle = CompatibleRPHandle(i);
112 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500113 return renderPass;
114 }
115 }
116
egdanield62e28b2016-06-07 08:43:30 -0700117 const GrVkRenderPass* renderPass =
118 fRenderPassArray.emplace_back(fGpu, target).getCompatibleRenderPass();
119 renderPass->ref();
120
121 if (compatibleHandle) {
122 *compatibleHandle = CompatibleRPHandle(fRenderPassArray.count() - 1);
123 }
124 return renderPass;
125}
126
127const GrVkRenderPass*
128GrVkResourceProvider::findCompatibleRenderPass(const CompatibleRPHandle& compatibleHandle) {
129 SkASSERT(compatibleHandle.isValid() && compatibleHandle.toIndex() < fRenderPassArray.count());
130 int index = compatibleHandle.toIndex();
131 const GrVkRenderPass* renderPass = fRenderPassArray[index].getCompatibleRenderPass();
Greg Daniel164a9f02016-02-22 09:56:40 -0500132 renderPass->ref();
133 return renderPass;
134}
135
egdaniel2feb0932016-06-08 06:48:09 -0700136const GrVkRenderPass* GrVkResourceProvider::findRenderPass(
137 const GrVkRenderTarget& target,
138 const GrVkRenderPass::LoadStoreOps& colorOps,
egdaniel2feb0932016-06-08 06:48:09 -0700139 const GrVkRenderPass::LoadStoreOps& stencilOps,
140 CompatibleRPHandle* compatibleHandle) {
egdaniel066df7c2016-06-08 14:02:27 -0700141 GrVkResourceProvider::CompatibleRPHandle tempRPHandle;
142 GrVkResourceProvider::CompatibleRPHandle* pRPHandle = compatibleHandle ? compatibleHandle
143 : &tempRPHandle;
144 *pRPHandle = target.compatibleRenderPassHandle();
145
egdaniel2feb0932016-06-08 06:48:09 -0700146 // This will get us the handle to (and possible create) the compatible set for the specific
147 // GrVkRenderPass we are looking for.
148 this->findCompatibleRenderPass(target, compatibleHandle);
Greg Danield3682112016-10-03 15:06:07 -0400149 return this->findRenderPass(*pRPHandle, colorOps, stencilOps);
egdaniel2feb0932016-06-08 06:48:09 -0700150}
151
152const GrVkRenderPass*
153GrVkResourceProvider::findRenderPass(const CompatibleRPHandle& compatibleHandle,
154 const GrVkRenderPass::LoadStoreOps& colorOps,
egdaniel2feb0932016-06-08 06:48:09 -0700155 const GrVkRenderPass::LoadStoreOps& stencilOps) {
156 SkASSERT(compatibleHandle.isValid() && compatibleHandle.toIndex() < fRenderPassArray.count());
157 CompatibleRenderPassSet& compatibleSet = fRenderPassArray[compatibleHandle.toIndex()];
158 const GrVkRenderPass* renderPass = compatibleSet.getRenderPass(fGpu,
159 colorOps,
egdaniel2feb0932016-06-08 06:48:09 -0700160 stencilOps);
161 renderPass->ref();
162 return renderPass;
163}
164
Greg Daniel164a9f02016-02-22 09:56:40 -0500165GrVkDescriptorPool* GrVkResourceProvider::findOrCreateCompatibleDescriptorPool(
egdanielc2dc1b22016-03-18 13:18:23 -0700166 VkDescriptorType type, uint32_t count) {
167 return new GrVkDescriptorPool(fGpu, type, count);
Greg Daniel164a9f02016-02-22 09:56:40 -0500168}
169
Brian Salomon2bbdcc42017-09-07 12:36:34 -0400170GrVkSampler* GrVkResourceProvider::findOrCreateCompatibleSampler(const GrSamplerState& params,
Greg Danielb280d4e2017-09-01 09:40:30 -0400171 uint32_t maxMipLevel) {
172 GrVkSampler* sampler = fSamplers.find(GrVkSampler::GenerateKey(params, maxMipLevel));
egdaniel8b6394c2016-03-04 07:35:10 -0800173 if (!sampler) {
Greg Danielb280d4e2017-09-01 09:40:30 -0400174 sampler = GrVkSampler::Create(fGpu, params, maxMipLevel);
egdaniel8b6394c2016-03-04 07:35:10 -0800175 fSamplers.add(sampler);
176 }
177 SkASSERT(sampler);
178 sampler->ref();
179 return sampler;
180}
181
Greg Daniel09eeefb2017-10-16 15:15:02 -0400182GrVkPipelineState* GrVkResourceProvider::findOrCreateCompatiblePipelineState(
egdaniel22281c12016-03-23 13:49:40 -0700183 const GrPipeline& pipeline,
184 const GrPrimitiveProcessor& proc,
185 GrPrimitiveType primitiveType,
186 const GrVkRenderPass& renderPass) {
Brian Salomonff168d92018-06-23 15:17:27 -0400187 return fPipelineStateCache->refPipelineState(proc, pipeline, primitiveType, renderPass);
egdaniel22281c12016-03-23 13:49:40 -0700188}
189
Greg Daniela7543782017-05-02 14:01:43 -0400190void GrVkResourceProvider::getSamplerDescriptorSetHandle(VkDescriptorType type,
191 const GrVkUniformHandler& uniformHandler,
egdaniel707bbd62016-07-26 07:19:47 -0700192 GrVkDescriptorSetManager::Handle* handle) {
egdaniela95220d2016-07-21 11:50:37 -0700193 SkASSERT(handle);
Greg Daniela7543782017-05-02 14:01:43 -0400194 SkASSERT(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER == type ||
195 VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER == type);
egdaniela95220d2016-07-21 11:50:37 -0700196 for (int i = 0; i < fDescriptorSetManagers.count(); ++i) {
Greg Daniel18f96022017-05-04 15:09:03 -0400197 if (fDescriptorSetManagers[i]->isCompatible(type, &uniformHandler)) {
egdaniela95220d2016-07-21 11:50:37 -0700198 *handle = GrVkDescriptorSetManager::Handle(i);
199 return;
200 }
201 }
202
Greg Daniel18f96022017-05-04 15:09:03 -0400203 GrVkDescriptorSetManager* dsm = GrVkDescriptorSetManager::CreateSamplerManager(fGpu, type,
204 uniformHandler);
205 fDescriptorSetManagers.emplace_back(dsm);
egdaniela95220d2016-07-21 11:50:37 -0700206 *handle = GrVkDescriptorSetManager::Handle(fDescriptorSetManagers.count() - 1);
207}
208
Greg Daniela7543782017-05-02 14:01:43 -0400209void GrVkResourceProvider::getSamplerDescriptorSetHandle(VkDescriptorType type,
210 const SkTArray<uint32_t>& visibilities,
egdaniel4d866df2016-08-25 13:52:00 -0700211 GrVkDescriptorSetManager::Handle* handle) {
212 SkASSERT(handle);
Greg Daniela7543782017-05-02 14:01:43 -0400213 SkASSERT(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER == type ||
214 VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER == type);
egdaniel4d866df2016-08-25 13:52:00 -0700215 for (int i = 0; i < fDescriptorSetManagers.count(); ++i) {
Greg Daniel18f96022017-05-04 15:09:03 -0400216 if (fDescriptorSetManagers[i]->isCompatible(type, visibilities)) {
egdaniel4d866df2016-08-25 13:52:00 -0700217 *handle = GrVkDescriptorSetManager::Handle(i);
218 return;
219 }
220 }
221
Greg Daniel18f96022017-05-04 15:09:03 -0400222 GrVkDescriptorSetManager* dsm = GrVkDescriptorSetManager::CreateSamplerManager(fGpu, type,
223 visibilities);
224 fDescriptorSetManagers.emplace_back(dsm);
egdaniel4d866df2016-08-25 13:52:00 -0700225 *handle = GrVkDescriptorSetManager::Handle(fDescriptorSetManagers.count() - 1);
226}
227
egdaniel707bbd62016-07-26 07:19:47 -0700228VkDescriptorSetLayout GrVkResourceProvider::getUniformDSLayout() const {
229 SkASSERT(fUniformDSHandle.isValid());
Greg Daniel18f96022017-05-04 15:09:03 -0400230 return fDescriptorSetManagers[fUniformDSHandle.toIndex()]->layout();
egdaniel707bbd62016-07-26 07:19:47 -0700231}
232
233VkDescriptorSetLayout GrVkResourceProvider::getSamplerDSLayout(
234 const GrVkDescriptorSetManager::Handle& handle) const {
235 SkASSERT(handle.isValid());
Greg Daniel18f96022017-05-04 15:09:03 -0400236 return fDescriptorSetManagers[handle.toIndex()]->layout();
egdaniel707bbd62016-07-26 07:19:47 -0700237}
238
egdaniela95220d2016-07-21 11:50:37 -0700239const GrVkDescriptorSet* GrVkResourceProvider::getUniformDescriptorSet() {
240 SkASSERT(fUniformDSHandle.isValid());
Greg Daniel18f96022017-05-04 15:09:03 -0400241 return fDescriptorSetManagers[fUniformDSHandle.toIndex()]->getDescriptorSet(fGpu,
242 fUniformDSHandle);
egdaniela95220d2016-07-21 11:50:37 -0700243}
244
egdaniel707bbd62016-07-26 07:19:47 -0700245const GrVkDescriptorSet* GrVkResourceProvider::getSamplerDescriptorSet(
246 const GrVkDescriptorSetManager::Handle& handle) {
247 SkASSERT(handle.isValid());
Greg Daniel18f96022017-05-04 15:09:03 -0400248 return fDescriptorSetManagers[handle.toIndex()]->getDescriptorSet(fGpu, handle);
egdaniel707bbd62016-07-26 07:19:47 -0700249}
egdaniela95220d2016-07-21 11:50:37 -0700250
251void GrVkResourceProvider::recycleDescriptorSet(const GrVkDescriptorSet* descSet,
252 const GrVkDescriptorSetManager::Handle& handle) {
253 SkASSERT(descSet);
254 SkASSERT(handle.isValid());
255 int managerIdx = handle.toIndex();
256 SkASSERT(managerIdx < fDescriptorSetManagers.count());
Greg Daniel18f96022017-05-04 15:09:03 -0400257 fDescriptorSetManagers[managerIdx]->recycleDescriptorSet(descSet);
egdaniel778555c2016-05-02 06:50:36 -0700258}
259
jvanverth7ec92412016-07-06 09:24:57 -0700260GrVkPrimaryCommandBuffer* GrVkResourceProvider::findOrCreatePrimaryCommandBuffer() {
261 GrVkPrimaryCommandBuffer* cmdBuffer = nullptr;
262 int count = fAvailableCommandBuffers.count();
263 if (count > 0) {
egdaniela95220d2016-07-21 11:50:37 -0700264 cmdBuffer = fAvailableCommandBuffers[count - 1];
jvanverth7ec92412016-07-06 09:24:57 -0700265 SkASSERT(cmdBuffer->finished(fGpu));
266 fAvailableCommandBuffers.removeShuffle(count - 1);
267 } else {
268 cmdBuffer = GrVkPrimaryCommandBuffer::Create(fGpu, fGpu->cmdPool());
269 }
Greg Daniel164a9f02016-02-22 09:56:40 -0500270 fActiveCommandBuffers.push_back(cmdBuffer);
271 cmdBuffer->ref();
272 return cmdBuffer;
273}
274
275void GrVkResourceProvider::checkCommandBuffers() {
276 for (int i = fActiveCommandBuffers.count()-1; i >= 0; --i) {
277 if (fActiveCommandBuffers[i]->finished(fGpu)) {
jvanverth7ec92412016-07-06 09:24:57 -0700278 GrVkPrimaryCommandBuffer* cmdBuffer = fActiveCommandBuffers[i];
279 cmdBuffer->reset(fGpu);
280 fAvailableCommandBuffers.push_back(cmdBuffer);
Greg Daniel164a9f02016-02-22 09:56:40 -0500281 fActiveCommandBuffers.removeShuffle(i);
282 }
283 }
284}
285
jvanverth7ec92412016-07-06 09:24:57 -0700286GrVkSecondaryCommandBuffer* GrVkResourceProvider::findOrCreateSecondaryCommandBuffer() {
287 GrVkSecondaryCommandBuffer* cmdBuffer = nullptr;
288 int count = fAvailableSecondaryCommandBuffers.count();
289 if (count > 0) {
290 cmdBuffer = fAvailableSecondaryCommandBuffers[count-1];
291 fAvailableSecondaryCommandBuffers.removeShuffle(count - 1);
292 } else {
293 cmdBuffer = GrVkSecondaryCommandBuffer::Create(fGpu, fGpu->cmdPool());
294 }
295 return cmdBuffer;
296}
297
298void GrVkResourceProvider::recycleSecondaryCommandBuffer(GrVkSecondaryCommandBuffer* cb) {
299 cb->reset(fGpu);
300 fAvailableSecondaryCommandBuffers.push_back(cb);
301}
302
jvanverth4c6e47a2016-07-22 10:34:52 -0700303const GrVkResource* GrVkResourceProvider::findOrCreateStandardUniformBufferResource() {
304 const GrVkResource* resource = nullptr;
305 int count = fAvailableUniformBufferResources.count();
306 if (count > 0) {
307 resource = fAvailableUniformBufferResources[count - 1];
308 fAvailableUniformBufferResources.removeShuffle(count - 1);
309 } else {
310 resource = GrVkUniformBuffer::CreateResource(fGpu, GrVkUniformBuffer::kStandardSize);
311 }
312 return resource;
313}
314
315void GrVkResourceProvider::recycleStandardUniformBufferResource(const GrVkResource* resource) {
316 fAvailableUniformBufferResources.push_back(resource);
317}
318
Jim Van Verth09557d72016-11-07 11:10:21 -0500319void GrVkResourceProvider::destroyResources(bool deviceLost) {
jvanverth7ec92412016-07-06 09:24:57 -0700320 // release our active command buffers
Greg Daniel164a9f02016-02-22 09:56:40 -0500321 for (int i = 0; i < fActiveCommandBuffers.count(); ++i) {
Jim Van Verth09557d72016-11-07 11:10:21 -0500322 SkASSERT(deviceLost || fActiveCommandBuffers[i]->finished(fGpu));
Greg Daniel164a9f02016-02-22 09:56:40 -0500323 SkASSERT(fActiveCommandBuffers[i]->unique());
jvanverth069c4642016-07-06 12:56:11 -0700324 fActiveCommandBuffers[i]->reset(fGpu);
Greg Daniel164a9f02016-02-22 09:56:40 -0500325 fActiveCommandBuffers[i]->unref(fGpu);
326 }
327 fActiveCommandBuffers.reset();
jvanverth7ec92412016-07-06 09:24:57 -0700328 // release our available command buffers
329 for (int i = 0; i < fAvailableCommandBuffers.count(); ++i) {
Jim Van Verth09557d72016-11-07 11:10:21 -0500330 SkASSERT(deviceLost || fAvailableCommandBuffers[i]->finished(fGpu));
jvanverth7ec92412016-07-06 09:24:57 -0700331 SkASSERT(fAvailableCommandBuffers[i]->unique());
332 fAvailableCommandBuffers[i]->unref(fGpu);
333 }
334 fAvailableCommandBuffers.reset();
335
336 // release our available secondary command buffers
337 for (int i = 0; i < fAvailableSecondaryCommandBuffers.count(); ++i) {
338 SkASSERT(fAvailableSecondaryCommandBuffers[i]->unique());
339 fAvailableSecondaryCommandBuffers[i]->unref(fGpu);
340 }
341 fAvailableSecondaryCommandBuffers.reset();
Greg Daniel164a9f02016-02-22 09:56:40 -0500342
egdanielbc9b2962016-09-27 08:00:53 -0700343 // Release all copy pipelines
344 for (int i = 0; i < fCopyPipelines.count(); ++i) {
345 fCopyPipelines[i]->unref(fGpu);
346 }
347
egdanield62e28b2016-06-07 08:43:30 -0700348 // loop over all render pass sets to make sure we destroy all the internal VkRenderPasses
349 for (int i = 0; i < fRenderPassArray.count(); ++i) {
350 fRenderPassArray[i].releaseResources(fGpu);
Greg Daniel164a9f02016-02-22 09:56:40 -0500351 }
egdanield62e28b2016-06-07 08:43:30 -0700352 fRenderPassArray.reset();
Greg Daniel164a9f02016-02-22 09:56:40 -0500353
egdaniel8b6394c2016-03-04 07:35:10 -0800354 // Iterate through all store GrVkSamplers and unref them before resetting the hash.
jvanverth62340062016-04-26 08:01:44 -0700355 SkTDynamicHash<GrVkSampler, uint16_t>::Iter iter(&fSamplers);
egdaniel8b6394c2016-03-04 07:35:10 -0800356 for (; !iter.done(); ++iter) {
357 (*iter).unref(fGpu);
358 }
359 fSamplers.reset();
360
egdaniel22281c12016-03-23 13:49:40 -0700361 fPipelineStateCache->release();
362
jvanverth03509ea2016-03-02 13:19:47 -0800363 GR_VK_CALL(fGpu->vkInterface(), DestroyPipelineCache(fGpu->device(), fPipelineCache, nullptr));
364 fPipelineCache = VK_NULL_HANDLE;
egdaniel778555c2016-05-02 06:50:36 -0700365
egdaniela95220d2016-07-21 11:50:37 -0700366 // We must release/destroy all command buffers and pipeline states before releasing the
367 // GrVkDescriptorSetManagers
368 for (int i = 0; i < fDescriptorSetManagers.count(); ++i) {
Greg Daniel18f96022017-05-04 15:09:03 -0400369 fDescriptorSetManagers[i]->release(fGpu);
egdaniela95220d2016-07-21 11:50:37 -0700370 }
371 fDescriptorSetManagers.reset();
jvanverth4c6e47a2016-07-22 10:34:52 -0700372
373 // release our uniform buffers
374 for (int i = 0; i < fAvailableUniformBufferResources.count(); ++i) {
375 SkASSERT(fAvailableUniformBufferResources[i]->unique());
376 fAvailableUniformBufferResources[i]->unref(fGpu);
377 }
378 fAvailableUniformBufferResources.reset();
Greg Daniel164a9f02016-02-22 09:56:40 -0500379}
380
381void GrVkResourceProvider::abandonResources() {
jvanverth7ec92412016-07-06 09:24:57 -0700382 // release our active command buffers
Greg Daniel164a9f02016-02-22 09:56:40 -0500383 for (int i = 0; i < fActiveCommandBuffers.count(); ++i) {
384 SkASSERT(fActiveCommandBuffers[i]->finished(fGpu));
jvanverth7ec92412016-07-06 09:24:57 -0700385 SkASSERT(fActiveCommandBuffers[i]->unique());
Greg Daniel164a9f02016-02-22 09:56:40 -0500386 fActiveCommandBuffers[i]->unrefAndAbandon();
387 }
388 fActiveCommandBuffers.reset();
jvanverth7ec92412016-07-06 09:24:57 -0700389 // release our available command buffers
390 for (int i = 0; i < fAvailableCommandBuffers.count(); ++i) {
391 SkASSERT(fAvailableCommandBuffers[i]->finished(fGpu));
392 SkASSERT(fAvailableCommandBuffers[i]->unique());
393 fAvailableCommandBuffers[i]->unrefAndAbandon();
394 }
395 fAvailableCommandBuffers.reset();
396
397 // release our available secondary command buffers
398 for (int i = 0; i < fAvailableSecondaryCommandBuffers.count(); ++i) {
399 SkASSERT(fAvailableSecondaryCommandBuffers[i]->unique());
400 fAvailableSecondaryCommandBuffers[i]->unrefAndAbandon();
401 }
402 fAvailableSecondaryCommandBuffers.reset();
Greg Daniel164a9f02016-02-22 09:56:40 -0500403
egdanielbc9b2962016-09-27 08:00:53 -0700404 // Abandon all copy pipelines
405 for (int i = 0; i < fCopyPipelines.count(); ++i) {
406 fCopyPipelines[i]->unrefAndAbandon();
407 }
408
egdanield62e28b2016-06-07 08:43:30 -0700409 // loop over all render pass sets to make sure we destroy all the internal VkRenderPasses
410 for (int i = 0; i < fRenderPassArray.count(); ++i) {
411 fRenderPassArray[i].abandonResources();
Greg Daniel164a9f02016-02-22 09:56:40 -0500412 }
egdanield62e28b2016-06-07 08:43:30 -0700413 fRenderPassArray.reset();
Greg Daniel164a9f02016-02-22 09:56:40 -0500414
egdaniel8b6394c2016-03-04 07:35:10 -0800415 // Iterate through all store GrVkSamplers and unrefAndAbandon them before resetting the hash.
jvanverth62340062016-04-26 08:01:44 -0700416 SkTDynamicHash<GrVkSampler, uint16_t>::Iter iter(&fSamplers);
egdaniel8b6394c2016-03-04 07:35:10 -0800417 for (; !iter.done(); ++iter) {
418 (*iter).unrefAndAbandon();
419 }
420 fSamplers.reset();
421
egdaniel22281c12016-03-23 13:49:40 -0700422 fPipelineStateCache->abandon();
423
jvanverth03509ea2016-03-02 13:19:47 -0800424 fPipelineCache = VK_NULL_HANDLE;
egdaniel778555c2016-05-02 06:50:36 -0700425
egdaniela95220d2016-07-21 11:50:37 -0700426 // We must abandon all command buffers and pipeline states before abandoning the
427 // GrVkDescriptorSetManagers
428 for (int i = 0; i < fDescriptorSetManagers.count(); ++i) {
Greg Daniel18f96022017-05-04 15:09:03 -0400429 fDescriptorSetManagers[i]->abandon();
egdaniela95220d2016-07-21 11:50:37 -0700430 }
431 fDescriptorSetManagers.reset();
432
jvanverth4c6e47a2016-07-22 10:34:52 -0700433 // release our uniform buffers
434 for (int i = 0; i < fAvailableUniformBufferResources.count(); ++i) {
435 SkASSERT(fAvailableUniformBufferResources[i]->unique());
436 fAvailableUniformBufferResources[i]->unrefAndAbandon();
437 }
438 fAvailableUniformBufferResources.reset();
jvanverth03509ea2016-03-02 13:19:47 -0800439}
egdanield62e28b2016-06-07 08:43:30 -0700440
441////////////////////////////////////////////////////////////////////////////////
442
443GrVkResourceProvider::CompatibleRenderPassSet::CompatibleRenderPassSet(
444 const GrVkGpu* gpu,
445 const GrVkRenderTarget& target)
446 : fLastReturnedIndex(0) {
447 fRenderPasses.emplace_back(new GrVkRenderPass());
448 fRenderPasses[0]->initSimple(gpu, target);
449}
450
451bool GrVkResourceProvider::CompatibleRenderPassSet::isCompatible(
452 const GrVkRenderTarget& target) const {
453 // The first GrVkRenderpass should always exists since we create the basic load store
454 // render pass on create
455 SkASSERT(fRenderPasses[0]);
456 return fRenderPasses[0]->isCompatible(target);
457}
458
egdaniel2feb0932016-06-08 06:48:09 -0700459GrVkRenderPass* GrVkResourceProvider::CompatibleRenderPassSet::getRenderPass(
460 const GrVkGpu* gpu,
461 const GrVkRenderPass::LoadStoreOps& colorOps,
egdaniel2feb0932016-06-08 06:48:09 -0700462 const GrVkRenderPass::LoadStoreOps& stencilOps) {
463 for (int i = 0; i < fRenderPasses.count(); ++i) {
464 int idx = (i + fLastReturnedIndex) % fRenderPasses.count();
egdanielce3bfb12016-08-26 11:05:13 -0700465 if (fRenderPasses[idx]->equalLoadStoreOps(colorOps, stencilOps)) {
egdaniel2feb0932016-06-08 06:48:09 -0700466 fLastReturnedIndex = idx;
467 return fRenderPasses[idx];
468 }
469 }
egdaniel9cb63402016-06-23 08:37:05 -0700470 GrVkRenderPass* renderPass = fRenderPasses.emplace_back(new GrVkRenderPass());
egdanielce3bfb12016-08-26 11:05:13 -0700471 renderPass->init(gpu, *this->getCompatibleRenderPass(), colorOps, stencilOps);
egdaniel2feb0932016-06-08 06:48:09 -0700472 fLastReturnedIndex = fRenderPasses.count() - 1;
473 return renderPass;
474}
475
egdanield62e28b2016-06-07 08:43:30 -0700476void GrVkResourceProvider::CompatibleRenderPassSet::releaseResources(const GrVkGpu* gpu) {
477 for (int i = 0; i < fRenderPasses.count(); ++i) {
478 if (fRenderPasses[i]) {
479 fRenderPasses[i]->unref(gpu);
480 fRenderPasses[i] = nullptr;
481 }
482 }
483}
484
485void GrVkResourceProvider::CompatibleRenderPassSet::abandonResources() {
486 for (int i = 0; i < fRenderPasses.count(); ++i) {
487 if (fRenderPasses[i]) {
488 fRenderPasses[i]->unrefAndAbandon();
489 fRenderPasses[i] = nullptr;
490 }
491 }
492}