xref: /aosp_15_r20/external/skia/src/gpu/ganesh/vk/GrVkDescriptorSetManager.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 /*
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 "include/private/base/SkAssert.h"
12 #include "include/private/base/SkTArray.h"
13 #include "include/private/gpu/vk/SkiaVulkan.h"
14 #include "src/gpu/ganesh/GrResourceHandle.h"
15 
16 #include <cstddef>
17 #include <cstdint>
18 
19 class GrVkDescriptorPool;
20 class GrVkDescriptorSet;
21 class GrVkGpu;
22 class GrVkSampler;
23 class GrVkUniformHandler;
24 /**
25  * This class handles the allocation of descriptor sets for a given VkDescriptorSetLayout. It will
26  * try to reuse previously allocated descriptor sets if they are no longer in use by other objects.
27  */
28 class GrVkDescriptorSetManager {
29 public:
30     GR_DEFINE_RESOURCE_HANDLE_CLASS(Handle)
31 
32     static GrVkDescriptorSetManager* CreateUniformManager(GrVkGpu* gpu);
33     static GrVkDescriptorSetManager* CreateSamplerManager(GrVkGpu* gpu, VkDescriptorType type,
34                                                           const GrVkUniformHandler&);
35     // See GrVkResourceProvider::getZeroSamplerDescriptorSetHandle() for more info on what the zero
36     // sampler is for.
37     static GrVkDescriptorSetManager* CreateZeroSamplerManager(GrVkGpu* gpu);
38     static GrVkDescriptorSetManager* CreateInputManager(GrVkGpu* gpu);
39 
~GrVkDescriptorSetManager()40     ~GrVkDescriptorSetManager() {}
41 
42     void release(GrVkGpu* gpu);
43 
layout()44     VkDescriptorSetLayout layout() const { return fPoolManager.fDescLayout; }
45 
46     const GrVkDescriptorSet* getDescriptorSet(GrVkGpu* gpu, const Handle& handle);
47 
48     void recycleDescriptorSet(const GrVkDescriptorSet*);
49 
50     bool isCompatible(VkDescriptorType type, const GrVkUniformHandler*) const;
51 
52     bool isZeroSampler() const;
53 
54 private:
55     struct DescriptorPoolManager {
56         DescriptorPoolManager(VkDescriptorSetLayout, VkDescriptorType type,
57                               uint32_t descCountPerSet);
58 
~DescriptorPoolManagerDescriptorPoolManager59         ~DescriptorPoolManager() {
60             SkASSERT(!fDescLayout);
61             SkASSERT(!fPool);
62         }
63 
64         bool getNewDescriptorSet(GrVkGpu* gpu, VkDescriptorSet* ds);
65 
66         void freeGPUResources(GrVkGpu* gpu);
67 
68         VkDescriptorSetLayout  fDescLayout;
69         VkDescriptorType       fDescType;
70         uint32_t               fDescCountPerSet;
71         uint32_t               fMaxDescriptors;
72         uint32_t               fCurrentDescriptorCount;
73         GrVkDescriptorPool*    fPool;
74 
75     private:
76         static constexpr size_t kMaxDescriptors = 1024;
77         static constexpr size_t kStartNumDescriptors = 16;
78         // kStartNumDescriptors must be less than kMaxUniformDescriptors
79         static_assert(kStartNumDescriptors < kMaxDescriptors);
80 
81         bool getNewPool(GrVkGpu* gpu);
82     };
83 
84     static GrVkDescriptorSetManager* Create(GrVkGpu* gpu,
85                                             VkDescriptorType,
86                                             const skia_private::TArray<uint32_t>& visibilities,
87                                             const skia_private::TArray<const GrVkSampler*>& immutableSamplers);
88 
89     GrVkDescriptorSetManager(GrVkGpu* gpu,
90                              VkDescriptorType, VkDescriptorSetLayout, uint32_t descCountPerSet,
91                              const skia_private::TArray<uint32_t>& visibilities,
92                              const skia_private::TArray<const GrVkSampler*>& immutableSamplers);
93 
94 
95     DescriptorPoolManager                                fPoolManager;
96     skia_private::TArray<const GrVkDescriptorSet*, true> fFreeSets;
97     skia_private::STArray<4, uint32_t>                   fBindingVisibilities;
98     skia_private::STArray<4, const GrVkSampler*>         fImmutableSamplers;
99 };
100 
101 #endif
102