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

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: rebase 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
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"
17 #include "GrVkUniformHandler.h"
16 #include "GrVkUtil.h" 18 #include "GrVkUtil.h"
17 19
18 #ifdef SK_TRACE_VK_RESOURCES 20 #ifdef SK_TRACE_VK_RESOURCES
19 GrVkResource::Trace GrVkResource::fTrace; 21 GrVkResource::Trace GrVkResource::fTrace;
20 uint32_t GrVkResource::fKeyCounter = 0; 22 uint32_t GrVkResource::fKeyCounter = 0;
21 #endif 23 #endif
22 24
23 GrVkResourceProvider::GrVkResourceProvider(GrVkGpu* gpu) 25 GrVkResourceProvider::GrVkResourceProvider(GrVkGpu* gpu)
24 : fGpu(gpu) 26 : fGpu(gpu)
25 , fPipelineCache(VK_NULL_HANDLE) 27 , fPipelineCache(VK_NULL_HANDLE) {
26 , fCurrentUniformDescCount(0) {
27 fPipelineStateCache = new PipelineStateCache(gpu); 28 fPipelineStateCache = new PipelineStateCache(gpu);
28 } 29 }
29 30
30 GrVkResourceProvider::~GrVkResourceProvider() { 31 GrVkResourceProvider::~GrVkResourceProvider() {
31 SkASSERT(0 == fRenderPassArray.count()); 32 SkASSERT(0 == fRenderPassArray.count());
32 SkASSERT(VK_NULL_HANDLE == fPipelineCache); 33 SkASSERT(VK_NULL_HANDLE == fPipelineCache);
33 delete fPipelineStateCache; 34 delete fPipelineStateCache;
34 } 35 }
35 36
36 void GrVkResourceProvider::initUniformDescObjects() { 37 void GrVkResourceProvider::initUniformDescObjects() {
(...skipping 13 matching lines...) Expand all
50 dsUniBindings[1].pImmutableSamplers = nullptr; 51 dsUniBindings[1].pImmutableSamplers = nullptr;
51 52
52 VkDescriptorSetLayoutCreateInfo dsUniformLayoutCreateInfo; 53 VkDescriptorSetLayoutCreateInfo dsUniformLayoutCreateInfo;
53 memset(&dsUniformLayoutCreateInfo, 0, sizeof(VkDescriptorSetLayoutCreateInfo )); 54 memset(&dsUniformLayoutCreateInfo, 0, sizeof(VkDescriptorSetLayoutCreateInfo ));
54 dsUniformLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CR EATE_INFO; 55 dsUniformLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CR EATE_INFO;
55 dsUniformLayoutCreateInfo.pNext = nullptr; 56 dsUniformLayoutCreateInfo.pNext = nullptr;
56 dsUniformLayoutCreateInfo.flags = 0; 57 dsUniformLayoutCreateInfo.flags = 0;
57 dsUniformLayoutCreateInfo.bindingCount = 2; 58 dsUniformLayoutCreateInfo.bindingCount = 2;
58 dsUniformLayoutCreateInfo.pBindings = dsUniBindings; 59 dsUniformLayoutCreateInfo.pBindings = dsUniBindings;
59 60
61 VkDescriptorSetLayout uniformDescLayout;
60 GR_VK_CALL_ERRCHECK(fGpu->vkInterface(), CreateDescriptorSetLayout(fGpu->dev ice(), 62 GR_VK_CALL_ERRCHECK(fGpu->vkInterface(), CreateDescriptorSetLayout(fGpu->dev ice(),
61 &dsUnifor mLayoutCreateInfo, 63 &dsUnifor mLayoutCreateInfo,
62 nullptr, 64 nullptr,
63 &fUniform DescLayout)); 65 &uniformD escLayout));
64 66
65 this->getDescSetHandle(0, fUniformDescLayout, &fUniformDSHandle); 67 fDescriptorSetManagers.emplace_back(fGpu, uniformDescLayout,
68 VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2);
69 SkASSERT(1 == fDescriptorSetManagers.count());
70 fUniformDSHandle = GrVkDescriptorSetManager::Handle(0);
66 } 71 }
67 72
68 void GrVkResourceProvider::init() { 73 void GrVkResourceProvider::init() {
69 VkPipelineCacheCreateInfo createInfo; 74 VkPipelineCacheCreateInfo createInfo;
70 memset(&createInfo, 0, sizeof(VkPipelineCacheCreateInfo)); 75 memset(&createInfo, 0, sizeof(VkPipelineCacheCreateInfo));
71 createInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO; 76 createInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
72 createInfo.pNext = nullptr; 77 createInfo.pNext = nullptr;
73 createInfo.flags = 0; 78 createInfo.flags = 0;
74 createInfo.initialDataSize = 0; 79 createInfo.initialDataSize = 0;
75 createInfo.pInitialData = nullptr; 80 createInfo.pInitialData = nullptr;
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 } 188 }
184 189
185 sk_sp<GrVkPipelineState> GrVkResourceProvider::findOrCreateCompatiblePipelineSta te( 190 sk_sp<GrVkPipelineState> GrVkResourceProvider::findOrCreateCompatiblePipelineSta te(
186 const GrPipelin e& pipeline, 191 const GrPipelin e& pipeline,
187 const GrPrimiti veProcessor& proc, 192 const GrPrimiti veProcessor& proc,
188 GrPrimitiveType primitiveType, 193 GrPrimitiveType primitiveType,
189 const GrVkRende rPass& renderPass) { 194 const GrVkRende rPass& renderPass) {
190 return fPipelineStateCache->refPipelineState(pipeline, proc, primitiveType, renderPass); 195 return fPipelineStateCache->refPipelineState(pipeline, proc, primitiveType, renderPass);
191 } 196 }
192 197
198 VkShaderStageFlags visibility_to_vk_stage_flags(uint32_t visibility) {
199 VkShaderStageFlags flags = 0;
193 200
194 void GrVkResourceProvider::getDescSetHandle(uint32_t numSamplers, VkDescriptorSe tLayout layout, 201 if (visibility & kVertex_GrShaderFlag) {
195 GrVkDescriptorSetManager::Handle* ha ndle) { 202 flags |= VK_SHADER_STAGE_VERTEX_BIT;
203 }
204 if (visibility & kGeometry_GrShaderFlag) {
205 flags |= VK_SHADER_STAGE_GEOMETRY_BIT;
206 }
207 if (visibility & kFragment_GrShaderFlag) {
208 flags |= VK_SHADER_STAGE_FRAGMENT_BIT;
209 }
210 return flags;
211 }
212
213 void GrVkResourceProvider::getSamplerDescriptorSetHandle(const GrVkUniformHandle r& uniformHandler,
214 GrVkDescriptorSetManage r::Handle* handle) {
196 SkASSERT(handle); 215 SkASSERT(handle);
197 for (int i = 0; i < fDescriptorSetManagers.count(); ++i) { 216 for (int i = 0; i < fDescriptorSetManagers.count(); ++i) {
198 if (fDescriptorSetManagers[i].isCompatible(numSamplers)) { 217 if (fDescriptorSetManagers[i].isCompatible(VK_DESCRIPTOR_TYPE_COMBINED_I MAGE_SAMPLER,
218 &uniformHandler)) {
199 *handle = GrVkDescriptorSetManager::Handle(i); 219 *handle = GrVkDescriptorSetManager::Handle(i);
200 return; 220 return;
201 } 221 }
202 } 222 }
203 223
204 // Failed to find a DescSetManager, we must create a new one; 224 // Failed to find a DescSetManager, we must create a new one;
205 VkDescriptorType type = numSamplers ? VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMP LER 225 uint32_t numSamplers = (uint32_t)uniformHandler.numSamplers();
206 : VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
207 226
208 fDescriptorSetManagers.emplace_back(fGpu, layout, type, numSamplers); 227 SkAutoTDeleteArray<VkDescriptorSetLayoutBinding> dsSamplerBindings(
228 new VkDescriptorSetLayoutBi nding[numSamplers]);
229 for (uint32_t i = 0; i < numSamplers; ++i) {
230 const GrVkGLSLSampler& sampler =
231 static_cast<const GrVkGLSLSampler&>(uniformHandler.getSampler(i));
232 SkASSERT(sampler.binding() == i);
233 dsSamplerBindings[i].binding = sampler.binding();
234 dsSamplerBindings[i].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_ SAMPLER;
235 dsSamplerBindings[i].descriptorCount = 1;
236 dsSamplerBindings[i].stageFlags = visibility_to_vk_stage_flags(sampler.v isibility());
237 dsSamplerBindings[i].pImmutableSamplers = nullptr;
238 }
239
240 VkDescriptorSetLayoutCreateInfo dsSamplerLayoutCreateInfo;
241 memset(&dsSamplerLayoutCreateInfo, 0, sizeof(VkDescriptorSetLayoutCreateInfo ));
242 dsSamplerLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CR EATE_INFO;
243 dsSamplerLayoutCreateInfo.pNext = nullptr;
244 dsSamplerLayoutCreateInfo.flags = 0;
245 dsSamplerLayoutCreateInfo.bindingCount = numSamplers;
246 // Setting to nullptr fixes an error in the param checker validation layer. Even though
247 // bindingCount is 0 (which is valid), it still tries to validate pBindings unless it is null.
248 dsSamplerLayoutCreateInfo.pBindings = numSamplers ? dsSamplerBindings.get() : nullptr;
249
250 VkDescriptorSetLayout dsLayout;
251 GR_VK_CALL_ERRCHECK(fGpu->vkInterface(),
252 CreateDescriptorSetLayout(fGpu->device(),
253 &dsSamplerLayoutCreateInfo,
254 nullptr,
255 &dsLayout));
256 fDescriptorSetManagers.emplace_back(fGpu, dsLayout, VK_DESCRIPTOR_TYPE_COMBI NED_IMAGE_SAMPLER,
257 numSamplers, &uniformHandler);
209 *handle = GrVkDescriptorSetManager::Handle(fDescriptorSetManagers.count() - 1); 258 *handle = GrVkDescriptorSetManager::Handle(fDescriptorSetManagers.count() - 1);
210 } 259 }
211 260
261 VkDescriptorSetLayout GrVkResourceProvider::getUniformDSLayout() const {
262 SkASSERT(fUniformDSHandle.isValid());
263 return fDescriptorSetManagers[fUniformDSHandle.toIndex()].layout();
264 }
265
266 VkDescriptorSetLayout GrVkResourceProvider::getSamplerDSLayout(
267 const GrVkDescriptorSetManager::Handle& handle) const {
268 SkASSERT(handle.isValid());
269 return fDescriptorSetManagers[handle.toIndex()].layout();
270 }
271
212 const GrVkDescriptorSet* GrVkResourceProvider::getUniformDescriptorSet() { 272 const GrVkDescriptorSet* GrVkResourceProvider::getUniformDescriptorSet() {
213 SkASSERT(fUniformDSHandle.isValid()); 273 SkASSERT(fUniformDSHandle.isValid());
214 return fDescriptorSetManagers[fUniformDSHandle.toIndex()].getDescriptorSet(f Gpu, 274 return fDescriptorSetManagers[fUniformDSHandle.toIndex()].getDescriptorSet(f Gpu,
215 f UniformDSHandle); 275 f UniformDSHandle);
216 } 276 }
217 277
278 const GrVkDescriptorSet* GrVkResourceProvider::getSamplerDescriptorSet(
279 const GrVkDescriptorSetManager::Handle& handle) {
280 SkASSERT(handle.isValid());
281 return fDescriptorSetManagers[handle.toIndex()].getDescriptorSet(fGpu, handl e);
282 }
218 283
219 void GrVkResourceProvider::recycleDescriptorSet(const GrVkDescriptorSet* descSet , 284 void GrVkResourceProvider::recycleDescriptorSet(const GrVkDescriptorSet* descSet ,
220 const GrVkDescriptorSetManager:: Handle& handle) { 285 const GrVkDescriptorSetManager:: Handle& handle) {
221 SkASSERT(descSet); 286 SkASSERT(descSet);
222 SkASSERT(handle.isValid()); 287 SkASSERT(handle.isValid());
223 int managerIdx = handle.toIndex(); 288 int managerIdx = handle.toIndex();
224 SkASSERT(managerIdx < fDescriptorSetManagers.count()); 289 SkASSERT(managerIdx < fDescriptorSetManagers.count());
225 fDescriptorSetManagers[managerIdx].recycleDescriptorSet(descSet); 290 fDescriptorSetManagers[managerIdx].recycleDescriptorSet(descSet);
226 } 291 }
227 292
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
319 for (; !iter.done(); ++iter) { 384 for (; !iter.done(); ++iter) {
320 (*iter).unref(fGpu); 385 (*iter).unref(fGpu);
321 } 386 }
322 fSamplers.reset(); 387 fSamplers.reset();
323 388
324 fPipelineStateCache->release(); 389 fPipelineStateCache->release();
325 390
326 GR_VK_CALL(fGpu->vkInterface(), DestroyPipelineCache(fGpu->device(), fPipeli neCache, nullptr)); 391 GR_VK_CALL(fGpu->vkInterface(), DestroyPipelineCache(fGpu->device(), fPipeli neCache, nullptr));
327 fPipelineCache = VK_NULL_HANDLE; 392 fPipelineCache = VK_NULL_HANDLE;
328 393
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 394 // We must release/destroy all command buffers and pipeline states before re leasing the
337 // GrVkDescriptorSetManagers 395 // GrVkDescriptorSetManagers
338 for (int i = 0; i < fDescriptorSetManagers.count(); ++i) { 396 for (int i = 0; i < fDescriptorSetManagers.count(); ++i) {
339 fDescriptorSetManagers[i].release(fGpu); 397 fDescriptorSetManagers[i].release(fGpu);
340 } 398 }
341 fDescriptorSetManagers.reset(); 399 fDescriptorSetManagers.reset();
342 400
343 // release our uniform buffers 401 // release our uniform buffers
344 for (int i = 0; i < fAvailableUniformBufferResources.count(); ++i) { 402 for (int i = 0; i < fAvailableUniformBufferResources.count(); ++i) {
345 SkASSERT(fAvailableUniformBufferResources[i]->unique()); 403 SkASSERT(fAvailableUniformBufferResources[i]->unique());
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
449 } 507 }
450 508
451 void GrVkResourceProvider::CompatibleRenderPassSet::abandonResources() { 509 void GrVkResourceProvider::CompatibleRenderPassSet::abandonResources() {
452 for (int i = 0; i < fRenderPasses.count(); ++i) { 510 for (int i = 0; i < fRenderPasses.count(); ++i) {
453 if (fRenderPasses[i]) { 511 if (fRenderPasses[i]) {
454 fRenderPasses[i]->unrefAndAbandon(); 512 fRenderPasses[i]->unrefAndAbandon();
455 fRenderPasses[i] = nullptr; 513 fRenderPasses[i] = nullptr;
456 } 514 }
457 } 515 }
458 } 516 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698