金属着色器调试-捕获GPU框架

时间:2018-08-21 17:39:29

标签: ios debugging metal

我想调试金属着色器,但“调试GPU”菜单中的“捕获GPU框架”按钮不可见且不可用。

我的方案最初是这样设置的:

  • 捕获GPU框架:自动启用
  • 金属API验证:已启用

当我将Capture GPU Frame选项更改为 Metal 时,我确实看到了捕获按钮,当我尝试制作渲染命令编码器时,我的应用程序崩溃了:

commandBuffer.makeRenderCommandEncoder(descriptor: ...)
  

validateRenderPassDescriptor:644:断言失败`colorAttachment [0]上的纹理使用率(0x01)未指定MTLTextureUsageRenderTarget(0x04)'

问题一:为什么需要指定用法? (它在自动启用模式下工作)

问题二:如何指定MTLTextureUsageRenderTarget

正在运行的测试版; Xcode 10和iOS 12。

2 个答案:

答案 0 :(得分:1)

对于新版本的Xcode,您需要为我的情况(呈现目标)显式设置MTLTextureDescriptor.usage:

textureDescriptor.usage = MTLTextureUsageRenderTarget|MTLTextureUsageShaderRead;

上面的设置指示纹理可以用作渲染目标,并且此后还可以由另一个着色器读取它。如上所述,您可能还需要设置framebufferOnly属性,这是我的操作方法:

if (isCaptureRenderedTextureEnabled) {
  mtkView.framebufferOnly = false;
}

请注意,在优化情况下(isCaptureRenderedTextureEnabled = false),仅将framebufferOnly设置保留为默认值true,这使检查要呈现在视图中的数据(着色器的输出)变得容易。 / p>

答案 1 :(得分:1)

指定使用目的

textureDescriptor.usage = [.renderTarget , .shaderRead]

textureDescriptor.usage = MTLTextureUsage(rawValue: MTLTextureUsage.renderTarget.rawValue | MTLTextureUsage.shaderRead.rawValue)