Graphics 确定Vulkan中可能的最高颜色和深度附着采样计数

Graphics 确定Vulkan中可能的最高颜色和深度附着采样计数,graphics,vulkan,Graphics,Vulkan,我是否需要将VkAttachmentDescription::samples的值设置为2的幂,或者是允许的任意值,只要它们不超过硬件支持的最大值 我真的很困惑。samples字段的类型为VkSampleCountFlagBits,其声明方式如下 typedef enum VkSampleCountFlagBits { VK_SAMPLE_COUNT_1_BIT = 0x00000001, VK_SAMPLE_COUNT_2_BIT = 0x00000002, VK_SAM

我是否需要将
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
结构包含
framebufferColorSampleCounts
framebufferDepthSampleCounts
字段,它们属于
VkSampleCountFlags
类型,而这又只是
uint32
typedef

确定这些字段中的最高位以计算最大可用采样计数。我真的不明白。例如,如果在这些字段中都设置了
VK\u SAMPLE\u COUNT\u 16位
VK\u SAMPLE\u COUNT\u 1位
,该怎么办?这难道不意味着最大可用采样数至少为17吗

在一天结束时,我需要做的是,给定一个
uint32请求的\u采样的\u计数
,确定
request的\u采样的\u计数
是否是
VkAttachmentDescription::samples
颜色和深度附件的可能值,如果不是,小于
请求的\u采样\u计数
的最大可能值是多少

编辑: 假设我已经给出了一个
std::uint32\u t sample\u count
并且从物理设备属性中,
VkSampleCountFlags帧缓冲区\u color\u sample\u count
并希望计算
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!)

因此,通常只支持$2$的幂,对吗,虽然我仍然会使用枚举位掩码,而不是两个数学的任何幂,只是为了使代码的目的更清楚。我问的原因是我需要采用一个接口,该接口为样本计数提供一个
uint32\t
。我想最好的解决方案是
&
对枚举位掩码进行此样本计数,并使用最大的非零值。@0xbadf00d是的,这正是我希望您必须采取的方法-基本上是位掩码上的for循环,测试每个位掩码以枚举
VkSampleCountFlagBits
中的值,然后您可以应用逻辑计算出最高的颜色和深度附件。请注意我的编辑。这就是我需要做的吗?这就是我希望你必须实现的是的。我想你会对你的代码库中的枚举进行很多整型掩码的映射,所以你可能想考虑编写一些辅助方法。我有一个基于Java的Vulkan实现,它就是这样做的。