Как вы используете MTLSharedTextureHandle или MTLSharedEventHandle с интерфейсом C XPC на macOS? - PullRequest
0 голосов
/ 13 ноября 2018

TL; DR: Как вы кодируете и декодируете MTLSharedTextureHandle и MTLSharedEventHandler так, чтобы его можно было транспортировать через соединение XPC внутри xpc_dictionary?


Приложение macOS, над которым я работаю, широко использует службы XPC и было реализовано с использованием API на основе C.(т.е.: xpc_main, xpc_connection, xpc_dictionary...) Это имело смысл в то время, потому что некоторые объекты, такие как IOSurfaces, не поддерживали NSCoding/NSSecureCoding и должны были быть переданы с использованием IOSurfaceCreateXPCObject.

В macOS 10.14 Apple представила новые классы для совместного использования текстур и событий Metal между процессами: MTLSharedTextureHandle и MTLSharedEventHandle.Эти классы поддерживают NSSecureCoding, но в интерфейсе C-XPC, похоже, нет аналога для их кодирования / декодирования.

Я думал, что мог бы использовать что-то вроде [NSKeyedArchiver archivedDataWithRootObject:requiringSecureCoding:error], чтобы просто преобразовать их в NSData объекты, которые затем могут быть сохранены в xpc_dictionary, но когда я пытаюсь это сделать, я получаю следующее исключение:

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

(NSXPCCoder - это закрытый класс.)

Это происходит как для MTLSharedTextureHandle, так и MTLSharedEventHandle.Я мог бы переключиться на использование нового NSXPCConnection API, но у меня уже есть большой объем кода, построенного на C-интерфейсе, поэтому я бы предпочел не переключаться.

Есть ли способ архивировать любой из этих двух классов в полезную нагрузку, которую можно сохранить в xpc_dictionary для передачи между службой и клиентом?

1 Ответ

0 голосов
/ 26 ноября 2018

MTLSharedTextureHandle работает только с NSXPCConnection.Если вы создаете текстуру из IOSurface, вы можете вместо этого разделить поверхность, что фактически одно и то же.Убедитесь, что вы используете один и тот же графический процессор (id<MTLDevice>) в обоих процессах.

Обходного пути для MTLSharedEventHandle при использовании общедоступного API не существует.

Я рекомендую переключиться на NSXPCConnection, есливы можете.К сожалению, для частичного перехода на использование общедоступного API нет хорошей истории, вам придется делать все сразу или разбить службу XPC на две отдельные службы.

...