正确长度的VkPipelineMultisampleStateCreateInfo.pSampleMask

时间:2016-08-10 01:26:51

标签: c graphics vulkan

与其他Vulkan的结构不同,所有type pArrayName*;都有一个带有数组长度的伴随uint32_t arrayNameCount,结构VkPipelineMultisampleStateCreateInfo没有为字段sampleMaskCount定义任何const VkSampleMask* pSampleMask;

Vulkan docs说明了以下有效用法:

  

“如果pSampleMask不是NULL,则pSampleMask必须是指向⌈rasterizationSamples/32⌉VkSampleMask值数组的指针。”

VkSampleCountFlagBits rasterizationSamples;是一个按位值:

  

rasterizationSamples是一个VkSampleCountFlagBits,用于指定光栅化中每个像素的采样数。

到目前为止一切顺利。

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

这是对的吗? 我真的很傻了!

2 个答案:

答案 0 :(得分:5)

当他们说" rasterizationSamples"在公式中,它们几乎肯定意味着"光栅化样本的数量",而不是" rasterizationSamples位掩码的值"。

此外,⌈...⌉表示向上舍入到最接近的整数。

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

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

答案 1 :(得分:1)

rasterizationSamples必须只是其中一个SampleCountFlagBits值(一个bitwised |值)。

简单来说,您需要pSampleMask数组(由32 b值组成)中的位数大于或等于rasterizationSamples指定的样本数量。 (即除VkSampleMask := uint32_t之外的所有人SAMPLE_COUNT_64,其中需要两个{/ p>

他们没有为此目的选择单个uint64_t,这有点可笑。 (也许他们计划增加128个样本:)