Home | History | Annotate | Download | only in vk
      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 "GrResourceHandle.h"
     12 #include "GrVkDescriptorPool.h"
     13 #include "SkRefCnt.h"
     14 #include "SkTArray.h"
     15 #include "vk/GrVkDefines.h"
     16 
     17 class GrVkDescriptorSet;
     18 class GrVkGpu;
     19 class GrVkUniformHandler;
     20 
     21 /**
     22  * This class handles the allocation of descriptor sets for a given VkDescriptorSetLayout. It will
     23  * try to reuse previously allocated descriptor sets if they are no longer in use by other objects.
     24  */
     25 class GrVkDescriptorSetManager {
     26 public:
     27     GR_DEFINE_RESOURCE_HANDLE_CLASS(Handle);
     28 
     29     GrVkDescriptorSetManager(GrVkGpu* gpu,
     30                              VkDescriptorType,
     31                              const GrVkUniformHandler* handler = nullptr);
     32 
     33     GrVkDescriptorSetManager(GrVkGpu* gpu,
     34                              VkDescriptorType,
     35                              const SkTArray<uint32_t>& visibilities);
     36 
     37     ~GrVkDescriptorSetManager() {}
     38 
     39     void abandon();
     40     void release(const GrVkGpu* gpu);
     41 
     42     VkDescriptorSetLayout layout() const { return fPoolManager.fDescLayout; }
     43 
     44     const GrVkDescriptorSet* getDescriptorSet(GrVkGpu* gpu, const Handle& handle);
     45 
     46     void recycleDescriptorSet(const GrVkDescriptorSet*);
     47 
     48     bool isCompatible(VkDescriptorType type, const GrVkUniformHandler*) const;
     49     bool isCompatible(VkDescriptorType type,
     50                       const SkTArray<uint32_t>& visibilities) const;
     51 
     52 private:
     53     struct DescriptorPoolManager {
     54         DescriptorPoolManager(VkDescriptorType type, GrVkGpu* gpu,
     55                               const GrVkUniformHandler* handler = nullptr);
     56         DescriptorPoolManager(VkDescriptorType type, GrVkGpu* gpu,
     57                               const SkTArray<uint32_t>& visibilities);
     58 
     59 
     60         ~DescriptorPoolManager() {
     61             SkASSERT(!fDescLayout);
     62             SkASSERT(!fPool);
     63         }
     64 
     65         void getNewDescriptorSet(GrVkGpu* gpu, VkDescriptorSet* ds);
     66 
     67         void freeGPUResources(const GrVkGpu* gpu);
     68         void abandonGPUResources();
     69 
     70         VkDescriptorSetLayout  fDescLayout;
     71         VkDescriptorType       fDescType;
     72         uint32_t               fDescCountPerSet;
     73         uint32_t               fMaxDescriptors;
     74         uint32_t               fCurrentDescriptorCount;
     75         GrVkDescriptorPool*    fPool;
     76 
     77     private:
     78         enum {
     79             kUniformDescPerSet = 2,
     80             kMaxDescriptors = 1024,
     81             kStartNumDescriptors = 16, // must be less than kMaxUniformDescriptors
     82         };
     83 
     84         void init(GrVkGpu* gpu, VkDescriptorType type, const GrVkUniformHandler* uniformHandler,
     85                   const SkTArray<uint32_t>* visibilities);
     86 
     87         void getNewPool(GrVkGpu* gpu);
     88     };
     89 
     90     DescriptorPoolManager                    fPoolManager;
     91     SkTArray<const GrVkDescriptorSet*, true> fFreeSets;
     92     SkSTArray<4, uint32_t>                   fBindingVisibilities;
     93 };
     94 
     95 #endif
     96