Index: src/gpu/vk/GrVkDescriptorSetManager.h |
diff --git a/src/gpu/vk/GrVkDescriptorSetManager.h b/src/gpu/vk/GrVkDescriptorSetManager.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..33a7720ab34cb38d4eaae1f03c3d6cf64f2b35e3 |
--- /dev/null |
+++ b/src/gpu/vk/GrVkDescriptorSetManager.h |
@@ -0,0 +1,97 @@ |
+/* |
+* 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 "SkRefCnt.h" |
+#include "SkTArray.h" |
+#include "vk/GrVkDefines.h" |
+ |
+class GrVkDescriptorSet; |
+class GrVkGpu; |
+ |
+/** |
+ * 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); |
+ |
+ GrVkDescriptorSetManager(GrVkGpu* gpu, |
+ VkDescriptorSetLayout layout, |
+ VkDescriptorType, |
+ uint32_t samplerCount); |
+ ~GrVkDescriptorSetManager() {} |
+ |
+ void abandon(); |
+ void release(const GrVkGpu* gpu); |
+ |
+ const GrVkDescriptorSet* getDescriptorSet(GrVkGpu* gpu, const Handle& handle); |
+ |
+ void recycleDescriptorSet(const GrVkDescriptorSet*); |
+ |
+ int isCompatible(uint32_t numSamplers) const { return numSamplers == fNumSamplerBindings; } |
+ |
+private: |
+ struct DescriptorPoolManager { |
+ DescriptorPoolManager(VkDescriptorSetLayout layout, VkDescriptorType type, |
+ uint32_t samplerCount, GrVkGpu* gpu) |
+ : fDescLayout(layout) |
+ , fDescType(type) |
+ , fCurrentDescriptorCount(0) |
+ , fPool(nullptr) { |
+ if (VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER == type) { |
+ fDescCountPerSet = kNumUniformDescPerSet; |
+ } else { |
+ SkASSERT(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER); |
+ fDescCountPerSet = samplerCount; |
+ } |
+ |
+ SkASSERT(fDescCountPerSet < kStartNumDescriptors); |
+ fMaxDescriptors = kStartNumDescriptors; |
+ SkASSERT(fMaxDescriptors > 0); |
+ this->getNewPool(gpu); |
+ } |
+ |
+ ~DescriptorPoolManager() { |
+ SkASSERT(!fDescLayout); |
+ SkASSERT(!fPool); |
+ } |
+ |
+ void getNewDescriptorSet(GrVkGpu* gpu, VkDescriptorSet* ds); |
+ |
+ void freeGPUResources(const GrVkGpu* gpu); |
+ void abandonGPUResources(); |
+ |
+ VkDescriptorSetLayout fDescLayout; // Not owned by this class |
+ VkDescriptorType fDescType; |
+ uint32_t fDescCountPerSet; |
+ uint32_t fMaxDescriptors; |
+ uint32_t fCurrentDescriptorCount; |
+ GrVkDescriptorPool* fPool; |
+ |
+ private: |
+ enum { |
+ kNumUniformDescPerSet = 2, |
+ kMaxDescriptors = 1024, |
+ kStartNumDescriptors = 16, // must be less than kMaxUniformDescriptors |
+ }; |
+ |
+ void getNewPool(GrVkGpu* gpu); |
+ }; |
+ |
+ DescriptorPoolManager fPoolManager; |
+ SkTArray<const GrVkDescriptorSet*> fFreeSets; |
+ // If the number of bindings is 0 we assume this is for uniform buffers |
+ uint32_t fNumSamplerBindings; |
+}; |
+ |
+#endif |