从外部API比较两个相同类型的结构

n

所以基本上我想比较VkPhysicalDeviceFeaturesVulkan中的两个,一个VkPhysicalDevice我正在看的,另一个与我实际需要的一组功能相对应。一个VkPhysicalDeviceFeatures结构包含VkBool32成员(它们的类型定义uint32_t),但福尔康的每个次要版本可以添加未知数量的这些特征。我想做的只是简单地将每个结构的成员相互比较,而不是为了平等,而是逻辑比较。如果物理设备结构中的相应成员为false,但是我的结构对该成员具有true,则比较应返回false。

我能想到的唯一方法就是此答案发布的内容:

bool hasRequiredFeatures(VkPhysicalDevice physical_device,
                              VkPhysicalDeviceFeatures required_features) {

    VkPhysicalDeviceFeatures physical_device_features = getSupportedFeatures(physical_device);
    std::size_t struct_length = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);

    auto physical_device_features_bool_ptr = reinterpret_cast<VkBool32*>(&physical_device_features);
    auto required_features_bool_ptr = reinterpret_cast<VkBool32*>(&required_features);
    for(std::size_t i = 0; i < struct_length; ++i){
        if(physical_device_features_bool_ptr[i] == VK_FALSE && required_features_bool_ptr[i] == VK_TRUE){
            return false;
        }
    }
    return true;
}

这就是我想要的(尽管最好有一种方法来查看哪个特定名称的成员未通过比较,但是我想如果没有反射,那是不可能的),但是我不认为C ++可以保证这样严格的对齐?我有跨平台的方式来完成此任务吗?

尼科尔·波拉斯(Nicol Bolas)

您的方法存在一个大问题,该问题与C ++无关,而与Vulkan无关。特别:

次要版本的vulkan可以添加未知数量的这些结构

这告诉我,您打算将此类技术VkPhysicalDeviceFeatures2以及可能出现在其pNext链中的任何功能结构应用到因此,“这些结构的数目未知”。

好吧,这就是问题:VkPhysicalDeviceFeatures2不仅是一堆VkBools。它是可扩展的Vulkan结构,这意味着它以此类结构共有的sTypepNext字段开头1.0版之后的Vulkan设备功能结构也是如此。

可以完成您在1.0版之后的功能结构中所陈述的功能的代码必须能够采用整个pNext功能结构链并对其进行测试。为了做到这一点,您必须知道它们是什么从一个指针到任意数据,都无法查询该数据包含X个VkBools。

为了使这项工作有效,您将需要能够将sType映射到该结构的大小。因此,它不能自动扩展(而且,C ++反射不能解决此问题;它不知道void *pNext指向的结构);这将需要一定程度的手动维护。

幸运的是,Vulkan XML规范描述文件清楚地指定了特定pNext链中可以存在的结构因此,您可以编写一个工具来加载XML,查找VkPhysicalDeviceFeatures2并处理其pNext链中出现的所有结构(这部分说起来容易做起来难,因为XML格式仅由Khronos自己的工具处理),以查找哪个结构可用,并生成所需的C ++信息。我相信您可以使用任何脚本语言相对轻松地编写这样的东西。

但是,由于您已经获得了(准合理的)XML中的结构定义,并且您已经获得了将无论如何都将生成一些C ++代码的工具,您只需生成实际的比较逻辑即可也就是说,与其直接手写成员之间的比较,不如生成成员之间的比较。您甚至可以获取不匹配的成员名称。

如果要处理任意的pNext-chain功能,则需要某种生成器工具。而且,如果您仍然需要生成器工具,只需使用它即可解决整个问题。

现在,重要的是要意识到,假设hasRequiredFeatures实现的生成代码将必须是半复杂的。如果允许完整pNext的结构链,则需要构建自己的等效结构链以用于从Vulkan查询。那并不是完全无关紧要的。

您将需要遍历整个pNext链并检查sType每个结构字段。但是,当然pNextvoid*,因此您将不得不撒谎/欺骗C ++的规则以阅读该sType领域。基本上,你必须reinterpret_castvoid*VkStructureType*,阅读的价值,把它比对所有与您合作的可能性,并从那里继续。您应该跳过所有sType您不知道的内容,这将需要做更多的C ++技巧。

但是您使用的是低级API。违反C ++规则只是您必须习惯这里的事情。

对于每个这样的结构,您需要分配一个匹配的结构,sType适当地填充它,然后将其添加到pNext要构建链中。

构建完所有这些功能之后,您可以进行Vulkan调用,进行比较,收集数据并最后删除整个结构链。


如果您的目标确实是坚持使用公正VkPhysicalDeviceFeatures而不是可扩展的结构,而您只想使用C ++便携式方法比较此类结构,则将memcpy它们放入一个VkBool数组中,并比较两个数组是否不匹配。这两种类型都是微不足道的可复制的,因此做到这一点并不是表面上违法的。

此代码尚未编译或测试。

bool hasRequiredFeatures(VkPhysicalDevice physical_device,
                              VkPhysicalDeviceFeatures required_features)
{

    constexpr auto feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
    using FeatureArray = std::array<VkBool, feature_count>;

    auto physical_device_features = getSupportedFeatures(physical_device);

    FeatureArray required;
    memcpy(&required, &required_features, sizeof(FeatureArray));

    FeatureArray retrieved;
    memcpy(&retrieved, &physical_device_features, sizeof(FeatureArray));

    bool did_mismatch = false;
    for(auto it_pair = std::mismatch(required.begin(), required.end(), retrieved.begin());
        it_pair.first != required.end();
        it_pair = std::mismatch(it_pair.first, required.end(), it_pair.second))
    {
        did_mismatch = true
        auto mismatch_index = it_pair.first - required.begin();
        //Do something with mismatch_index
    }

    return did_mismatch;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

比较两个相同类型的对象的列表

来自分类Dev

比较两个相同类型的对象列表

来自分类Dev

对两个相同类型结构的值求和

来自分类Dev

Java:比较两个具有相同值的不同类型的对象,返回true

来自分类Dev

比较来自相同类型的两个对象的数据成员的最简单方法

来自分类Dev

如何创建一个接受两个相同类型的对象,一个属性并比较值的方法

来自分类Dev

比较不同类型的两个对象的正确方法

来自分类Dev

在for循环中修改两个相同类型的向量

来自分类Dev

Linq连接两个相同类型的对象

来自分类Dev

Linq连接两个相同类型的对象

来自分类Dev

如何注入两个相同类型的EJB?

来自分类Dev

在for循环中修改两个相同类型的向量

来自分类Dev

如何使用SemanticComparison比较两个匿名类型或两个不同类型的集合

来自分类Dev

比较相同结构的两个不同大小的向量

来自分类Dev

查询以比较具有相同结构的两个表?

来自分类Dev

比较Spark中两个相同结构的数据框

来自分类Dev

比较相同结构的两个不同大小的向量

来自分类Dev

Java-具有相同名称,相同参数的不同类型的两个方法,但是这些类型在层次结构上相关

来自分类Dev

NoSuchBeanDefinitionException:没有定义类型的唯一bean。而两个相同类型的豆

来自分类Dev

警告:条件中指针类型不匹配。当使用两个相同类型的值时

来自分类Dev

如何合并两个扩展/继承相同类型的不同数组类型?

来自分类Dev

NoSuchBeanDefinitionException:没有定义类型的唯一bean。而两个相同类型的豆

来自分类Dev

如何在不同的头文件中具有相同类型和名称的两个结构而不会发生冲突?

来自分类Dev

可以将两个相同类型的连续数组视为一个吗?

来自分类Dev

PHP-比较两个不同类型的变量错误或问题

来自分类Dev

比较两个结构相同但数据不相同的Access表

来自分类Dev

使用@Autowired注入两个相同类型的不同实例

来自分类Dev

获取相同类型的对象的两个列表之间的差异

来自分类Dev

关于两个相同类型的并集,C标准怎么说?

Related 相关文章

  1. 1

    比较两个相同类型的对象的列表

  2. 2

    比较两个相同类型的对象列表

  3. 3

    对两个相同类型结构的值求和

  4. 4

    Java:比较两个具有相同值的不同类型的对象,返回true

  5. 5

    比较来自相同类型的两个对象的数据成员的最简单方法

  6. 6

    如何创建一个接受两个相同类型的对象,一个属性并比较值的方法

  7. 7

    比较不同类型的两个对象的正确方法

  8. 8

    在for循环中修改两个相同类型的向量

  9. 9

    Linq连接两个相同类型的对象

  10. 10

    Linq连接两个相同类型的对象

  11. 11

    如何注入两个相同类型的EJB?

  12. 12

    在for循环中修改两个相同类型的向量

  13. 13

    如何使用SemanticComparison比较两个匿名类型或两个不同类型的集合

  14. 14

    比较相同结构的两个不同大小的向量

  15. 15

    查询以比较具有相同结构的两个表?

  16. 16

    比较Spark中两个相同结构的数据框

  17. 17

    比较相同结构的两个不同大小的向量

  18. 18

    Java-具有相同名称,相同参数的不同类型的两个方法,但是这些类型在层次结构上相关

  19. 19

    NoSuchBeanDefinitionException:没有定义类型的唯一bean。而两个相同类型的豆

  20. 20

    警告:条件中指针类型不匹配。当使用两个相同类型的值时

  21. 21

    如何合并两个扩展/继承相同类型的不同数组类型?

  22. 22

    NoSuchBeanDefinitionException:没有定义类型的唯一bean。而两个相同类型的豆

  23. 23

    如何在不同的头文件中具有相同类型和名称的两个结构而不会发生冲突?

  24. 24

    可以将两个相同类型的连续数组视为一个吗?

  25. 25

    PHP-比较两个不同类型的变量错误或问题

  26. 26

    比较两个结构相同但数据不相同的Access表

  27. 27

    使用@Autowired注入两个相同类型的不同实例

  28. 28

    获取相同类型的对象的两个列表之间的差异

  29. 29

    关于两个相同类型的并集,C标准怎么说?

热门标签

归档