| /* | |
| * Copyright 2016 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #ifndef GrVkDescriptorSetManager_DEFINED | |
| #define GrVkDescriptorSetManager_DEFINED | |
| #include "GrResourceHandle.h" | |
| #include "GrVkDescriptorPool.h" | |
| #include "GrVkSampler.h" | |
| #include "SkRefCnt.h" | |
| #include "SkTArray.h" | |
| #include "vk/GrVkTypes.h" | |
| class GrVkDescriptorSet; | |
| class GrVkGpu; | |
| class GrVkUniformHandler; | |
| /** | |
| * This class handles the allocation of descriptor sets for a given VkDescriptorSetLayout. It will | |
| * try to reuse previously allocated descriptor sets if they are no longer in use by other objects. | |
| */ | |
| class GrVkDescriptorSetManager { | |
| public: | |
| GR_DEFINE_RESOURCE_HANDLE_CLASS(Handle); | |
| static GrVkDescriptorSetManager* CreateUniformManager(GrVkGpu* gpu); | |
| static GrVkDescriptorSetManager* CreateSamplerManager(GrVkGpu* gpu, VkDescriptorType type, | |
| const GrVkUniformHandler&); | |
| static GrVkDescriptorSetManager* CreateSamplerManager(GrVkGpu* gpu, VkDescriptorType type, | |
| const SkTArray<uint32_t>& visibilities); | |
| ~GrVkDescriptorSetManager() {} | |
| void abandon(); | |
| void release(GrVkGpu* gpu); | |
| VkDescriptorSetLayout layout() const { return fPoolManager.fDescLayout; } | |
| const GrVkDescriptorSet* getDescriptorSet(GrVkGpu* gpu, const Handle& handle); | |
| void recycleDescriptorSet(const GrVkDescriptorSet*); | |
| bool isCompatible(VkDescriptorType type, const GrVkUniformHandler*) const; | |
| bool isCompatible(VkDescriptorType type, | |
| const SkTArray<uint32_t>& visibilities) const; | |
| private: | |
| struct DescriptorPoolManager { | |
| DescriptorPoolManager(VkDescriptorType type, GrVkGpu* gpu, | |
| const SkTArray<uint32_t>& visibilities, | |
| const SkTArray<const GrVkSampler*>& immutableSamplers); | |
| ~DescriptorPoolManager() { | |
| SkASSERT(!fDescLayout); | |
| SkASSERT(!fPool); | |
| } | |
| void getNewDescriptorSet(GrVkGpu* gpu, VkDescriptorSet* ds); | |
| void freeGPUResources(GrVkGpu* gpu); | |
| void abandonGPUResources(); | |
| VkDescriptorSetLayout fDescLayout; | |
| VkDescriptorType fDescType; | |
| uint32_t fDescCountPerSet; | |
| uint32_t fMaxDescriptors; | |
| uint32_t fCurrentDescriptorCount; | |
| GrVkDescriptorPool* fPool; | |
| private: | |
| enum { | |
| kUniformDescPerSet = 2, | |
| kMaxDescriptors = 1024, | |
| kStartNumDescriptors = 16, // must be less than kMaxUniformDescriptors | |
| }; | |
| void getNewPool(GrVkGpu* gpu); | |
| }; | |
| GrVkDescriptorSetManager(GrVkGpu* gpu, | |
| VkDescriptorType, | |
| const SkTArray<uint32_t>& visibilities, | |
| const SkTArray<const GrVkSampler*>& immutableSamplers); | |
| DescriptorPoolManager fPoolManager; | |
| SkTArray<const GrVkDescriptorSet*, true> fFreeSets; | |
| SkSTArray<4, uint32_t> fBindingVisibilities; | |
| SkSTArray<4, const GrVkSampler*> fImmutableSamplers; | |
| }; | |
| #endif |