天狗会議録 Posts Pages About

VkDescriptorPoolSizeの誤りが検出されない

#bug #vulkan
2023/5/17

概要

VkDescriptorPoolSize構造体は、ディスクリプタプールに含まれるディスクリプタの種類とそれぞれの数を指定する。 VkDescriptorPoolCreateInfo構造体へ配列で渡され、vkCreateDescriptorPool関数によりディスクリプタプールオブジェクトが生成される。 このディスクリプタプールオブジェクトをもとに、vkAllocateDescriptorSets関数によりメモリを確保する。

状況に対して誤ったVkDescriptorPoolSize構造体配列を作成しても、次の環境ではエラーが検出されず、かつ期待通りの結果が得られた。

また、以下の環境では、vkAllocateDescriptorSets関数の返り値が VK_ERROR_OUT_OF_POOL_MEMORY となった。

詳細

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