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 #include "GrVkDescriptorPool.h"
      9 
     10 #include "GrVkGpu.h"
     11 #include "SkTemplates.h"
     12 
     13 
     14 GrVkDescriptorPool::GrVkDescriptorPool(const GrVkGpu* gpu, const DescriptorTypeCounts& typeCounts)
     15     : INHERITED()
     16     , fTypeCounts(typeCounts) {
     17     int numPools = fTypeCounts.numPoolSizes();
     18     SkAutoTDeleteArray<VkDescriptorPoolSize> poolSizes(new VkDescriptorPoolSize[numPools]);
     19     int currentPool = 0;
     20     for (int i = VK_DESCRIPTOR_TYPE_BEGIN_RANGE; i < VK_DESCRIPTOR_TYPE_END_RANGE; ++i) {
     21         if (fTypeCounts.fDescriptorTypeCount[i]) {
     22             VkDescriptorPoolSize& poolSize = poolSizes.get()[currentPool++];
     23             poolSize.type = (VkDescriptorType)i;
     24             poolSize.descriptorCount = fTypeCounts.fDescriptorTypeCount[i];
     25         }
     26     }
     27     SkASSERT(currentPool == numPools);
     28 
     29     VkDescriptorPoolCreateInfo createInfo;
     30     memset(&createInfo, 0, sizeof(VkDescriptorPoolCreateInfo));
     31     createInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
     32     createInfo.pNext = nullptr;
     33     createInfo.flags = 0;
     34     createInfo.maxSets = 2;  // Currently we allow one set for samplers and one set for uniforms
     35     createInfo.poolSizeCount = numPools;
     36     createInfo.pPoolSizes = poolSizes.get();
     37 
     38     GR_VK_CALL_ERRCHECK(gpu->vkInterface(), CreateDescriptorPool(gpu->device(),
     39                                                                  &createInfo,
     40                                                                  nullptr,
     41                                                                  &fDescPool));
     42 }
     43 
     44 bool GrVkDescriptorPool::isCompatible(const DescriptorTypeCounts& typeCounts) const {
     45     return fTypeCounts.isSuperSet(typeCounts);
     46 }
     47 
     48 void GrVkDescriptorPool::reset(const GrVkGpu* gpu) {
     49     GR_VK_CALL_ERRCHECK(gpu->vkInterface(), ResetDescriptorPool(gpu->device(), fDescPool, 0));
     50 }
     51 
     52 void GrVkDescriptorPool::freeGPUData(const GrVkGpu* gpu) const {
     53     // Destroying the VkDescriptorPool will automatically free and delete any VkDescriptorSets
     54     // allocated from the pool.
     55     GR_VK_CALL(gpu->vkInterface(), DestroyDescriptorPool(gpu->device(), fDescPool, nullptr));
     56 }
     57 
     58 ///////////////////////////////////////////////////////////////////////////////
     59 
     60 int GrVkDescriptorPool::DescriptorTypeCounts::numPoolSizes() const {
     61     int count = 0;
     62     for (int i = VK_DESCRIPTOR_TYPE_BEGIN_RANGE; i < VK_DESCRIPTOR_TYPE_END_RANGE; ++i) {
     63         count += fDescriptorTypeCount[i] ? 1 : 0;
     64     }
     65     return count;
     66 }
     67 
     68 bool GrVkDescriptorPool::DescriptorTypeCounts::isSuperSet(const DescriptorTypeCounts& that) const {
     69     for (int i = VK_DESCRIPTOR_TYPE_BEGIN_RANGE; i < VK_DESCRIPTOR_TYPE_END_RANGE; ++i) {
     70         if (that.fDescriptorTypeCount[i] > fDescriptorTypeCount[i]) {
     71             return false;
     72         }
     73     }
     74     return true;
     75 }
     76 
     77 void GrVkDescriptorPool::DescriptorTypeCounts::setTypeCount(VkDescriptorType type, uint8_t count) {
     78     fDescriptorTypeCount[type] = count;
     79 }
     80