您如何在macOS上通过C XPC接口使用MTLSharedTextureHandle或MTLSharedEventHandle?

时间:2018-11-13 17:04:41

标签: objective-c macos metal xpc nsxpcconnection

TL; DR::如何对MTLSharedTextureHandleMTLSharedEventHandler进行编码和解码,以便可以在xpc_dictionary内部通过XPC连接进行传输?


我正在使用的macOS应用程序大量使用XPC服务,并使用基于C的API来实现。 (即:xpc_main, xpc_connection, xpc_dictionary...)在当时是有道理的,因为某些对象(例如IOSurfaces)不支持NSCoding/NSSecureCoding,而必须使用IOSurfaceCreateXPCObject进行传递。

在macOS 10.14中,Apple引入了用于在进程之间共享金属纹理和事件的新类:MTLSharedTextureHandleMTLSharedEventHandle。这些类支持NSSecureCoding,但是它们似乎在C-XPC接口中没有用于对其进行编码/解码的对应部分。

我认为我可以使用类似[NSKeyedArchiver archivedDataWithRootObject:requiringSecureCoding:error]的对象将它们转换为NSData对象,然后将其存储在xpc_dictionary中,但是当我尝试这样做时,我得到了以下异常:

Caught exception during archival: 
This object may only be encoded by an NSXPCCoder.

(NSXPCCoder是私有类。)

MTLSharedTextureHandleMTLSharedEventHandle都会发生这种情况。我可以切换到使用新的NSXPCConnection API,但是我已经在C接口上构建了大量代码,因此我宁愿不必进行切换。

是否可以将这两个类中的任何一个存档到有效载荷中,该有效载荷可以存储在xpc_dictionary中以在服务和客户端之间进行传输?

1 个答案:

答案 0 :(得分:0)

MTLSharedTextureHandle仅适用于NSXPCConnection。如果要从IOSurface创建纹理,则可以共享表面,实际上这是同一件事。确保在两个进程中使用相同的GPU(id<MTLDevice>)。

使用公共API的MTLSharedEventHandle没有解决方法。

如果可以的话,我建议切换到NSXPCConnection。不幸的是,对于使用公共API进行部分转换并没有一个好故事,您必须一次完成所有操作,或者将XPC服务拆分为两个单独的服务。