blob: f9ee7b241b73b04b2feb6955c1c442ad17de5f46 [file] [log] [blame]
egdaniela95220d2016-07-21 11:50:37 -07001/*
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#ifndef GrVkDescriptorSetManager_DEFINED
9#define GrVkDescriptorSetManager_DEFINED
10
Greg Daniel54bfb182018-11-20 17:12:36 -050011#include "GrVkVulkan.h"
12
egdaniela95220d2016-07-21 11:50:37 -070013#include "GrResourceHandle.h"
14#include "GrVkDescriptorPool.h"
Greg Daniel7a82edf2018-12-04 10:54:34 -050015#include "GrVkSampler.h"
egdaniela95220d2016-07-21 11:50:37 -070016#include "SkRefCnt.h"
17#include "SkTArray.h"
egdaniela95220d2016-07-21 11:50:37 -070018
19class GrVkDescriptorSet;
20class GrVkGpu;
egdaniel707bbd62016-07-26 07:19:47 -070021class GrVkUniformHandler;
egdaniela95220d2016-07-21 11:50:37 -070022
23/**
24 * This class handles the allocation of descriptor sets for a given VkDescriptorSetLayout. It will
25 * try to reuse previously allocated descriptor sets if they are no longer in use by other objects.
26 */
27class GrVkDescriptorSetManager {
28public:
29 GR_DEFINE_RESOURCE_HANDLE_CLASS(Handle);
30
Greg Daniel18f96022017-05-04 15:09:03 -040031 static GrVkDescriptorSetManager* CreateUniformManager(GrVkGpu* gpu);
32 static GrVkDescriptorSetManager* CreateSamplerManager(GrVkGpu* gpu, VkDescriptorType type,
33 const GrVkUniformHandler&);
34 static GrVkDescriptorSetManager* CreateSamplerManager(GrVkGpu* gpu, VkDescriptorType type,
35 const SkTArray<uint32_t>& visibilities);
egdaniel4d866df2016-08-25 13:52:00 -070036
egdaniela95220d2016-07-21 11:50:37 -070037 ~GrVkDescriptorSetManager() {}
38
39 void abandon();
40 void release(const GrVkGpu* gpu);
41
egdaniel707bbd62016-07-26 07:19:47 -070042 VkDescriptorSetLayout layout() const { return fPoolManager.fDescLayout; }
43
egdaniela95220d2016-07-21 11:50:37 -070044 const GrVkDescriptorSet* getDescriptorSet(GrVkGpu* gpu, const Handle& handle);
45
46 void recycleDescriptorSet(const GrVkDescriptorSet*);
47
egdaniel707bbd62016-07-26 07:19:47 -070048 bool isCompatible(VkDescriptorType type, const GrVkUniformHandler*) const;
egdaniel4d866df2016-08-25 13:52:00 -070049 bool isCompatible(VkDescriptorType type,
50 const SkTArray<uint32_t>& visibilities) const;
egdaniela95220d2016-07-21 11:50:37 -070051
52private:
53 struct DescriptorPoolManager {
egdaniel707bbd62016-07-26 07:19:47 -070054 DescriptorPoolManager(VkDescriptorType type, GrVkGpu* gpu,
Greg Daniel7a82edf2018-12-04 10:54:34 -050055 const SkTArray<uint32_t>& visibilities,
56 const SkTArray<const GrVkSampler*>& immutableSamplers);
egdaniel4d866df2016-08-25 13:52:00 -070057
egdaniela95220d2016-07-21 11:50:37 -070058
59 ~DescriptorPoolManager() {
60 SkASSERT(!fDescLayout);
61 SkASSERT(!fPool);
62 }
63
64 void getNewDescriptorSet(GrVkGpu* gpu, VkDescriptorSet* ds);
65
66 void freeGPUResources(const GrVkGpu* gpu);
67 void abandonGPUResources();
68
egdaniel707bbd62016-07-26 07:19:47 -070069 VkDescriptorSetLayout fDescLayout;
egdaniela95220d2016-07-21 11:50:37 -070070 VkDescriptorType fDescType;
71 uint32_t fDescCountPerSet;
72 uint32_t fMaxDescriptors;
73 uint32_t fCurrentDescriptorCount;
74 GrVkDescriptorPool* fPool;
75
76 private:
77 enum {
egdaniel707bbd62016-07-26 07:19:47 -070078 kUniformDescPerSet = 2,
egdaniela95220d2016-07-21 11:50:37 -070079 kMaxDescriptors = 1024,
80 kStartNumDescriptors = 16, // must be less than kMaxUniformDescriptors
81 };
82
83 void getNewPool(GrVkGpu* gpu);
84 };
85
Greg Daniel18f96022017-05-04 15:09:03 -040086 GrVkDescriptorSetManager(GrVkGpu* gpu,
87 VkDescriptorType,
Greg Daniel7a82edf2018-12-04 10:54:34 -050088 const SkTArray<uint32_t>& visibilities,
89 const SkTArray<const GrVkSampler*>& immutableSamplers);
Greg Daniel18f96022017-05-04 15:09:03 -040090
91
egdaniel707bbd62016-07-26 07:19:47 -070092 DescriptorPoolManager fPoolManager;
93 SkTArray<const GrVkDescriptorSet*, true> fFreeSets;
94 SkSTArray<4, uint32_t> fBindingVisibilities;
Greg Daniel7a82edf2018-12-04 10:54:34 -050095 SkSTArray<4, const GrVkSampler*> fImmutableSamplers;
egdaniela95220d2016-07-21 11:50:37 -070096};
97
98#endif