Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(81)

Side by Side Diff: src/gpu/vk/GrVkResourceProvider.cpp

Issue 2163673002: Setup system in Vulkan to reuse VkDescriptorSet allocations. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: nit Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/gpu/vk/GrVkResourceProvider.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2016 Google Inc. 2 * Copyright 2016 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "GrVkResourceProvider.h" 8 #include "GrVkResourceProvider.h"
9 9
10 #include "GrTextureParams.h" 10 #include "GrTextureParams.h"
11 #include "GrVkCommandBuffer.h" 11 #include "GrVkCommandBuffer.h"
12 #include "GrVkPipeline.h" 12 #include "GrVkPipeline.h"
13 #include "GrVkRenderTarget.h" 13 #include "GrVkRenderTarget.h"
14 #include "GrVkSampler.h" 14 #include "GrVkSampler.h"
15 #include "GrVkUtil.h" 15 #include "GrVkUtil.h"
16 16
17 #ifdef SK_TRACE_VK_RESOURCES 17 #ifdef SK_TRACE_VK_RESOURCES
18 GrVkResource::Trace GrVkResource::fTrace; 18 GrVkResource::Trace GrVkResource::fTrace;
19 uint32_t GrVkResource::fKeyCounter = 0; 19 uint32_t GrVkResource::fKeyCounter = 0;
20 #endif 20 #endif
21 21
22 GrVkResourceProvider::GrVkResourceProvider(GrVkGpu* gpu) 22 GrVkResourceProvider::GrVkResourceProvider(GrVkGpu* gpu)
23 : fGpu(gpu) 23 : fGpu(gpu)
24 , fPipelineCache(VK_NULL_HANDLE) 24 , fPipelineCache(VK_NULL_HANDLE)
25 , fUniformDescPool(nullptr)
26 , fCurrentUniformDescCount(0) { 25 , fCurrentUniformDescCount(0) {
27 fPipelineStateCache = new PipelineStateCache(gpu); 26 fPipelineStateCache = new PipelineStateCache(gpu);
28 } 27 }
29 28
30 GrVkResourceProvider::~GrVkResourceProvider() { 29 GrVkResourceProvider::~GrVkResourceProvider() {
31 SkASSERT(0 == fRenderPassArray.count()); 30 SkASSERT(0 == fRenderPassArray.count());
32 SkASSERT(VK_NULL_HANDLE == fPipelineCache); 31 SkASSERT(VK_NULL_HANDLE == fPipelineCache);
33 delete fPipelineStateCache; 32 delete fPipelineStateCache;
34 } 33 }
35 34
(...skipping 18 matching lines...) Expand all
54 dsUniformLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CR EATE_INFO; 53 dsUniformLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CR EATE_INFO;
55 dsUniformLayoutCreateInfo.pNext = nullptr; 54 dsUniformLayoutCreateInfo.pNext = nullptr;
56 dsUniformLayoutCreateInfo.flags = 0; 55 dsUniformLayoutCreateInfo.flags = 0;
57 dsUniformLayoutCreateInfo.bindingCount = 2; 56 dsUniformLayoutCreateInfo.bindingCount = 2;
58 dsUniformLayoutCreateInfo.pBindings = dsUniBindings; 57 dsUniformLayoutCreateInfo.pBindings = dsUniBindings;
59 58
60 GR_VK_CALL_ERRCHECK(fGpu->vkInterface(), CreateDescriptorSetLayout(fGpu->dev ice(), 59 GR_VK_CALL_ERRCHECK(fGpu->vkInterface(), CreateDescriptorSetLayout(fGpu->dev ice(),
61 &dsUnifor mLayoutCreateInfo, 60 &dsUnifor mLayoutCreateInfo,
62 nullptr, 61 nullptr,
63 &fUniform DescLayout)); 62 &fUniform DescLayout));
64 fCurrMaxUniDescriptors = kStartNumUniformDescriptors; 63
65 fUniformDescPool = this->findOrCreateCompatibleDescriptorPool(VK_DESCRIPTOR_ TYPE_UNIFORM_BUFFER, 64 this->getDescSetHandle(0, fUniformDescLayout, &fUniformDSHandle);
66 fCurrMaxUniDes criptors);
67 } 65 }
68 66
69 void GrVkResourceProvider::init() { 67 void GrVkResourceProvider::init() {
70 VkPipelineCacheCreateInfo createInfo; 68 VkPipelineCacheCreateInfo createInfo;
71 memset(&createInfo, 0, sizeof(VkPipelineCacheCreateInfo)); 69 memset(&createInfo, 0, sizeof(VkPipelineCacheCreateInfo));
72 createInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO; 70 createInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
73 createInfo.pNext = nullptr; 71 createInfo.pNext = nullptr;
74 createInfo.flags = 0; 72 createInfo.flags = 0;
75 createInfo.initialDataSize = 0; 73 createInfo.initialDataSize = 0;
76 createInfo.pInitialData = nullptr; 74 createInfo.pInitialData = nullptr;
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 } 182 }
185 183
186 sk_sp<GrVkPipelineState> GrVkResourceProvider::findOrCreateCompatiblePipelineSta te( 184 sk_sp<GrVkPipelineState> GrVkResourceProvider::findOrCreateCompatiblePipelineSta te(
187 const GrPipelin e& pipeline, 185 const GrPipelin e& pipeline,
188 const GrPrimiti veProcessor& proc, 186 const GrPrimiti veProcessor& proc,
189 GrPrimitiveType primitiveType, 187 GrPrimitiveType primitiveType,
190 const GrVkRende rPass& renderPass) { 188 const GrVkRende rPass& renderPass) {
191 return fPipelineStateCache->refPipelineState(pipeline, proc, primitiveType, renderPass); 189 return fPipelineStateCache->refPipelineState(pipeline, proc, primitiveType, renderPass);
192 } 190 }
193 191
194 void GrVkResourceProvider::getUniformDescriptorSet(VkDescriptorSet* ds, 192
195 const GrVkDescriptorPool** ou tPool) { 193 void GrVkResourceProvider::getDescSetHandle(uint32_t numSamplers, VkDescriptorSe tLayout layout,
196 fCurrentUniformDescCount += kNumUniformDescPerSet; 194 GrVkDescriptorSetManager::Handle* ha ndle) {
197 if (fCurrentUniformDescCount > fCurrMaxUniDescriptors) { 195 SkASSERT(handle);
198 fUniformDescPool->unref(fGpu); 196 for (int i = 0; i < fDescriptorSetManagers.count(); ++i) {
199 uint32_t newPoolSize = fCurrMaxUniDescriptors + ((fCurrMaxUniDescriptors + 1) >> 1); 197 if (fDescriptorSetManagers[i].isCompatible(numSamplers)) {
200 if (newPoolSize < kMaxUniformDescriptors) { 198 *handle = GrVkDescriptorSetManager::Handle(i);
201 fCurrMaxUniDescriptors = newPoolSize; 199 return;
202 } else {
203 fCurrMaxUniDescriptors = kMaxUniformDescriptors;
204 } 200 }
205 fUniformDescPool =
206 this->findOrCreateCompatibleDescriptorPool(VK_DESCRIPTOR_TYPE_UNIFOR M_BUFFER,
207 fCurrMaxUniDescriptors);
208 fCurrentUniformDescCount = kNumUniformDescPerSet;
209 } 201 }
210 SkASSERT(fUniformDescPool);
211 202
212 VkDescriptorSetAllocateInfo dsAllocateInfo; 203 // Failed to find a DescSetManager, we must create a new one;
213 memset(&dsAllocateInfo, 0, sizeof(VkDescriptorSetAllocateInfo)); 204 VkDescriptorType type = numSamplers ? VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMP LER
214 dsAllocateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; 205 : VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
215 dsAllocateInfo.pNext = nullptr; 206
216 dsAllocateInfo.descriptorPool = fUniformDescPool->descPool(); 207 fDescriptorSetManagers.emplace_back(fGpu, layout, type, numSamplers);
217 dsAllocateInfo.descriptorSetCount = 1; 208 *handle = GrVkDescriptorSetManager::Handle(fDescriptorSetManagers.count() - 1);
218 dsAllocateInfo.pSetLayouts = &fUniformDescLayout; 209 }
219 GR_VK_CALL_ERRCHECK(fGpu->vkInterface(), AllocateDescriptorSets(fGpu->device (), 210
220 &dsAllocateI nfo, 211 const GrVkDescriptorSet* GrVkResourceProvider::getUniformDescriptorSet() {
221 ds)); 212 SkASSERT(fUniformDSHandle.isValid());
222 *outPool = fUniformDescPool; 213 return fDescriptorSetManagers[fUniformDSHandle.toIndex()].getDescriptorSet(f Gpu,
214 f UniformDSHandle);
215 }
216
217
218 void GrVkResourceProvider::recycleDescriptorSet(const GrVkDescriptorSet* descSet ,
219 const GrVkDescriptorSetManager:: Handle& handle) {
220 SkASSERT(descSet);
221 SkASSERT(handle.isValid());
222 int managerIdx = handle.toIndex();
223 SkASSERT(managerIdx < fDescriptorSetManagers.count());
224 fDescriptorSetManagers[managerIdx].recycleDescriptorSet(descSet);
223 } 225 }
224 226
225 GrVkPrimaryCommandBuffer* GrVkResourceProvider::findOrCreatePrimaryCommandBuffer () { 227 GrVkPrimaryCommandBuffer* GrVkResourceProvider::findOrCreatePrimaryCommandBuffer () {
226 GrVkPrimaryCommandBuffer* cmdBuffer = nullptr; 228 GrVkPrimaryCommandBuffer* cmdBuffer = nullptr;
227 int count = fAvailableCommandBuffers.count(); 229 int count = fAvailableCommandBuffers.count();
228 if (count > 0) { 230 if (count > 0) {
229 cmdBuffer = fAvailableCommandBuffers[count -1]; 231 cmdBuffer = fAvailableCommandBuffers[count - 1];
230 SkASSERT(cmdBuffer->finished(fGpu)); 232 SkASSERT(cmdBuffer->finished(fGpu));
231 fAvailableCommandBuffers.removeShuffle(count - 1); 233 fAvailableCommandBuffers.removeShuffle(count - 1);
232 } else { 234 } else {
233 cmdBuffer = GrVkPrimaryCommandBuffer::Create(fGpu, fGpu->cmdPool()); 235 cmdBuffer = GrVkPrimaryCommandBuffer::Create(fGpu, fGpu->cmdPool());
234 } 236 }
235 fActiveCommandBuffers.push_back(cmdBuffer); 237 fActiveCommandBuffers.push_back(cmdBuffer);
236 cmdBuffer->ref(); 238 cmdBuffer->ref();
237 return cmdBuffer; 239 return cmdBuffer;
238 } 240 }
239 241
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
306 308
307 GR_VK_CALL(fGpu->vkInterface(), DestroyPipelineCache(fGpu->device(), fPipeli neCache, nullptr)); 309 GR_VK_CALL(fGpu->vkInterface(), DestroyPipelineCache(fGpu->device(), fPipeli neCache, nullptr));
308 fPipelineCache = VK_NULL_HANDLE; 310 fPipelineCache = VK_NULL_HANDLE;
309 311
310 if (fUniformDescLayout) { 312 if (fUniformDescLayout) {
311 GR_VK_CALL(fGpu->vkInterface(), DestroyDescriptorSetLayout(fGpu->device( ), 313 GR_VK_CALL(fGpu->vkInterface(), DestroyDescriptorSetLayout(fGpu->device( ),
312 fUniformDescL ayout, 314 fUniformDescL ayout,
313 nullptr)); 315 nullptr));
314 fUniformDescLayout = VK_NULL_HANDLE; 316 fUniformDescLayout = VK_NULL_HANDLE;
315 } 317 }
316 fUniformDescPool->unref(fGpu); 318
319 // We must release/destroy all command buffers and pipeline states before re leasing the
320 // GrVkDescriptorSetManagers
321 for (int i = 0; i < fDescriptorSetManagers.count(); ++i) {
322 fDescriptorSetManagers[i].release(fGpu);
323 }
324 fDescriptorSetManagers.reset();
317 } 325 }
318 326
319 void GrVkResourceProvider::abandonResources() { 327 void GrVkResourceProvider::abandonResources() {
320 // release our active command buffers 328 // release our active command buffers
321 for (int i = 0; i < fActiveCommandBuffers.count(); ++i) { 329 for (int i = 0; i < fActiveCommandBuffers.count(); ++i) {
322 SkASSERT(fActiveCommandBuffers[i]->finished(fGpu)); 330 SkASSERT(fActiveCommandBuffers[i]->finished(fGpu));
323 SkASSERT(fActiveCommandBuffers[i]->unique()); 331 SkASSERT(fActiveCommandBuffers[i]->unique());
324 fActiveCommandBuffers[i]->unrefAndAbandon(); 332 fActiveCommandBuffers[i]->unrefAndAbandon();
325 } 333 }
326 fActiveCommandBuffers.reset(); 334 fActiveCommandBuffers.reset();
(...skipping 22 matching lines...) Expand all
349 SkTDynamicHash<GrVkSampler, uint16_t>::Iter iter(&fSamplers); 357 SkTDynamicHash<GrVkSampler, uint16_t>::Iter iter(&fSamplers);
350 for (; !iter.done(); ++iter) { 358 for (; !iter.done(); ++iter) {
351 (*iter).unrefAndAbandon(); 359 (*iter).unrefAndAbandon();
352 } 360 }
353 fSamplers.reset(); 361 fSamplers.reset();
354 362
355 fPipelineStateCache->abandon(); 363 fPipelineStateCache->abandon();
356 364
357 fPipelineCache = VK_NULL_HANDLE; 365 fPipelineCache = VK_NULL_HANDLE;
358 366
359 fUniformDescLayout = VK_NULL_HANDLE; 367 // We must abandon all command buffers and pipeline states before abandoning the
360 fUniformDescPool->unrefAndAbandon(); 368 // GrVkDescriptorSetManagers
369 for (int i = 0; i < fDescriptorSetManagers.count(); ++i) {
370 fDescriptorSetManagers[i].abandon();
371 }
372 fDescriptorSetManagers.reset();
373
361 } 374 }
362 375
363 //////////////////////////////////////////////////////////////////////////////// 376 ////////////////////////////////////////////////////////////////////////////////
364 377
365 GrVkResourceProvider::CompatibleRenderPassSet::CompatibleRenderPassSet( 378 GrVkResourceProvider::CompatibleRenderPassSet::CompatibleRenderPassSet(
366 const GrVkG pu* gpu, 379 const GrVkG pu* gpu,
367 const GrVkR enderTarget& target) 380 const GrVkR enderTarget& target)
368 : fLastReturnedIndex(0) { 381 : fLastReturnedIndex(0) {
369 fRenderPasses.emplace_back(new GrVkRenderPass()); 382 fRenderPasses.emplace_back(new GrVkRenderPass());
370 fRenderPasses[0]->initSimple(gpu, target); 383 fRenderPasses[0]->initSimple(gpu, target);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
406 } 419 }
407 420
408 void GrVkResourceProvider::CompatibleRenderPassSet::abandonResources() { 421 void GrVkResourceProvider::CompatibleRenderPassSet::abandonResources() {
409 for (int i = 0; i < fRenderPasses.count(); ++i) { 422 for (int i = 0; i < fRenderPasses.count(); ++i) {
410 if (fRenderPasses[i]) { 423 if (fRenderPasses[i]) {
411 fRenderPasses[i]->unrefAndAbandon(); 424 fRenderPasses[i]->unrefAndAbandon();
412 fRenderPasses[i] = nullptr; 425 fRenderPasses[i] = nullptr;
413 } 426 }
414 } 427 }
415 } 428 }
OLDNEW
« no previous file with comments | « src/gpu/vk/GrVkResourceProvider.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698