VkPipelineMultisampleStateCreateInfo.pSampleMask 的正确长度

Correct length of VkPipelineMultisampleStateCreateInfo.pSampleMask

与其他 Vulkan 的结构不同,其中所有 type pArrayName*; 都有一个具有数组长度的同伴 uint32_t arrayNameCount,结构 VkPipelineMultisampleStateCreateInfo 没有为字段 [=15= 定义任何 sampleMaskCount ].

Vulkan docs 对有效用法的说明如下:

"If pSampleMask is not NULL, pSampleMask must be a pointer to an array of ⌈rasterizationSamples / 32⌉ VkSampleMask values."

但是VkSampleCountFlagBits rasterizationSamples;是一个位值:

rasterizationSamples is a VkSampleCountFlagBits specifying the number of samples per pixel used in rasterization.

到目前为止一切顺利。

但 VkSampleCountFlagBits 是 2 值的幂的枚举,范围从 0x01 到 0x40(或十进制的 01 到 64)。可能的 ANDed 值范围从 01 到 127。 所以我猜从 1 到 31 的按位值将导致长度为 0 的 pSampleMask;从 32 到 63 的值将给出长度 2,依此类推。

对吗? 我感觉真的很蠢!

当他们在公式中说 "rasterizationSamples" 时,他们几乎肯定是指 "the number of rasterization samples",而不是 "the value of the rasterizationSamples bitmask"。

另外,⌈...⌉表示四舍五入到最接近的整数。

因此,对于从 1 到 32 的光栅化样本计数(位掩码值 0x01 到 0x20),pSampleMask 指向单个值。对于从 33 到 64 的光栅化样本计数(位掩码值 0x40),它指向一个包含两个值的数组。

我注意到位掩码的值与每个位的描述一致(64 的值为 64,依此类推)但这可能是巧合。

rasterizationSamples 必须只是 SampleCountFlagBits 值之一(不是 按位 | 值)。

简单地说,那么你需要pSampleMask数组(由32个b值组成)中的位数大于或等于rasterizationSamples指定的样本量。 (即一个 VkSampleMask := uint32_t 除了 SAMPLE_COUNT_64 需要两个)

有点滑稽的是,他们没有选择单身uint64_t。 (也许他们计划添加 128 个样本 :)