Commit 5f01324f by Shahbaz Youssefi Committed by Commit Bot

Vulkan: Allow descriptor pool to allocate different types

The internal shaders know exactly what mix of resources they use, so with this change they can make one allocation of multiple types. Bug: angleproject:2958 Change-Id: Ia6f03672b95af4be9618a2f5eeb41ef1c027e810 Reviewed-on: https://chromium-review.googlesource.com/c/1351116Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
parent 7310da33
...@@ -194,12 +194,15 @@ angle::Result ContextVk::initialize() ...@@ -194,12 +194,15 @@ angle::Result ContextVk::initialize()
{ {
TRACE_EVENT0("gpu.angle", "ContextVk::initialize"); TRACE_EVENT0("gpu.angle", "ContextVk::initialize");
// Note that this may reserve more sets than strictly necessary for a particular layout. // Note that this may reserve more sets than strictly necessary for a particular layout.
ANGLE_TRY(mDynamicDescriptorPools[kUniformsDescriptorSetIndex].init( VkDescriptorPoolSize uniformSetSize = {VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC,
this, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, GetUniformBufferDescriptorCount())); GetUniformBufferDescriptorCount()};
ANGLE_TRY(mDynamicDescriptorPools[kTextureDescriptorSetIndex].init( VkDescriptorPoolSize textureSetSize = {VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
this, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, mRenderer->getMaxActiveTextures())); mRenderer->getMaxActiveTextures()};
ANGLE_TRY(mDynamicDescriptorPools[kDriverUniformsDescriptorSetIndex].init( VkDescriptorPoolSize driverSetSize = {VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1};
this, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1)); ANGLE_TRY(mDynamicDescriptorPools[kUniformsDescriptorSetIndex].init(this, &uniformSetSize, 1));
ANGLE_TRY(mDynamicDescriptorPools[kTextureDescriptorSetIndex].init(this, &textureSetSize, 1));
ANGLE_TRY(
mDynamicDescriptorPools[kDriverUniformsDescriptorSetIndex].init(this, &driverSetSize, 1));
ANGLE_TRY(mQueryPools[gl::QueryType::AnySamples].init(this, VK_QUERY_TYPE_OCCLUSION, ANGLE_TRY(mQueryPools[gl::QueryType::AnySamples].init(this, VK_QUERY_TYPE_OCCLUSION,
vk::kDefaultOcclusionQueryPoolSize)); vk::kDefaultOcclusionQueryPoolSize));
......
...@@ -291,7 +291,7 @@ bool DescriptorPoolHelper::hasCapacity(uint32_t descriptorSetCount) const ...@@ -291,7 +291,7 @@ bool DescriptorPoolHelper::hasCapacity(uint32_t descriptorSetCount) const
} }
angle::Result DescriptorPoolHelper::init(Context *context, angle::Result DescriptorPoolHelper::init(Context *context,
const VkDescriptorPoolSize &poolSize, const std::vector<VkDescriptorPoolSize> &poolSizes,
uint32_t maxSets) uint32_t maxSets)
{ {
if (mDescriptorPool.valid()) if (mDescriptorPool.valid())
...@@ -304,8 +304,8 @@ angle::Result DescriptorPoolHelper::init(Context *context, ...@@ -304,8 +304,8 @@ angle::Result DescriptorPoolHelper::init(Context *context,
descriptorPoolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; descriptorPoolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
descriptorPoolInfo.flags = 0; descriptorPoolInfo.flags = 0;
descriptorPoolInfo.maxSets = maxSets; descriptorPoolInfo.maxSets = maxSets;
descriptorPoolInfo.poolSizeCount = 1u; descriptorPoolInfo.poolSizeCount = static_cast<uint32_t>(poolSizes.size());
descriptorPoolInfo.pPoolSizes = &poolSize; descriptorPoolInfo.pPoolSizes = poolSizes.data();
mFreeDescriptorSets = maxSets; mFreeDescriptorSets = maxSets;
...@@ -339,24 +339,27 @@ angle::Result DescriptorPoolHelper::allocateSets(Context *context, ...@@ -339,24 +339,27 @@ angle::Result DescriptorPoolHelper::allocateSets(Context *context,
// DynamicDescriptorPool implementation. // DynamicDescriptorPool implementation.
DynamicDescriptorPool::DynamicDescriptorPool() DynamicDescriptorPool::DynamicDescriptorPool()
: mMaxSetsPerPool(kDefaultDescriptorPoolMaxSets), mCurrentPoolIndex(0), mPoolSize{} : mMaxSetsPerPool(kDefaultDescriptorPoolMaxSets), mCurrentPoolIndex(0)
{} {}
DynamicDescriptorPool::~DynamicDescriptorPool() = default; DynamicDescriptorPool::~DynamicDescriptorPool() = default;
angle::Result DynamicDescriptorPool::init(ContextVk *contextVk, angle::Result DynamicDescriptorPool::init(Context *context,
VkDescriptorType descriptorType, const VkDescriptorPoolSize *setSizes,
uint32_t descriptorsPerSet) uint32_t setSizeCount)
{ {
ASSERT(mCurrentPoolIndex == 0); ASSERT(mCurrentPoolIndex == 0);
ASSERT(mDescriptorPools.empty() || (mDescriptorPools.size() == 1 && ASSERT(mDescriptorPools.empty() || (mDescriptorPools.size() == 1 &&
mDescriptorPools[0]->get().hasCapacity(mMaxSetsPerPool))); mDescriptorPools[0]->get().hasCapacity(mMaxSetsPerPool)));
mPoolSize.type = descriptorType; mPoolSizes.assign(setSizes, setSizes + setSizeCount);
mPoolSize.descriptorCount = descriptorsPerSet * mMaxSetsPerPool; for (uint32_t i = 0; i < setSizeCount; ++i)
{
mPoolSizes[i].descriptorCount *= mMaxSetsPerPool;
}
mDescriptorPools.push_back(new SharedDescriptorPoolHelper()); mDescriptorPools.push_back(new SharedDescriptorPoolHelper());
return mDescriptorPools[0]->get().init(contextVk, mPoolSize, mMaxSetsPerPool); return mDescriptorPools[0]->get().init(context, mPoolSizes, mMaxSetsPerPool);
} }
void DynamicDescriptorPool::destroy(VkDevice device) void DynamicDescriptorPool::destroy(VkDevice device)
...@@ -371,7 +374,7 @@ void DynamicDescriptorPool::destroy(VkDevice device) ...@@ -371,7 +374,7 @@ void DynamicDescriptorPool::destroy(VkDevice device)
mDescriptorPools.clear(); mDescriptorPools.clear();
} }
angle::Result DynamicDescriptorPool::allocateSets(ContextVk *contextVk, angle::Result DynamicDescriptorPool::allocateSets(Context *context,
const VkDescriptorSetLayout *descriptorSetLayout, const VkDescriptorSetLayout *descriptorSetLayout,
uint32_t descriptorSetCount, uint32_t descriptorSetCount,
SharedDescriptorPoolBinding *bindingOut, SharedDescriptorPoolBinding *bindingOut,
...@@ -381,7 +384,7 @@ angle::Result DynamicDescriptorPool::allocateSets(ContextVk *contextVk, ...@@ -381,7 +384,7 @@ angle::Result DynamicDescriptorPool::allocateSets(ContextVk *contextVk,
{ {
if (!mDescriptorPools[mCurrentPoolIndex]->get().hasCapacity(descriptorSetCount)) if (!mDescriptorPools[mCurrentPoolIndex]->get().hasCapacity(descriptorSetCount))
{ {
ANGLE_TRY(allocateNewPool(contextVk)); ANGLE_TRY(allocateNewPool(context));
} }
// Make sure the old binding knows the descriptor sets can still be in-use. We only need // Make sure the old binding knows the descriptor sets can still be in-use. We only need
...@@ -389,20 +392,20 @@ angle::Result DynamicDescriptorPool::allocateSets(ContextVk *contextVk, ...@@ -389,20 +392,20 @@ angle::Result DynamicDescriptorPool::allocateSets(ContextVk *contextVk,
// when we move to a new pool. // when we move to a new pool.
if (bindingOut->valid()) if (bindingOut->valid())
{ {
Serial currentSerial = contextVk->getRenderer()->getCurrentQueueSerial(); Serial currentSerial = context->getRenderer()->getCurrentQueueSerial();
bindingOut->get().updateSerial(currentSerial); bindingOut->get().updateSerial(currentSerial);
} }
bindingOut->set(mDescriptorPools[mCurrentPoolIndex]); bindingOut->set(mDescriptorPools[mCurrentPoolIndex]);
} }
return bindingOut->get().allocateSets(contextVk, descriptorSetLayout, descriptorSetCount, return bindingOut->get().allocateSets(context, descriptorSetLayout, descriptorSetCount,
descriptorSetsOut); descriptorSetsOut);
} }
angle::Result DynamicDescriptorPool::allocateNewPool(ContextVk *contextVk) angle::Result DynamicDescriptorPool::allocateNewPool(Context *context)
{ {
RendererVk *renderer = contextVk->getRenderer(); RendererVk *renderer = context->getRenderer();
bool found = false; bool found = false;
...@@ -425,10 +428,10 @@ angle::Result DynamicDescriptorPool::allocateNewPool(ContextVk *contextVk) ...@@ -425,10 +428,10 @@ angle::Result DynamicDescriptorPool::allocateNewPool(ContextVk *contextVk)
mCurrentPoolIndex = mDescriptorPools.size() - 1; mCurrentPoolIndex = mDescriptorPools.size() - 1;
static constexpr size_t kMaxPools = 99999; static constexpr size_t kMaxPools = 99999;
ANGLE_VK_CHECK(contextVk, mDescriptorPools.size() < kMaxPools, VK_ERROR_TOO_MANY_OBJECTS); ANGLE_VK_CHECK(context, mDescriptorPools.size() < kMaxPools, VK_ERROR_TOO_MANY_OBJECTS);
} }
return mDescriptorPools[mCurrentPoolIndex]->get().init(contextVk, mPoolSize, mMaxSetsPerPool); return mDescriptorPools[mCurrentPoolIndex]->get().init(context, mPoolSizes, mMaxSetsPerPool);
} }
void DynamicDescriptorPool::setMaxSetsPerPoolForTesting(uint32_t maxSetsPerPool) void DynamicDescriptorPool::setMaxSetsPerPoolForTesting(uint32_t maxSetsPerPool)
......
...@@ -102,7 +102,9 @@ class DescriptorPoolHelper ...@@ -102,7 +102,9 @@ class DescriptorPoolHelper
bool valid() { return mDescriptorPool.valid(); } bool valid() { return mDescriptorPool.valid(); }
bool hasCapacity(uint32_t descriptorSetCount) const; bool hasCapacity(uint32_t descriptorSetCount) const;
angle::Result init(Context *context, const VkDescriptorPoolSize &poolSize, uint32_t maxSets); angle::Result init(Context *context,
const std::vector<VkDescriptorPoolSize> &poolSizes,
uint32_t maxSets);
void destroy(VkDevice device); void destroy(VkDevice device);
angle::Result allocateSets(Context *context, angle::Result allocateSets(Context *context,
...@@ -130,14 +132,16 @@ class DynamicDescriptorPool final : angle::NonCopyable ...@@ -130,14 +132,16 @@ class DynamicDescriptorPool final : angle::NonCopyable
~DynamicDescriptorPool(); ~DynamicDescriptorPool();
// The DynamicDescriptorPool only handles one pool size at this time. // The DynamicDescriptorPool only handles one pool size at this time.
angle::Result init(ContextVk *contextVk, // Note that setSizes[i].descriptorCount is expected to be the number of descriptors in
VkDescriptorType descriptorType, // an individual set. The pool size will be calculated accordingly.
uint32_t descriptorsPerSet); angle::Result init(Context *context,
const VkDescriptorPoolSize *setSizes,
uint32_t setSizeCount);
void destroy(VkDevice device); void destroy(VkDevice device);
// We use the descriptor type to help count the number of free sets. // We use the descriptor type to help count the number of free sets.
// By convention, sets are indexed according to the constants in vk_cache_utils.h. // By convention, sets are indexed according to the constants in vk_cache_utils.h.
angle::Result allocateSets(ContextVk *contextVk, angle::Result allocateSets(Context *context,
const VkDescriptorSetLayout *descriptorSetLayout, const VkDescriptorSetLayout *descriptorSetLayout,
uint32_t descriptorSetCount, uint32_t descriptorSetCount,
SharedDescriptorPoolBinding *bindingOut, SharedDescriptorPoolBinding *bindingOut,
...@@ -147,12 +151,12 @@ class DynamicDescriptorPool final : angle::NonCopyable ...@@ -147,12 +151,12 @@ class DynamicDescriptorPool final : angle::NonCopyable
void setMaxSetsPerPoolForTesting(uint32_t maxSetsPerPool); void setMaxSetsPerPoolForTesting(uint32_t maxSetsPerPool);
private: private:
angle::Result allocateNewPool(ContextVk *contextVk); angle::Result allocateNewPool(Context *context);
uint32_t mMaxSetsPerPool; uint32_t mMaxSetsPerPool;
size_t mCurrentPoolIndex; size_t mCurrentPoolIndex;
std::vector<SharedDescriptorPoolHelper *> mDescriptorPools; std::vector<SharedDescriptorPoolHelper *> mDescriptorPools;
VkDescriptorPoolSize mPoolSize; std::vector<VkDescriptorPoolSize> mPoolSizes;
}; };
template <typename Pool> template <typename Pool>
......
...@@ -53,14 +53,16 @@ class VulkanUniformUpdatesTest : public ANGLETest ...@@ -53,14 +53,16 @@ class VulkanUniformUpdatesTest : public ANGLETest
rx::vk::DynamicDescriptorPool *uniformPool = rx::vk::DynamicDescriptorPool *uniformPool =
contextVk->getDynamicDescriptorPool(rx::kUniformsDescriptorSetIndex); contextVk->getDynamicDescriptorPool(rx::kUniformsDescriptorSetIndex);
uniformPool->setMaxSetsPerPoolForTesting(kMaxSetsForTesting); uniformPool->setMaxSetsPerPoolForTesting(kMaxSetsForTesting);
(void)uniformPool->init(contextVk, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, VkDescriptorPoolSize uniformSetSize = {VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC,
rx::GetUniformBufferDescriptorCount()); rx::GetUniformBufferDescriptorCount()};
(void)uniformPool->init(contextVk, &uniformSetSize, 1);
rx::vk::DynamicDescriptorPool *texturePool = rx::vk::DynamicDescriptorPool *texturePool =
contextVk->getDynamicDescriptorPool(rx::kTextureDescriptorSetIndex); contextVk->getDynamicDescriptorPool(rx::kTextureDescriptorSetIndex);
texturePool->setMaxSetsPerPoolForTesting(kMaxSetsForTesting); texturePool->setMaxSetsPerPoolForTesting(kMaxSetsForTesting);
(void)texturePool->init(contextVk, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VkDescriptorPoolSize textureSetSize = {VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
contextVk->getRenderer()->getMaxActiveTextures()); contextVk->getRenderer()->getMaxActiveTextures()};
(void)texturePool->init(contextVk, &textureSetSize, 1);
} }
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment