我计划在 CPP 中实现 iOS Metal 库。该库旨在公开可用于其他模块的高级 API。 Metal 是否公开了我可以在我的库中使用的 CPP 级别 api?
如果您想使用 C++ 来实现您的逻辑,您可以使用 Objective C++。没有纯C++接口。
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。
您需要阅读 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)代码(或者使用 Python 或 Guile 编写的脚本,或者在 GNU bison 或 ANTLR 的帮助下编码的 C++ 元程序)