代码之家  ›  专栏  ›  技术社区  ›  kennyc

如何将MTLSharedTextureHandle或MTLSharedEventHandle与macOS上的C XPC接口一起使用?

  •  0
  • kennyc  · 技术社区  · 6 年前

    你如何编码和解码一个 MTLSharedTextureHandle MTLSharedEventHandler 这样就可以通过 xpc_dictionary


    我正在开发的一个macOS应用程序广泛使用XPC服务,并使用基于C的API实现(即。: xpc_main, xpc_connection, xpc_dictionary... )这在当时是有意义的,因为某些物体 IOSurfaces ,不支持 NSCoding/NSSecureCoding IOSurfaceCreateXPCObject .

    在macOS 10.14中,苹果推出了新的类,用于在进程之间共享金属纹理和事件: MTLSharedEventHandle . 这些类支持 NSSecureCoding

    我想我可以用 [NSKeyedArchiver archivedDataWithRootObject:requiringSecureCoding:error] 把他们变成 NSData 对象,然后可以存储在 ,但当我尝试这样做时,会出现以下异常:

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

    (nsxpccorder是一个私有类。)

    MTL共享文本句柄 . 我可以改用新的 NSXPCConnection 但是我已经在C接口上构建了大量的代码,所以我不想做这个转换。

    有没有办法将这两个类中的任何一个归档到可以存储在

    1 回复  |  直到 6 年前
        1
  •  2
  •   russbishop    6 年前

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

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

    我建议换成 NSXPC连接 如果可以的话。不幸的是,使用公共API进行部分更改并不是一个好故事,您必须一次完成所有更改,或者将XPC服务拆分为两个独立的服务。

    推荐文章