确定 Vulkan 中可能的最高颜色和深度附件样本数

Determing the highest possible color and depth attachement sampled count in Vulkan

我是否需要将 VkAttachmentDescription::samples 的值设置为 2 的幂,或者是否允许任意值,只要它们不超过硬件支持的最大值?

我对此真的很困惑。 samples字段是VkSampleCountFlagBits类型,声明方式如下

typedef enum VkSampleCountFlagBits {
    VK_SAMPLE_COUNT_1_BIT = 0x00000001,
    VK_SAMPLE_COUNT_2_BIT = 0x00000002,
    VK_SAMPLE_COUNT_4_BIT = 0x00000004,
    VK_SAMPLE_COUNT_8_BIT = 0x00000008,
    VK_SAMPLE_COUNT_16_BIT = 0x00000010,
    VK_SAMPLE_COUNT_32_BIT = 0x00000020,
    VK_SAMPLE_COUNT_64_BIT = 0x00000040,
    VK_SAMPLE_COUNT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkSampleCountFlagBits;

另一方面,VkPhysicalDeviceLimits 结构包含 framebufferColorSampleCountsframebufferDepthSampleCounts 字段,它们属于 VkSampleCountFlags 类型,而这又只是一个 typedef 对于 uint32_t.

vulkan-tutorial page on multisampling 确定这些字段中的最高位以计算最大可用采样数。我其实不明白这个。例如,如果 VK_SAMPLE_COUNT_16_BITVK_SAMPLE_COUNT_1_BIT 都设置在这些字段中怎么办?这是否意味着最大可用采样数至少为 17?

一天结束时我需要做的是,给定一个 uint32_t requested_sampled_count,确定 requested_sampled_count 是否是 VkAttachmentDescription::samples 的可能值 颜色和深度附件,如果不是,小于 requested_sampled_count 的最大可能值是多少。

编辑:

假设我已经给出了 std::uint32_t sample_count,并且根据物理设备属性,VkSampleCountFlags framebuffer_color_sample_counts 并且想要计算 VkSampleCountFlagBits samples。我需要按以下方式进行吗?

if (sample_count > 64)
    /* error */;
if (sample_count > 32)
    samples = VK_SAMPLE_COUNT_32_BIT;
else if (sample_count > 16)
    samples = VK_SAMPLE_COUNT_16_BIT;
else if (sample_count > 8)
    samples = VK_SAMPLE_COUNT_8_BIT;
else if (sample_count > 4)
    samples = VK_SAMPLE_COUNT_4_BIT;
else if (sample_count > 2)
    samples = VK_SAMPLE_COUNT_2_BIT;
else if (sample_count == 1)
    samples = VK_SAMPLE_COUNT_1_BIT;
else
    /* error */;

VkSampleCountFlagsBits 枚举中的样本计数是附件中采样位数的 可用 设置的位掩码,因此在您的示例中硬件支持 一个 16 个样本(不是 17!)