【问题标题】:Determing the highest possible color and depth attachement sampled count in Vulkan在 Vulkan 中确定可能的最高颜色和深度附件样本数
【发布时间】:2020-12-04 15:26:51
【问题描述】:

我是否需要将 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,而这又只是typedefuint32_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 */;

【问题讨论】:

  • 这就是我希望你必须实现的。我想您将在代码库中进行大量整数掩码与枚举之间的映射,因此您可能需要考虑制作一些辅助方法。我有一个基于 Java 的 Vulkan 实现,可以做到这一点。

标签: graphics vulkan


【解决方案1】:

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

【讨论】:

  • 所以,一般来说,只支持 $2$ 的幂,对吧?
  • 是的,虽然我仍然会使用枚举位掩码而不是任何二次幂数学,只是为了使代码的目的更清晰。
  • 我在问因为我需要采用一个接口,它给我一个uint32_t 用于样本计数。我想最好的解决方案是&这个样本计数与枚举位掩码并使用最大的非零。
  • @0xbadf00d 是的,这正是我希望您必须采用的方法 - 基本上是位掩码上的 for 循环测试每个以枚举来自 VkSampleCountFlagBits 的值,然后您可以应用您的逻辑来解决颜色和深度附件的最高值。
  • 请注意我的编辑。我需要这样做吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 2021-06-02
相关资源
最近更新 更多