gpt4 book ai didi

macos - 如何跨进程同步 MTLTexture 和 IOSurface?

转载 作者:行者123 更新时间:2023-12-02 22:40:50 25 4
gpt4 key购买 nike

写入IOSurface时需要使用哪些API,以及需要采取哪些预防措施在 XPC 进程中,该进程也被用作 MTLTexture 的后备存储。在主应用程序中?

在我的 XPC 服务中,我有以下内容:

IOSurface *surface = ...;
CIRenderDestination *renderDestination = [... initWithIOSurface:surface];

// Send the IOSurface to the client using an NSXPCConnection.
// In the service, periodically write to the IOSurface.

在我的应用程序中,我有以下内容:

IOSurface *surface = // ... fetch IOSurface from NSXPConnection.
id<MTLTexture> texture = [device newTextureWithDescriptor:... iosurface:surface];

// The texture is used in a fragment shader (Read-only)

我有一个MTKView正在运行正常的更新循环。我希望我的 XPC 服务能够定期写入 IOSurface使用 Core Image,然后在应用程序端由 Metal 渲染新内容。

需要什么同步才能确保正确完成?双倍或三倍缓冲策略是其中之一,但这对我来说实际上不起作用,因为我可能没有足够的内存来分配 2 倍或 3 倍数量的表面。 (为了清晰起见,上面的示例使用一个表面,但实际上我可能有几十个要绘制的表面。每个表面代表图像的一个图 block 。图像可以是 JPG/TIFF/等允许的大小.)

WWDC 2010-442 讨论 IOSurface并简要提到这一切都“正常工作”,但这是在 OpenGL 的上下文中,没有提到 Core Image 或 Metal。

我最初假设 Core Image 和/或 Metal 会调用 IOSurfaceLock()IOSurfaceUnlock()以保护读/写访问,但情况似乎并非如此。 (头文件中 IOSurfaceRef.h 的注释表明锁定仅适用于 CPU 访问。)

我真的可以让Core Image的CIRenderDestination随意写信至IOSurface当我读到相应的MTLTexture时在我的应用程序的更新循环中?如果是这样,那么正如 WWDC 视频所述,所有纹理都绑定(bind)到 IOSurface,这怎么可能?共享相同的视频内存?如果在同一次读取和写入过程中发生,我肯定会撕裂表面的内容。

最佳答案

您需要做的是确保CoreImage绘制在IOSurface之前在XPC中完成。用于在应用程序中绘图。如果您在两侧都使用 OpenGL 或 Metal,则可以调用 glFlush()[-MTLRenderCommandEncoder waitUntilScheduled] 。我假设 CoreImage 中的某些内容正在进行其中一个调用。

我可以说,如果没有发生这种情况,情况可能会很明显,因为如果没有正确同步,您会看到撕裂或图像一半是新渲染,一半是旧渲染。我在使用 IOSurface 时看到过这种情况发生跨 XPC。

您可以做的一件事是在 -waitUntilScheduled 上放置一些符号断点和-waitUntilCompleted并查看 CI 是否在您的 XPC 中调用它们(假设 documentation 没有明确告诉您)。 Metal 中还有其他同步原语,但我对它们不是很熟悉。它们也可能有用。 (据我所知,CI 现在在幕后都是 Metal 。)

此外,IOSurface对象有方法 -incrementUseCount , -decrementUseCount ,和-localUseCount 。可能值得检查这些内容,看看 CI 设置是否正确。 (有关详细信息,请参阅 <IOSurface/IOSurfaceObjC.h>。)

关于macos - 如何跨进程同步 MTLTexture 和 IOSurface?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54504584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com