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

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

Issue 2172873003: Reuse sampler descriptor set allocations in Vulkan (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: nits Created 4 years, 4 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') | src/gpu/vk/GrVkUniformHandler.h » ('j') | 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 "GrVkGLSLSampler.h"
12 #include "GrVkPipeline.h" 13 #include "GrVkPipeline.h"
13 #include "GrVkRenderTarget.h" 14 #include "GrVkRenderTarget.h"
14 #include "GrVkSampler.h" 15 #include "GrVkSampler.h"
15 #include "GrVkUniformBuffer.h" 16 #include "GrVkUniformBuffer.h"
16 #include "GrVkUtil.h" 17 #include "GrVkUtil.h"
17 18
18 #ifdef SK_TRACE_VK_RESOURCES 19 #ifdef SK_TRACE_VK_RESOURCES
19 GrVkResource::Trace GrVkResource::fTrace; 20 GrVkResource::Trace GrVkResource::fTrace;
20 uint32_t GrVkResource::fKeyCounter = 0; 21 uint32_t GrVkResource::fKeyCounter = 0;
21 #endif 22 #endif
22 23
23 GrVkResourceProvider::GrVkResourceProvider(GrVkGpu* gpu) 24 GrVkResourceProvider::GrVkResourceProvider(GrVkGpu* gpu)
24 : fGpu(gpu) 25 : fGpu(gpu)
25 , fPipelineCache(VK_NULL_HANDLE) 26 , fPipelineCache(VK_NULL_HANDLE) {
26 , fCurrentUniformDescCount(0) {
27 fPipelineStateCache = new PipelineStateCache(gpu); 27 fPipelineStateCache = new PipelineStateCache(gpu);
28 } 28 }
29 29
30 GrVkResourceProvider::~GrVkResourceProvider() { 30 GrVkResourceProvider::~GrVkResourceProvider() {
31 SkASSERT(0 == fRenderPassArray.count()); 31 SkASSERT(0 == fRenderPassArray.count());
32 SkASSERT(VK_NULL_HANDLE == fPipelineCache); 32 SkASSERT(VK_NULL_HANDLE == fPipelineCache);
33 delete fPipelineStateCache; 33 delete fPipelineStateCache;
34 } 34 }
35 35
36 void GrVkResourceProvider::initUniformDescObjects() {
37 // Create Uniform Buffer Descriptor
38 // The vertex uniform buffer will have binding 0 and the fragment binding 1.
39 VkDescriptorSetLayoutBinding dsUniBindings[2];
40 memset(&dsUniBindings, 0, 2 * sizeof(VkDescriptorSetLayoutBinding));
41 dsUniBindings[0].binding = GrVkUniformHandler::kVertexBinding;
42 dsUniBindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
43 dsUniBindings[0].descriptorCount = 1;
44 dsUniBindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
45 dsUniBindings[0].pImmutableSamplers = nullptr;
46 dsUniBindings[1].binding = GrVkUniformHandler::kFragBinding;
47 dsUniBindings[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
48 dsUniBindings[1].descriptorCount = 1;
49 dsUniBindings[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
50 dsUniBindings[1].pImmutableSamplers = nullptr;
51
52 VkDescriptorSetLayoutCreateInfo dsUniformLayoutCreateInfo;
53 memset(&dsUniformLayoutCreateInfo, 0, sizeof(VkDescriptorSetLayoutCreateInfo ));
54 dsUniformLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CR EATE_INFO;
55 dsUniformLayoutCreateInfo.pNext = nullptr;
56 dsUniformLayoutCreateInfo.flags = 0;
57 dsUniformLayoutCreateInfo.bindingCount = 2;
58 dsUniformLayoutCreateInfo.pBindings = dsUniBindings;
59
60 GR_VK_CALL_ERRCHECK(fGpu->vkInterface(), CreateDescriptorSetLayout(fGpu->dev ice(),
61 &dsUnifor mLayoutCreateInfo,
62 nullptr,
63 &fUniform DescLayout));
64
65 this->getDescSetHandle(0, fUniformDescLayout, &fUniformDSHandle);
66 }
67
68 void GrVkResourceProvider::init() { 36 void GrVkResourceProvider::init() {
69 VkPipelineCacheCreateInfo createInfo; 37 VkPipelineCacheCreateInfo createInfo;
70 memset(&createInfo, 0, sizeof(VkPipelineCacheCreateInfo)); 38 memset(&createInfo, 0, sizeof(VkPipelineCacheCreateInfo));
71 createInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO; 39 createInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
72 createInfo.pNext = nullptr; 40 createInfo.pNext = nullptr;
73 createInfo.flags = 0; 41 createInfo.flags = 0;
74 createInfo.initialDataSize = 0; 42 createInfo.initialDataSize = 0;
75 createInfo.pInitialData = nullptr; 43 createInfo.pInitialData = nullptr;
76 VkResult result = GR_VK_CALL(fGpu->vkInterface(), 44 VkResult result = GR_VK_CALL(fGpu->vkInterface(),
77 CreatePipelineCache(fGpu->device(), &createInfo , nullptr, 45 CreatePipelineCache(fGpu->device(), &createInfo , nullptr,
78 &fPipelineCache)); 46 &fPipelineCache));
79 SkASSERT(VK_SUCCESS == result); 47 SkASSERT(VK_SUCCESS == result);
80 if (VK_SUCCESS != result) { 48 if (VK_SUCCESS != result) {
81 fPipelineCache = VK_NULL_HANDLE; 49 fPipelineCache = VK_NULL_HANDLE;
82 } 50 }
83 51
84 this->initUniformDescObjects(); 52 // Init uniform descriptor objects
53 fDescriptorSetManagers.emplace_back(fGpu, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ;
54 SkASSERT(1 == fDescriptorSetManagers.count());
55 fUniformDSHandle = GrVkDescriptorSetManager::Handle(0);
85 } 56 }
86 57
87 GrVkPipeline* GrVkResourceProvider::createPipeline(const GrPipeline& pipeline, 58 GrVkPipeline* GrVkResourceProvider::createPipeline(const GrPipeline& pipeline,
88 const GrPrimitiveProcessor& p rimProc, 59 const GrPrimitiveProcessor& p rimProc,
89 VkPipelineShaderStageCreateIn fo* shaderStageInfo, 60 VkPipelineShaderStageCreateIn fo* shaderStageInfo,
90 int shaderStageCount, 61 int shaderStageCount,
91 GrPrimitiveType primitiveType , 62 GrPrimitiveType primitiveType ,
92 const GrVkRenderPass& renderP ass, 63 const GrVkRenderPass& renderP ass,
93 VkPipelineLayout layout) { 64 VkPipelineLayout layout) {
94 65
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 } 154 }
184 155
185 sk_sp<GrVkPipelineState> GrVkResourceProvider::findOrCreateCompatiblePipelineSta te( 156 sk_sp<GrVkPipelineState> GrVkResourceProvider::findOrCreateCompatiblePipelineSta te(
186 const GrPipelin e& pipeline, 157 const GrPipelin e& pipeline,
187 const GrPrimiti veProcessor& proc, 158 const GrPrimiti veProcessor& proc,
188 GrPrimitiveType primitiveType, 159 GrPrimitiveType primitiveType,
189 const GrVkRende rPass& renderPass) { 160 const GrVkRende rPass& renderPass) {
190 return fPipelineStateCache->refPipelineState(pipeline, proc, primitiveType, renderPass); 161 return fPipelineStateCache->refPipelineState(pipeline, proc, primitiveType, renderPass);
191 } 162 }
192 163
193 164 void GrVkResourceProvider::getSamplerDescriptorSetHandle(const GrVkUniformHandle r& uniformHandler,
194 void GrVkResourceProvider::getDescSetHandle(uint32_t numSamplers, VkDescriptorSe tLayout layout, 165 GrVkDescriptorSetManage r::Handle* handle) {
195 GrVkDescriptorSetManager::Handle* ha ndle) {
196 SkASSERT(handle); 166 SkASSERT(handle);
197 for (int i = 0; i < fDescriptorSetManagers.count(); ++i) { 167 for (int i = 0; i < fDescriptorSetManagers.count(); ++i) {
198 if (fDescriptorSetManagers[i].isCompatible(numSamplers)) { 168 if (fDescriptorSetManagers[i].isCompatible(VK_DESCRIPTOR_TYPE_COMBINED_I MAGE_SAMPLER,
169 &uniformHandler)) {
199 *handle = GrVkDescriptorSetManager::Handle(i); 170 *handle = GrVkDescriptorSetManager::Handle(i);
200 return; 171 return;
201 } 172 }
202 } 173 }
203 174
204 // Failed to find a DescSetManager, we must create a new one; 175 fDescriptorSetManagers.emplace_back(fGpu, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_ SAMPLER,
205 VkDescriptorType type = numSamplers ? VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMP LER 176 &uniformHandler);
206 : VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; 177 *handle = GrVkDescriptorSetManager::Handle(fDescriptorSetManagers.count() - 1);
178 }
207 179
208 fDescriptorSetManagers.emplace_back(fGpu, layout, type, numSamplers); 180 VkDescriptorSetLayout GrVkResourceProvider::getUniformDSLayout() const {
209 *handle = GrVkDescriptorSetManager::Handle(fDescriptorSetManagers.count() - 1); 181 SkASSERT(fUniformDSHandle.isValid());
182 return fDescriptorSetManagers[fUniformDSHandle.toIndex()].layout();
183 }
184
185 VkDescriptorSetLayout GrVkResourceProvider::getSamplerDSLayout(
186 const GrVkDescriptorSetManager::Handle& handle) const {
187 SkASSERT(handle.isValid());
188 return fDescriptorSetManagers[handle.toIndex()].layout();
210 } 189 }
211 190
212 const GrVkDescriptorSet* GrVkResourceProvider::getUniformDescriptorSet() { 191 const GrVkDescriptorSet* GrVkResourceProvider::getUniformDescriptorSet() {
213 SkASSERT(fUniformDSHandle.isValid()); 192 SkASSERT(fUniformDSHandle.isValid());
214 return fDescriptorSetManagers[fUniformDSHandle.toIndex()].getDescriptorSet(f Gpu, 193 return fDescriptorSetManagers[fUniformDSHandle.toIndex()].getDescriptorSet(f Gpu,
215 f UniformDSHandle); 194 f UniformDSHandle);
216 } 195 }
217 196
197 const GrVkDescriptorSet* GrVkResourceProvider::getSamplerDescriptorSet(
198 const GrVkDescriptorSetManager::Handle& handle) {
199 SkASSERT(handle.isValid());
200 return fDescriptorSetManagers[handle.toIndex()].getDescriptorSet(fGpu, handl e);
201 }
218 202
219 void GrVkResourceProvider::recycleDescriptorSet(const GrVkDescriptorSet* descSet , 203 void GrVkResourceProvider::recycleDescriptorSet(const GrVkDescriptorSet* descSet ,
220 const GrVkDescriptorSetManager:: Handle& handle) { 204 const GrVkDescriptorSetManager:: Handle& handle) {
221 SkASSERT(descSet); 205 SkASSERT(descSet);
222 SkASSERT(handle.isValid()); 206 SkASSERT(handle.isValid());
223 int managerIdx = handle.toIndex(); 207 int managerIdx = handle.toIndex();
224 SkASSERT(managerIdx < fDescriptorSetManagers.count()); 208 SkASSERT(managerIdx < fDescriptorSetManagers.count());
225 fDescriptorSetManagers[managerIdx].recycleDescriptorSet(descSet); 209 fDescriptorSetManagers[managerIdx].recycleDescriptorSet(descSet);
226 } 210 }
227 211
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
319 for (; !iter.done(); ++iter) { 303 for (; !iter.done(); ++iter) {
320 (*iter).unref(fGpu); 304 (*iter).unref(fGpu);
321 } 305 }
322 fSamplers.reset(); 306 fSamplers.reset();
323 307
324 fPipelineStateCache->release(); 308 fPipelineStateCache->release();
325 309
326 GR_VK_CALL(fGpu->vkInterface(), DestroyPipelineCache(fGpu->device(), fPipeli neCache, nullptr)); 310 GR_VK_CALL(fGpu->vkInterface(), DestroyPipelineCache(fGpu->device(), fPipeli neCache, nullptr));
327 fPipelineCache = VK_NULL_HANDLE; 311 fPipelineCache = VK_NULL_HANDLE;
328 312
329 if (fUniformDescLayout) {
330 GR_VK_CALL(fGpu->vkInterface(), DestroyDescriptorSetLayout(fGpu->device( ),
331 fUniformDescL ayout,
332 nullptr));
333 fUniformDescLayout = VK_NULL_HANDLE;
334 }
335
336 // We must release/destroy all command buffers and pipeline states before re leasing the 313 // We must release/destroy all command buffers and pipeline states before re leasing the
337 // GrVkDescriptorSetManagers 314 // GrVkDescriptorSetManagers
338 for (int i = 0; i < fDescriptorSetManagers.count(); ++i) { 315 for (int i = 0; i < fDescriptorSetManagers.count(); ++i) {
339 fDescriptorSetManagers[i].release(fGpu); 316 fDescriptorSetManagers[i].release(fGpu);
340 } 317 }
341 fDescriptorSetManagers.reset(); 318 fDescriptorSetManagers.reset();
342 319
343 // release our uniform buffers 320 // release our uniform buffers
344 for (int i = 0; i < fAvailableUniformBufferResources.count(); ++i) { 321 for (int i = 0; i < fAvailableUniformBufferResources.count(); ++i) {
345 SkASSERT(fAvailableUniformBufferResources[i]->unique()); 322 SkASSERT(fAvailableUniformBufferResources[i]->unique());
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
449 } 426 }
450 427
451 void GrVkResourceProvider::CompatibleRenderPassSet::abandonResources() { 428 void GrVkResourceProvider::CompatibleRenderPassSet::abandonResources() {
452 for (int i = 0; i < fRenderPasses.count(); ++i) { 429 for (int i = 0; i < fRenderPasses.count(); ++i) {
453 if (fRenderPasses[i]) { 430 if (fRenderPasses[i]) {
454 fRenderPasses[i]->unrefAndAbandon(); 431 fRenderPasses[i]->unrefAndAbandon();
455 fRenderPasses[i] = nullptr; 432 fRenderPasses[i] = nullptr;
456 } 433 }
457 } 434 }
458 } 435 }
OLDNEW
« no previous file with comments | « src/gpu/vk/GrVkResourceProvider.h ('k') | src/gpu/vk/GrVkUniformHandler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698