blob: b69fe36f945fdc3d07bd0e9ef1e2ed6280c7af49 [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
11#include "GrResourceHandle.h"
12#include "GrVkDescriptorPool.h"
Greg Daniel7a82edf2018-12-04 10:54:34 -050013#include "GrVkSampler.h"
egdaniela95220d2016-07-21 11:50:37 -070014#include "SkRefCnt.h"
15#include "SkTArray.h"
Greg Daniel487132b2018-12-20 14:09:36 -050016#include "vk/GrVkTypes.h"
egdaniela95220d2016-07-21 11:50:37 -070017
18class GrVkDescriptorSet;
19class GrVkGpu;
egdaniel707bbd62016-07-26 07:19:47 -070020class GrVkUniformHandler;
egdaniela95220d2016-07-21 11:50:37 -070021
22/**
23 * This class handles the allocation of descriptor sets for a given VkDescriptorSetLayout. It will
24 * try to reuse previously allocated descriptor sets if they are no longer in use by other objects.
25 */
26class GrVkDescriptorSetManager {
27public:
28 GR_DEFINE_RESOURCE_HANDLE_CLASS(Handle);
29
Greg Daniel18f96022017-05-04 15:09:03 -040030 static GrVkDescriptorSetManager* CreateUniformManager(GrVkGpu* gpu);
31 static GrVkDescriptorSetManager* CreateSamplerManager(GrVkGpu* gpu, VkDescriptorType type,
32 const GrVkUniformHandler&);
33 static GrVkDescriptorSetManager* CreateSamplerManager(GrVkGpu* gpu, VkDescriptorType type,
34 const SkTArray<uint32_t>& visibilities);
egdaniel4d866df2016-08-25 13:52:00 -070035
egdaniela95220d2016-07-21 11:50:37 -070036 ~GrVkDescriptorSetManager() {}
37
38 void abandon();
Ethan Nicholas8e265a72018-12-12 16:22:40 -050039 void release(GrVkGpu* gpu);
egdaniela95220d2016-07-21 11:50:37 -070040
egdaniel707bbd62016-07-26 07:19:47 -070041 VkDescriptorSetLayout layout() const { return fPoolManager.fDescLayout; }
42
egdaniela95220d2016-07-21 11:50:37 -070043 const GrVkDescriptorSet* getDescriptorSet(GrVkGpu* gpu, const Handle& handle);
44
45 void recycleDescriptorSet(const GrVkDescriptorSet*);
46
egdaniel707bbd62016-07-26 07:19:47 -070047 bool isCompatible(VkDescriptorType type, const GrVkUniformHandler*) const;
egdaniel4d866df2016-08-25 13:52:00 -070048 bool isCompatible(VkDescriptorType type,
49 const SkTArray<uint32_t>& visibilities) const;
egdaniela95220d2016-07-21 11:50:37 -070050
51private:
52 struct DescriptorPoolManager {
egdaniel707bbd62016-07-26 07:19:47 -070053 DescriptorPoolManager(VkDescriptorType type, GrVkGpu* gpu,
Greg Daniel7a82edf2018-12-04 10:54:34 -050054 const SkTArray<uint32_t>& visibilities,
55 const SkTArray<const GrVkSampler*>& immutableSamplers);
egdaniel4d866df2016-08-25 13:52:00 -070056
egdaniela95220d2016-07-21 11:50:37 -070057
58 ~DescriptorPoolManager() {
59 SkASSERT(!fDescLayout);
60 SkASSERT(!fPool);
61 }
62
63 void getNewDescriptorSet(GrVkGpu* gpu, VkDescriptorSet* ds);
64
Ethan Nicholas8e265a72018-12-12 16:22:40 -050065 void freeGPUResources(GrVkGpu* gpu);
egdaniela95220d2016-07-21 11:50:37 -070066 void abandonGPUResources();
67
egdaniel707bbd62016-07-26 07:19:47 -070068 VkDescriptorSetLayout fDescLayout;
egdaniela95220d2016-07-21 11:50:37 -070069 VkDescriptorType fDescType;
70 uint32_t fDescCountPerSet;
71 uint32_t fMaxDescriptors;
72 uint32_t fCurrentDescriptorCount;
73 GrVkDescriptorPool* fPool;
74
75 private:
76 enum {
egdaniel707bbd62016-07-26 07:19:47 -070077 kUniformDescPerSet = 2,
egdaniela95220d2016-07-21 11:50:37 -070078 kMaxDescriptors = 1024,
79 kStartNumDescriptors = 16, // must be less than kMaxUniformDescriptors
80 };
81
82 void getNewPool(GrVkGpu* gpu);
83 };
84
Greg Daniel18f96022017-05-04 15:09:03 -040085 GrVkDescriptorSetManager(GrVkGpu* gpu,
86 VkDescriptorType,
Greg Daniel7a82edf2018-12-04 10:54:34 -050087 const SkTArray<uint32_t>& visibilities,
88 const SkTArray<const GrVkSampler*>& immutableSamplers);
Greg Daniel18f96022017-05-04 15:09:03 -040089
90
egdaniel707bbd62016-07-26 07:19:47 -070091 DescriptorPoolManager fPoolManager;
92 SkTArray<const GrVkDescriptorSet*, true> fFreeSets;
93 SkSTArray<4, uint32_t> fBindingVisibilities;
Greg Daniel7a82edf2018-12-04 10:54:34 -050094 SkSTArray<4, const GrVkSampler*> fImmutableSamplers;
egdaniela95220d2016-07-21 11:50:37 -070095};
96
97#endif