我们可以在CPP中实现金属框架吗

问题描述 投票:0回答:3

我计划在 CPP 中实现 iOS Metal 库。该库旨在公开可用于其他模块的高级 API。 Metal 是否公开了我可以在我的库中使用的 CPP 级别 api?

c++ metal
3个回答
1
投票

如果您想使用 C++ 来实现您的逻辑,您可以使用 Objective C++。没有纯C++接口。


1
投票

Apple 提供了 metal-cpp,它可以从 C++ 直接访问 Metal API。一个缺点似乎是必须使用手动引用计数,就像过去糟糕的日子一样。

您需要非常小心,任何持有原始

MTL::
对象的 C++ 对象要么不允许复制,要么提供复制构造函数,以及可选的复制运算符。

struct TextureUpload {
    MTL::Buffer* srcBuffer;
    MTL::Texture* dstTexture;

    TextureUpload(MTL::Buffer* srcBuffer, MTL::Texture* dstTexture) :
        srcBuffer{ srcBuffer->retain() },
        dstTexture{ dstTexture->retain() } {
    }
    TextureUpload(TextureUpload const& other) :
        srcBuffer{ other.srcBuffer->retain() },
        dstTexture{ other.dstTexture->retain() } {
    }
    TextureUpload& operator=(TextureUpload const&) = delete;
    ~TextureUpload() {
        srcBuffer->release();
        dstTexture->release();
    }
};

这样,当您无意中复制对象的实例并且在 Metal 对象上调用

release()
时,编译器会告诉您。

我还注意到获取

MTKView
渲染通道描述符和当前可绘制对象时出现问题,直到我在项目中禁用 ARC 并在整个项目中使用 MRR。


0
投票

您需要阅读 C++ 编译器的文档以及处理 iOS Metal 的编译器链接器

另外,请仔细阅读 iOS Metal 的文档。

您可能还需要阅读相关的 ABI。您可能需要使用 GNU binutils 和/或 GNU GDB 来探索。

如果您有一些 C++ 代码或 Objective C 代码可以由最新的 GCC 编译器(特别是 GNU GCC,例如 2020 年 11 月的 GCC 10)编译,您可以考虑编写 GCC 插件 来生成所需的粘合 C++ 或 Objective C 代码,有点像 SWIG 那样。

并且 SWIG 是开源的,您可以考虑根据您的需求对其进行改进。

或者,考虑使用 GPP 生成一些粘合(C++ 或 Objective C)代码(或者使用 PythonGuile 编写的脚本,或者在 GNU bisonANTLR 的帮助下编码的 C++ 元程序)

© www.soinside.com 2019 - 2024. All rights reserved.