1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci* Copyright 2016 Google Inc.
3cb93a386Sopenharmony_ci*
4cb93a386Sopenharmony_ci* Use of this source code is governed by a BSD-style license that can be
5cb93a386Sopenharmony_ci* found in the LICENSE file.
6cb93a386Sopenharmony_ci*/
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci#include "src/gpu/vk/GrVkDescriptorPool.h"
9cb93a386Sopenharmony_ci
10cb93a386Sopenharmony_ci#include "include/private/SkTemplates.h"
11cb93a386Sopenharmony_ci#include "src/gpu/vk/GrVkGpu.h"
12cb93a386Sopenharmony_ci
13cb93a386Sopenharmony_ci
14cb93a386Sopenharmony_ciGrVkDescriptorPool* GrVkDescriptorPool::Create(GrVkGpu* gpu, VkDescriptorType type,
15cb93a386Sopenharmony_ci                                               uint32_t count) {
16cb93a386Sopenharmony_ci    VkDescriptorPoolSize poolSize;
17cb93a386Sopenharmony_ci    memset(&poolSize, 0, sizeof(VkDescriptorPoolSize));
18cb93a386Sopenharmony_ci    poolSize.descriptorCount = count;
19cb93a386Sopenharmony_ci    poolSize.type = type;
20cb93a386Sopenharmony_ci
21cb93a386Sopenharmony_ci    VkDescriptorPoolCreateInfo createInfo;
22cb93a386Sopenharmony_ci    memset(&createInfo, 0, sizeof(VkDescriptorPoolCreateInfo));
23cb93a386Sopenharmony_ci    createInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
24cb93a386Sopenharmony_ci    createInfo.pNext = nullptr;
25cb93a386Sopenharmony_ci    createInfo.flags = 0;
26cb93a386Sopenharmony_ci    // This is an over/conservative estimate since each set may contain more than count descriptors.
27cb93a386Sopenharmony_ci    createInfo.maxSets = count;
28cb93a386Sopenharmony_ci    createInfo.poolSizeCount = 1;
29cb93a386Sopenharmony_ci    createInfo.pPoolSizes = &poolSize;
30cb93a386Sopenharmony_ci
31cb93a386Sopenharmony_ci    VkDescriptorPool pool;
32cb93a386Sopenharmony_ci    VkResult result;
33cb93a386Sopenharmony_ci    GR_VK_CALL_RESULT(gpu, result, CreateDescriptorPool(gpu->device(), &createInfo, nullptr,
34cb93a386Sopenharmony_ci                                                        &pool));
35cb93a386Sopenharmony_ci    if (result != VK_SUCCESS) {
36cb93a386Sopenharmony_ci        return nullptr;
37cb93a386Sopenharmony_ci    }
38cb93a386Sopenharmony_ci    return new GrVkDescriptorPool(gpu, pool, type, count);
39cb93a386Sopenharmony_ci}
40cb93a386Sopenharmony_ci
41cb93a386Sopenharmony_ciGrVkDescriptorPool::GrVkDescriptorPool(const GrVkGpu* gpu, VkDescriptorPool pool,
42cb93a386Sopenharmony_ci                                       VkDescriptorType type, uint32_t count)
43cb93a386Sopenharmony_ci        : INHERITED(gpu), fType(type), fCount(count), fDescPool(pool) {}
44cb93a386Sopenharmony_ci
45cb93a386Sopenharmony_cibool GrVkDescriptorPool::isCompatible(VkDescriptorType type, uint32_t count) const {
46cb93a386Sopenharmony_ci    return fType == type && count <= fCount;
47cb93a386Sopenharmony_ci}
48cb93a386Sopenharmony_ci
49cb93a386Sopenharmony_civoid GrVkDescriptorPool::freeGPUData() const {
50cb93a386Sopenharmony_ci    // Destroying the VkDescriptorPool will automatically free and delete any VkDescriptorSets
51cb93a386Sopenharmony_ci    // allocated from the pool.
52cb93a386Sopenharmony_ci    GR_VK_CALL(fGpu->vkInterface(), DestroyDescriptorPool(fGpu->device(), fDescPool, nullptr));
53cb93a386Sopenharmony_ci}
54