Index: src/gpu/vk/GrVkResourceProvider.cpp |
diff --git a/src/gpu/vk/GrVkResourceProvider.cpp b/src/gpu/vk/GrVkResourceProvider.cpp |
index e3c19d67a068542d235f43561e1c36e5680601b2..ccf47167c66294da3f477dff305e08493f36d8be 100644 |
--- a/src/gpu/vk/GrVkResourceProvider.cpp |
+++ b/src/gpu/vk/GrVkResourceProvider.cpp |
@@ -22,7 +22,6 @@ uint32_t GrVkResource::fKeyCounter = 0; |
GrVkResourceProvider::GrVkResourceProvider(GrVkGpu* gpu) |
: fGpu(gpu) |
, fPipelineCache(VK_NULL_HANDLE) |
- , fUniformDescPool(nullptr) |
, fCurrentUniformDescCount(0) { |
fPipelineStateCache = new PipelineStateCache(gpu); |
} |
@@ -61,9 +60,8 @@ void GrVkResourceProvider::initUniformDescObjects() { |
&dsUniformLayoutCreateInfo, |
nullptr, |
&fUniformDescLayout)); |
- fCurrMaxUniDescriptors = kStartNumUniformDescriptors; |
- fUniformDescPool = this->findOrCreateCompatibleDescriptorPool(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, |
- fCurrMaxUniDescriptors); |
+ |
+ this->getDescSetHandle(0, fUniformDescLayout, &fUniformDSHandle); |
} |
void GrVkResourceProvider::init() { |
@@ -191,42 +189,46 @@ sk_sp<GrVkPipelineState> GrVkResourceProvider::findOrCreateCompatiblePipelineSta |
return fPipelineStateCache->refPipelineState(pipeline, proc, primitiveType, renderPass); |
} |
-void GrVkResourceProvider::getUniformDescriptorSet(VkDescriptorSet* ds, |
- const GrVkDescriptorPool** outPool) { |
- fCurrentUniformDescCount += kNumUniformDescPerSet; |
- if (fCurrentUniformDescCount > fCurrMaxUniDescriptors) { |
- fUniformDescPool->unref(fGpu); |
- uint32_t newPoolSize = fCurrMaxUniDescriptors + ((fCurrMaxUniDescriptors + 1) >> 1); |
- if (newPoolSize < kMaxUniformDescriptors) { |
- fCurrMaxUniDescriptors = newPoolSize; |
- } else { |
- fCurrMaxUniDescriptors = kMaxUniformDescriptors; |
+ |
+void GrVkResourceProvider::getDescSetHandle(uint32_t numSamplers, VkDescriptorSetLayout layout, |
+ GrVkDescriptorSetManager::Handle* handle) { |
+ SkASSERT(handle); |
+ for (int i = 0; i < fDescriptorSetManagers.count(); ++i) { |
+ if (fDescriptorSetManagers[i].isCompatible(numSamplers)) { |
+ *handle = GrVkDescriptorSetManager::Handle(i); |
+ return; |
} |
- fUniformDescPool = |
- this->findOrCreateCompatibleDescriptorPool(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, |
- fCurrMaxUniDescriptors); |
- fCurrentUniformDescCount = kNumUniformDescPerSet; |
} |
- SkASSERT(fUniformDescPool); |
- |
- VkDescriptorSetAllocateInfo dsAllocateInfo; |
- memset(&dsAllocateInfo, 0, sizeof(VkDescriptorSetAllocateInfo)); |
- dsAllocateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; |
- dsAllocateInfo.pNext = nullptr; |
- dsAllocateInfo.descriptorPool = fUniformDescPool->descPool(); |
- dsAllocateInfo.descriptorSetCount = 1; |
- dsAllocateInfo.pSetLayouts = &fUniformDescLayout; |
- GR_VK_CALL_ERRCHECK(fGpu->vkInterface(), AllocateDescriptorSets(fGpu->device(), |
- &dsAllocateInfo, |
- ds)); |
- *outPool = fUniformDescPool; |
+ |
+ // Failed to find a DescSetManager, we must create a new one; |
+ VkDescriptorType type = numSamplers ? VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER |
+ : VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; |
+ |
+ fDescriptorSetManagers.emplace_back(fGpu, layout, type, numSamplers); |
+ *handle = GrVkDescriptorSetManager::Handle(fDescriptorSetManagers.count() - 1); |
+} |
+ |
+const GrVkDescriptorSet* GrVkResourceProvider::getUniformDescriptorSet() { |
+ SkASSERT(fUniformDSHandle.isValid()); |
+ return fDescriptorSetManagers[fUniformDSHandle.toIndex()].getDescriptorSet(fGpu, |
+ fUniformDSHandle); |
+} |
+ |
+ |
+void GrVkResourceProvider::recycleDescriptorSet(const GrVkDescriptorSet* descSet, |
+ const GrVkDescriptorSetManager::Handle& handle) { |
+ SkASSERT(descSet); |
+ SkASSERT(handle.isValid()); |
+ int managerIdx = handle.toIndex(); |
+ SkASSERT(managerIdx < fDescriptorSetManagers.count()); |
+ fDescriptorSetManagers[managerIdx].recycleDescriptorSet(descSet); |
} |
GrVkPrimaryCommandBuffer* GrVkResourceProvider::findOrCreatePrimaryCommandBuffer() { |
GrVkPrimaryCommandBuffer* cmdBuffer = nullptr; |
int count = fAvailableCommandBuffers.count(); |
if (count > 0) { |
- cmdBuffer = fAvailableCommandBuffers[count -1]; |
+ cmdBuffer = fAvailableCommandBuffers[count - 1]; |
SkASSERT(cmdBuffer->finished(fGpu)); |
fAvailableCommandBuffers.removeShuffle(count - 1); |
} else { |
@@ -313,7 +315,13 @@ void GrVkResourceProvider::destroyResources() { |
nullptr)); |
fUniformDescLayout = VK_NULL_HANDLE; |
} |
- fUniformDescPool->unref(fGpu); |
+ |
+ // We must release/destroy all command buffers and pipeline states before releasing the |
+ // GrVkDescriptorSetManagers |
+ for (int i = 0; i < fDescriptorSetManagers.count(); ++i) { |
+ fDescriptorSetManagers[i].release(fGpu); |
+ } |
+ fDescriptorSetManagers.reset(); |
} |
void GrVkResourceProvider::abandonResources() { |
@@ -356,8 +364,13 @@ void GrVkResourceProvider::abandonResources() { |
fPipelineCache = VK_NULL_HANDLE; |
- fUniformDescLayout = VK_NULL_HANDLE; |
- fUniformDescPool->unrefAndAbandon(); |
+ // We must abandon all command buffers and pipeline states before abandoning the |
+ // GrVkDescriptorSetManagers |
+ for (int i = 0; i < fDescriptorSetManagers.count(); ++i) { |
+ fDescriptorSetManagers[i].abandon(); |
+ } |
+ fDescriptorSetManagers.reset(); |
+ |
} |
//////////////////////////////////////////////////////////////////////////////// |