VkDescriptorPoolSizeの誤りが検出されない
概要
VkDescriptorPoolSize構造体は、ディスクリプタプールに含まれるディスクリプタの種類とそれぞれの数を指定する。 VkDescriptorPoolCreateInfo構造体へ配列で渡され、vkCreateDescriptorPool関数によりディスクリプタプールオブジェクトが生成される。 このディスクリプタプールオブジェクトをもとに、vkAllocateDescriptorSets関数によりメモリを確保する。
状況に対して誤ったVkDescriptorPoolSize構造体配列を作成しても、次の環境ではエラーが検出されず、かつ期待通りの結果が得られた。
- OS: Windows 10, Ubuntu 22.04.1
- CPU: AMD Ryzen 5 3600
- GPU: NVIDIA GeForce GTX 1650
また、以下の環境では、vkAllocateDescriptorSets関数の返り値が VK_ERROR_OUT_OF_POOL_MEMORY となった。
- OS: Windows 10, Archlinux
- CPU: AMD Ryzen 5 3500U
- GPU: Radeon Vega 8 Graphics
詳細
一つの Uniform Buffer と一つの Combined Image Sampler をバインディングとして持つとすると、 VkDescriptorPoolSize構造体配列は、以下のようにならなければならない。
const VkDescriptorPoolSize desc_pool_sizes[] = {
{
VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1,
},
{
VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
1,
},
};
しかし、以下のようにしても異常が検出されず、かつ期待通りに動作してしまった。
const VkDescriptorPoolSize desc_pool_sizes[] = {
{
VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
2,
},
};
また、以下のようにしても同様である。
VkDescriptorPoolSize desc_pool_sizes[] = {
{
VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1,
},
{
VK_DESCRIPTOR_TYPE_SAMPLER,
1,
},
};
非内蔵GPUでは、上手いことしてくれるのかもしれないが、バグの発見が遅れるのでやめてほしい。
■