MacOS Metal:命令行应用程序无法捕获 GPU 帧

5

我正在尝试使用MTLCaptureManager在命令行应用程序中以编程方式捕获GPU帧。

到目前为止,捕获管理器不支持MTLCaptureDestinationGPUTraceDocument目标。

我尝试使用XCode创建一个非常简单的重现案例:

#import <Foundation/Foundation.h>
#import <Metal/Metal.h>

int main(int argc, const char * argv[]) {
  @autoreleasepool {

      id<MTLDevice> device = MTLCreateSystemDefaultDevice();
      
      MTLCaptureManager* captureManager = [MTLCaptureManager sharedCaptureManager];
      if (![captureManager supportsDestination:MTLCaptureDestinationGPUTraceDocument])
      {
        NSLog(@"********** captureManager does not support MTLCaptureDestinationGPUTraceDocument ************");
      }
      else
      {
        NSLog(@"captureManager support is fine");
      }
  }
  return 0;
}

当在XCode下运行时,它似乎愿意工作: 输出为:
2020-09-02 16:25:59.712217+0200 testMetalCapture[20095:416447] Metal GPU Frame Capture Enabled
2020-09-02 16:25:59.712503+0200 testMetalCapture[20095:416447] Metal API Validation Enabled
2020-09-02 16:26:00.669092+0200 testMetalCapture[20095:416447] captureManager support is fine
Program ended with exit code: 0

但是当我归档构建结果并从终端运行时,它失败了:

2020-09-02 16:32:57.607 testMetalCapture[20126:419837] ********** captureManager does not support MTLCaptureDestinationGPUTraceDocument ************

有没有可以在终端中复制的运行时环境,以便使 MTLCaptureManager 生效?

(环境为 XCode 11.6 + MacOS 10.15 Catalina)

2个回答

2
根据我的理解(我找不到官方文档):
  • MTLCaptureManager需要从Info.plist获得授权,其中MetalCaptureEnabled应设置为YES
  • 正确的方法是将命令行应用程序与这样的plist捆绑在一起

我无意中发现如果在与命令行应用程序相同的目录中有一个Info.plist,则MTLCaptureManager也可以工作。

enter image description here

这个 Info.plist 可以几乎为空, 就像这样:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>MetalCaptureEnabled</key>
    <true/>
</dict>
</plist>

通过这个简单的设置,我可以运行我的测试程序(以及真正的程序)

% ./testMetalCapture
2020-10-02 15:53:08.507 testMetalCapture[28559:686864] Metal GPU Frame Capture Enabled
2020-10-02 15:53:08.523 testMetalCapture[28559:686864] captureManager support is fine

我目前使用的是MacOSX 10.15.6,但未来可能会出现问题。


1
@rotoglup的方法一开始对我很有效,直到它不再有效:一些缓冲区充满了零,并且在Metal调试器中的“屏幕截图”中没有显示任何图像。 我不知道这是由于操作系统或XCode的更新还是其他原因造成的。
正如@rotoglup建议的那样,我仍然需要一个包含以下内容的Info.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>MetalCaptureEnabled</key>
    <true/>
</dict>
</plist>

但我还需要在启动命令行应用程序的终端中将METAL_DEVICE_WRAPPER_TYPE环境变量设置为1:

export METAL_DEVICE_WRAPPER_TYPE=1

有了这个,缓冲区将会被正确填充,我可以得到非空的屏幕截图。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接