Metal框架详细解析(二十) —— 工具、分析和调试之关于Metal着色语言文件名扩展名、使用Metal的命令行工具构建库和标记Metal对象和命令(四)

版本记录

版本号 时间
V1.0 2018.10.08 星期一

前言

很多做视频和图像的,相信对这个框架都不是很陌生,它渲染高级3D图形,并使用GPU执行数据并行计算。接下来的几篇我们就详细的解析这个框架。感兴趣的看下面几篇文章。
1. Metal框架详细解析(一)—— 基本概览
2. Metal框架详细解析(二) —— 器件和命令(一)
3. Metal框架详细解析(三) —— 渲染简单的2D三角形(一)
4. Metal框架详细解析(四) —— 关于GPU Family 4(一)
5. Metal框架详细解析(五) —— 关于GPU Family 4之关于Imageblocks(二)
6. Metal框架详细解析(六) —— 关于GPU Family 4之关于Tile Shading(三)
7. Metal框架详细解析(七) —— 关于GPU Family 4之关于光栅顺序组(四)
8. Metal框架详细解析(八) —— 关于GPU Family 4之关于增强的MSAA和Imageblock采样覆盖控制(五)
9. Metal框架详细解析(九) —— 关于GPU Family 4之关于线程组共享(六)
10. Metal框架详细解析(十) —— 基本组件(一)
11. Metal框架详细解析(十一) —— 基本组件之器件选择 - 图形渲染的器件选择(二)
12. Metal框架详细解析(十二) —— 基本组件之器件选择 - 计算处理的设备选择(三)
13. Metal框架详细解析(十三) —— 计算处理(一)
14. Metal框架详细解析(十四) —— 计算处理之你好,计算(二)
15. Metal框架详细解析(十五) —— 计算处理之关于线程和线程组(三)
16. Metal框架详细解析(十六) —— 计算处理之计算线程组和网格大小(四)
17. Metal框架详细解析(十七) —— 工具、分析和调试(一)
18. Metal框架详细解析(十八) —— 工具、分析和调试之Metal GPU Capture(二)
19. Metal框架详细解析(十九) —— 工具、分析和调试之GPU活动监视器(三)

About the Metal Shading Language Filename Extension - 关于Metal着色语言文件名扩展名

使用.metal文件扩展名来访问Metal的构建,配置文件和调试工具。

.metal文件扩展名表示Metal Shading Language源代码文件。 使用此扩展允许Xcode识别项目中的Metal Shading Language文件,在构建时自动构建默认库,并使用专门的Metal工具帮助您分析和调试源代码。 使用.metal文件扩展名还允许您使用Metal的命令行工具手动构建库。


Building a Library with Metal's Command-Line Tools - 使用Metal的命令行工具构建库

使用命令行工具运行Metal编译器工具链。

手动编译Metal Shading Language源代码并在不使用Xcode的情况下构建Metal库,包含以下过程:

  • 1) 使用metal工具将每个.metal文件编译为单个.air文件,该文件存储Metal Shading Language源代码的中间表示。
  • 2) (可选)使用metal-ar工具将多个.air文件一起存档到单个.metalar文件中。 (metal-ar工具类似于UNIX ar工具。)
  • 3) 使用metallib工具将.air.metalar文件构建到单个.metallib文件中,该文件存储Metal库。

1. Run Metal's Command-Line Tools - 运行Metal的命令行工具

以下代码显示了将单个.metal文件编译并构建到单个.metallib文件中所需的最少命令数。 您可以在终端应用程序中运行这些命令,并使用-help命令显示每个Metal工具的可用选项。 此示例使用macosx SDK,但您可以使用iphoneosappletvos SDK

xcrun -sdk macosx metal MyLibrary.metal -o MyLibrary.air
xcrun -sdk macosx metallib MyLibrary.air -o MyLibrary.metallib

2. Retrieve and Access a Built Library - 检索并访问已建立的库

在使用Metal的命令行工具构建库之后,将生成的.metallib文件添加到Xcode项目中。 然后,在运行时,调用 newLibraryWithFile:error:方法来检索和访问您的库作为MTLLibrary对象。

NSError *libraryError = NULL;
NSString *libraryFile = [[NSBundle mainBundle] pathForResource:@"MyLibrary" ofType:@"metallib"];
id <MTLLibrary> myLibrary = [_device newLibraryWithFile:libraryFile error:&libraryError];
if (!myLibrary) {
    NSLog(@"Library error: %@", libraryError.localizedDescription);
}

Labeling Metal Objects and Commands - 标记Metal对象和命令

Metal对象和命令分配有意义的标签,以便您轻松识别它们。

对象和命令标签在运行时或使用任何Metal工具分析和调试应用程序时都是有用的标识符。

注意:此处描述的属性和方法不会影响应用程序的图形渲染或计算处理行为。

1. Label Objects - 标签对象

许多Metal对象都提供了一个label属性,您可以为其指定有意义的字符串。 这些标签出现在Metal工具中,使您可以轻松识别特定对象。

此外,addDebugMarker:range:方法允许您轻松标记和标识MTLBuffer中的特定数据范围。

2. Label Commands - 标签命令

命令缓冲区和命令编码器提供以下方法,使您可以轻松识别应用程序中特定的Metal命令组:

使用这些方法可以简化应用程序开发过程,尤其是对于每个缓冲区或编码器使用许多Metal命令的任务。

Debug组被推送并弹出到仅在其关联的MTLCommandBufferMTLCommandEncoder的生命周期内存在的唯一堆栈上。 您可以通过将多个组推入堆栈来嵌套调试组,然后从堆栈中弹出以前的组。

以下示例演示如何推送和弹出多个调试组。

id<MTLRenderCommandEncoder> renderEncoder = [commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor];
renderEncoder.label = @"My Render Encoder";
[renderEncoder pushDebugGroup:@"My Render Pass"];

    [renderEncoder pushDebugGroup:@"Pipeline Setup"];
    // Render pipeline commands
    [renderEncoder popDebugGroup]; // Pops "Pipeline Setup"

    [renderEncoder pushDebugGroup:@"Vertex Setup"];
    // Vertex function commands
    [renderEncoder popDebugGroup]; // Pops "Vertex Setup"

    [renderEncoder pushDebugGroup:@"Fragment Setup"];
    // Fragment function commands
    [renderEncoder popDebugGroup]; // Pops "Fragment Setup"

    [renderEncoder pushDebugGroup:@"Draw Calls"];
    // Drawing commands
    [renderEncoder popDebugGroup]; // Pops "Draw Calls"

[renderEncoder popDebugGroup]; // Pops "My Render Pass"
[renderEncoder endEncoding];

下图显示了执行GPU捕获后调试组在Xcode的调试导航器中的显示方式。

后记

本篇主要讲述了关于Metal着色语言文件名扩展名、使用Metal的命令行工具构建库和标记Metal对象和命令,感兴趣的给个赞或者关注~~~

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容