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