| Index: src/gpu/vk/GrVkDescriptorPool.cpp
|
| diff --git a/src/gpu/vk/GrVkDescriptorPool.cpp b/src/gpu/vk/GrVkDescriptorPool.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d4dced6c32c35c7f6a1130cc16ece19bd9adcfce
|
| --- /dev/null
|
| +++ b/src/gpu/vk/GrVkDescriptorPool.cpp
|
| @@ -0,0 +1,79 @@
|
| +/*
|
| +* Copyright 2016 Google Inc.
|
| +*
|
| +* Use of this source code is governed by a BSD-style license that can be
|
| +* found in the LICENSE file.
|
| +*/
|
| +
|
| +#include "GrVkDescriptorPool.h"
|
| +
|
| +#include "GrVkGpu.h"
|
| +#include "SkTemplates.h"
|
| +
|
| +
|
| +GrVkDescriptorPool::GrVkDescriptorPool(const GrVkGpu* gpu, const DescriptorTypeCounts& typeCounts)
|
| + : INHERITED()
|
| + , fTypeCounts(typeCounts) {
|
| + uint32_t numPools = fTypeCounts.numPoolSizes();
|
| + SkAutoTDeleteArray<VkDescriptorPoolSize> poolSizes(new VkDescriptorPoolSize[numPools]);
|
| + int currentPool = 0;
|
| + for (int i = VK_DESCRIPTOR_TYPE_BEGIN_RANGE; i < VK_DESCRIPTOR_TYPE_END_RANGE; ++i) {
|
| + if (fTypeCounts.fDescriptorTypeCount[i]) {
|
| + VkDescriptorPoolSize& poolSize = poolSizes.get()[currentPool++];
|
| + poolSize.type = (VkDescriptorType)i;
|
| + poolSize.descriptorCount = fTypeCounts.fDescriptorTypeCount[i];
|
| + }
|
| + }
|
| + SkASSERT(currentPool == numPools);
|
| +
|
| + VkDescriptorPoolCreateInfo createInfo;
|
| + memset(&createInfo, 0, sizeof(VkDescriptorPoolCreateInfo));
|
| + createInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
|
| + createInfo.pNext = nullptr;
|
| + createInfo.flags = 0;
|
| + createInfo.maxSets = 2; // Currently we allow one set for samplers and one set for uniforms
|
| + createInfo.poolSizeCount = numPools;
|
| + createInfo.pPoolSizes = poolSizes.get();
|
| +
|
| + GR_VK_CALL_ERRCHECK(gpu->vkInterface(), CreateDescriptorPool(gpu->device(),
|
| + &createInfo,
|
| + nullptr,
|
| + &fDescPool));
|
| +}
|
| +
|
| +bool GrVkDescriptorPool::isCompatible(const DescriptorTypeCounts& typeCounts) const {
|
| + return fTypeCounts.isSuperSet(typeCounts);
|
| +}
|
| +
|
| +void GrVkDescriptorPool::reset(const GrVkGpu* gpu) {
|
| + GR_VK_CALL_ERRCHECK(gpu->vkInterface(), ResetDescriptorPool(gpu->device(), fDescPool, 0));
|
| +}
|
| +
|
| +void GrVkDescriptorPool::freeGPUData(const GrVkGpu* gpu) const {
|
| + // Destroying the VkDescriptorPool will automatically free and delete any VkDescriptorSets
|
| + // allocated from the pool.
|
| + GR_VK_CALL(gpu->vkInterface(), DestroyDescriptorPool(gpu->device(), fDescPool, nullptr));
|
| +}
|
| +
|
| +///////////////////////////////////////////////////////////////////////////////
|
| +
|
| +uint32_t GrVkDescriptorPool::DescriptorTypeCounts::numPoolSizes() const {
|
| + uint32_t count = 0;
|
| + for (int i = VK_DESCRIPTOR_TYPE_BEGIN_RANGE; i < VK_DESCRIPTOR_TYPE_END_RANGE; ++i) {
|
| + count += fDescriptorTypeCount[i] ? 1 : 0;
|
| + }
|
| + return count;
|
| +}
|
| +
|
| +bool GrVkDescriptorPool::DescriptorTypeCounts::isSuperSet(const DescriptorTypeCounts& that) const {
|
| + for (int i = VK_DESCRIPTOR_TYPE_BEGIN_RANGE; i < VK_DESCRIPTOR_TYPE_END_RANGE; ++i) {
|
| + if (that.fDescriptorTypeCount[i] > fDescriptorTypeCount[i]) {
|
| + return false;
|
| + }
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +void GrVkDescriptorPool::DescriptorTypeCounts::setTypeCount(VkDescriptorType type, uint8_t count) {
|
| + fDescriptorTypeCount[type] = count;
|
| +}
|
|
|