天狗会議録 Posts Pages About

VkDescriptorPoolSizeの誤りが検出されない

#bug#vulkan2023/5/17

概要

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では、上手いことしてくれるのかもしれないが、バグの発見が遅れるのでやめてほしい。