版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2018.11.04 星期日 |
前言
很多做視頻和圖像的,相信對這個框架都不是很陌生,它渲染高級3D圖形锥咸,并使用GPU執(zhí)行數(shù)據(jù)并行計算。接下來的幾篇我們就詳細(xì)的解析這個框架细移。感興趣的看下面幾篇文章搏予。
1. Metal框架詳細(xì)解析(一)—— 基本概覽
2. Metal框架詳細(xì)解析(二) —— 器件和命令(一)
3. Metal框架詳細(xì)解析(三) —— 渲染簡單的2D三角形(一)
4. Metal框架詳細(xì)解析(四) —— 關(guān)于GPU Family 4(一)
5. Metal框架詳細(xì)解析(五) —— 關(guān)于GPU Family 4之關(guān)于Imageblocks(二)
6. Metal框架詳細(xì)解析(六) —— 關(guān)于GPU Family 4之關(guān)于Tile Shading(三)
7. Metal框架詳細(xì)解析(七) —— 關(guān)于GPU Family 4之關(guān)于光柵順序組(四)
8. Metal框架詳細(xì)解析(八) —— 關(guān)于GPU Family 4之關(guān)于增強(qiáng)的MSAA和Imageblock采樣覆蓋控制(五)
9. Metal框架詳細(xì)解析(九) —— 關(guān)于GPU Family 4之關(guān)于線程組共享(六)
10. Metal框架詳細(xì)解析(十) —— 基本組件(一)
11. Metal框架詳細(xì)解析(十一) —— 基本組件之器件選擇 - 圖形渲染的器件選擇(二)
12. Metal框架詳細(xì)解析(十二) —— 基本組件之器件選擇 - 計算處理的設(shè)備選擇(三)
13. Metal框架詳細(xì)解析(十三) —— 計算處理(一)
14. Metal框架詳細(xì)解析(十四) —— 計算處理之你好,計算(二)
15. Metal框架詳細(xì)解析(十五) —— 計算處理之關(guān)于線程和線程組(三)
16. Metal框架詳細(xì)解析(十六) —— 計算處理之計算線程組和網(wǎng)格大谢≡(四)
17. Metal框架詳細(xì)解析(十七) —— 工具雪侥、分析和調(diào)試(一)
18. Metal框架詳細(xì)解析(十八) —— 工具、分析和調(diào)試之Metal GPU Capture(二)
19. Metal框架詳細(xì)解析(十九) —— 工具精绎、分析和調(diào)試之GPU活動監(jiān)視器(三)
20. Metal框架詳細(xì)解析(二十) —— 工具速缨、分析和調(diào)試之關(guān)于Metal著色語言文件名擴(kuò)展名、使用Metal的命令行工具構(gòu)建庫和標(biāo)記Metal對象和命令(四)
21. Metal框架詳細(xì)解析(二十一) —— 基本課程之基本緩沖區(qū)(一)
22. Metal框架詳細(xì)解析(二十二) —— 基本課程之基本紋理(二)
23. Metal框架詳細(xì)解析(二十三) —— 基本課程之CPU和GPU同步(三)
24. Metal框架詳細(xì)解析(二十四) —— 基本課程之參數(shù)緩沖 - 基本參數(shù)緩沖(四)
25. Metal框架詳細(xì)解析(二十五) —— 基本課程之參數(shù)緩沖 - 帶有數(shù)組和資源堆的參數(shù)緩沖區(qū)(五)
26. Metal框架詳細(xì)解析(二十六) —— 基本課程之參數(shù)緩沖 - 具有GPU編碼的參數(shù)緩沖區(qū)(六)
27. Metal框架詳細(xì)解析(二十七) —— 高級技術(shù)之圖層選擇的反射(一)
28. Metal框架詳細(xì)解析(二十八) —— 高級技術(shù)之使用專用函數(shù)的LOD(一)
29. Metal框架詳細(xì)解析(二十九) —— 高級技術(shù)之具有參數(shù)緩沖區(qū)的動態(tài)地形(一)
30. Metal框架詳細(xì)解析(三十) —— 延遲照明(一)
31. Metal框架詳細(xì)解析(三十一) —— 在視圖中混合Metal和OpenGL渲染(一)
32. Metal框架詳細(xì)解析(三十二) —— Metal渲染管道教程(一)
33. Metal框架詳細(xì)解析(三十三) —— Metal渲染管道教程(二)
34. Metal框架詳細(xì)解析(三十四) —— Hello Metal捺典! 一個簡單的三角形的實(shí)現(xiàn)(一)
35. Metal框架詳細(xì)解析(三十五) —— Hello Metal鸟廓! 一個簡單的三角形的實(shí)現(xiàn)(二)
36. Metal框架詳細(xì)解析(三十六) —— Metal編程指南之概覽(一)
37. Metal框架詳細(xì)解析(三十七) —— Metal編程指南之基本Metal概念(二)
38. Metal框架詳細(xì)解析(三十八) —— Metal編程指南之命令組織和執(zhí)行模型(三)
39. Metal框架詳細(xì)解析(三十九) —— Metal編程指南之資源對象:緩沖區(qū)和紋理(四)
Functions and Libraries - 函數(shù)和庫
本章介紹如何創(chuàng)建MTLFunction對象作為Metal
著色器或計算函數(shù)的引用,以及如何使用MTLLibrary對象組織和訪問函數(shù)。
MTLFunction Represents a Shader or Compute Function - MTLFunction表示著色器或計算函數(shù)
MTLFunction對象表示以Metal著色語言編寫并在GPU上作為圖形或計算管道的一部分執(zhí)行的單個函數(shù)引谜。有關(guān)Metal shading language
的詳細(xì)信息牍陌,請參閱Metal Shading Language Guide
。
要在Metal運(yùn)行時和使用Metal著色語言編寫的圖形或計算函數(shù)之間傳遞數(shù)據(jù)或狀態(tài)员咽,可以為紋理毒涧,緩沖區(qū)和采樣器分配參數(shù)索引。參數(shù)索引標(biāo)識Metal運(yùn)行時和Metal著色代碼正在引用哪個紋理贝室,緩沖區(qū)或采樣器契讲。
對于渲染過程,您可以指定MTLFunction
對象以用作MTLRenderPipelineDescriptor對象中的頂點(diǎn)或片段著色器滑频,如 Creating a Render Pipeline State中所述捡偏。對于計算傳遞,在為目標(biāo)設(shè)備創(chuàng)建MTLComputePipelineState對象時指定MTLFunction
對象峡迷,如Specify a Compute State and Resources for a Compute Command Encoder中所述银伟。
A Library Is a Repository of Functions - 庫是函數(shù)的倉庫
MTLLibrary對象表示一個或多個MTLFunction對象的存儲庫。 單個MTLFunction
對象表示使用著色語言編寫的一個Metal
函數(shù)绘搞。 在Metal著色語言源代碼中彤避,任何使用Metal函數(shù)限定符(vertex, fragment, or kernel)
的函數(shù)都可以由庫中的MTLFunction
對象表示。 沒有這些函數(shù)限定符之一的Metal函數(shù)不能由MTLFunction
對象直接表示夯辖,盡管它可以由著色器中的另一個函數(shù)調(diào)用琉预。
可以從以下任一來源創(chuàng)建庫中的MTLFunction
對象:
- 在應(yīng)用程序構(gòu)建過程中編譯為二進(jìn)制庫格式的Metal著色語言代碼。
- 包含Metal著色語言源代碼的文本字符串蒿褂,由應(yīng)用程序在運(yùn)行時編譯圆米。
1. Creating a Library from Compiled Code - 從編譯代碼創(chuàng)建庫
為了獲得最佳性能,請?jiān)赬code的應(yīng)用程序構(gòu)建過程中將Metal著色語言源代碼編譯到庫文件中贮缅,這樣可以避免在應(yīng)用程序運(yùn)行時編譯函數(shù)源的成本榨咐。 要從庫二進(jìn)制文件創(chuàng)建MTLLibrary對象,請調(diào)用以下MTLDevice方法之一:
- newDefaultLibrary檢索為主包構(gòu)建的庫谴供,該庫包含應(yīng)用程序Xcode項(xiàng)目中的所有著色器和計算函數(shù)。
-
newLibraryWithFile:error:獲取庫文件的路徑并返回包含存儲在該庫文件中的所有函數(shù)的
MTLLibrary
對象齿坷。 -
newLibraryWithData:error:獲取包含庫中函數(shù)代碼的二進(jìn)制
blob
桂肌,并返回MTLLibrary
對象。
有關(guān)在構(gòu)建過程中編譯Metal著色語言源代碼的更多信息永淌,請參閱Creating Libraries During the App Build Process崎场。
2. Creating a Library from Source Code - 從源代碼創(chuàng)建庫
要從可能包含多個函數(shù)的Metal著色語言源代碼字符串創(chuàng)建MTLLibrary,請調(diào)用以下MTLDevice方法之一遂蛀。 這些方法在創(chuàng)建庫時編譯源代碼谭跨。 要指定要使用的編譯器選項(xiàng),請?jiān)?a target="_blank" rel="nofollow">MTLCompileOptions對象中設(shè)置屬性。
-
newLibraryWithSource:options:error:從輸入字符串同步編譯源代碼以創(chuàng)建
MTLFunction
對象螃宙,然后返回包含它們的MTLLibrary
對象蛮瞄。 -
newLibraryWithSource:options:completionHandler:異步編譯輸入字符串中的源代碼以創(chuàng)建
MTLFunction
對象,然后返回包含它們的MTLLibrary
對象谆扎。completionHandler
是在完成對象創(chuàng)建時調(diào)用的代碼塊挂捅。
3. Getting a Function from a Library - 從庫中獲取函數(shù)
MTLLibrary
的newFunctionWithName:方法返回具有所請求名稱的MTLFunction
對象。 如果在庫中找不到使用Metal著色語言函數(shù)限定符的函數(shù)的名稱堂湖,則newFunctionWithName:
返回nil
闲先。
Listing 4-1
使用MTLDevice
的newLibraryWithFile:error:
方法通過其完整路徑名定位庫文件,并使用其內(nèi)容創(chuàng)建具有一個或多個MTLFunction
對象的MTLLibrary
對象无蜂。 加載文件時的任何錯誤都會返回error
伺糠。 然后MTLLibrary
的newFunctionWithName:
方法創(chuàng)建一個MTLFunction
對象,該對象表示源代碼中名為my_func
的函數(shù)斥季。 返回的函數(shù)對象myFunc
現(xiàn)在可以在應(yīng)用程序中使用
Listing 4-1 Accessing a Function from a Library
NSError *errors;
id <MTLLibrary> library = [device newLibraryWithFile:@"myarchive.metallib"
error:&errors];
id <MTLFunction> myFunc = [library newFunctionWithName:@"my_func"];
Determining Function Details at Runtime - 在運(yùn)行時確定函數(shù)詳細(xì)信息
由于MTLFunction對象的實(shí)際內(nèi)容是由可能在創(chuàng)建MTLFunction
對象之前編譯的圖形著色器或計算函數(shù)定義的退盯,因此其源代碼可能無法直接用于應(yīng)用程序。您可以在運(yùn)行時查詢以下MTLFunction
屬性:
- name泻肯,包含函數(shù)名稱的字符串渊迁。
- functionType,指示函數(shù)是聲明為頂點(diǎn)灶挟,片段還是計算函數(shù)琉朽。
- vertexAttributes,一個MTLVertexAttribute對象數(shù)組稚铣,描述頂點(diǎn)屬性數(shù)據(jù)在內(nèi)存中的組織方式以及如何將其映射到頂點(diǎn)函數(shù)參數(shù)箱叁。有關(guān)更多詳細(xì)信息,請參閱Vertex Descriptor for Data Organization惕医。
MTLFunction
不提供對函數(shù)參數(shù)的訪問耕漱。可以在創(chuàng)建管道狀態(tài)期間獲得顯示著色器或計算函數(shù)參數(shù)的細(xì)節(jié)的反射對象(MTLRenderPipelineReflection或MTLComputePipelineReflection抬伺,具體取決于命令編碼器的類型)螟够。有關(guān)創(chuàng)建管道狀態(tài)和反射對象的詳細(xì)信息,請參閱Creating a Render Pipeline State或Creating a Compute Pipeline State峡钓。如果不使用反射數(shù)據(jù)妓笙,請避免獲取反射數(shù)據(jù)。
反射對象包含命令編碼器支持的每種函數(shù)類型的MTLArgument對象數(shù)組能岩。對于MTLComputeCommandEncoder寞宫,MTLComputePipelineReflection在arguments屬性中有一個MTLArgument對象數(shù)組,對應(yīng)于其計算函數(shù)的參數(shù)拉鹃。對于MTLRenderCommandEncoder辈赋,MTLRenderPipelineReflection有兩個屬性鲫忍,vertexArguments和fragmentArguments,它們分別對應(yīng)于頂點(diǎn)函數(shù)參數(shù)和片段函數(shù)參數(shù)钥屈。
并非函數(shù)的所有參數(shù)都存在于反射對象中悟民。反射對象僅包含具有關(guān)聯(lián)資源的參數(shù),但不包含使用[[stage_in]]
限定符或內(nèi)置[[vertex_id]]
或[[attribute_id]]
限定符聲明的參數(shù)焕蹄。
Listing 4-2
顯示了如何獲取反射對象(在此示例中為MTLComputePipelineReflection)逾雄,然后在其arguments屬性中迭代MTLArgument對象。
Listing 4-2 Iteration Through Function Arguments
MTLComputePipelineReflection* reflection;
id <MTLComputePipelineState> computePS = [device
newComputePipelineStateWithFunction:func
options:MTLPipelineOptionArgumentInfo
reflection:&reflection error:&error];
for (MTLArgument *arg in reflection.arguments) {
// process each MTLArgument
}
MTLArgument屬性顯示著色語言函數(shù)的參數(shù)的詳細(xì)信息腻脏。
- name屬性只是參數(shù)的名稱鸦泳。
- active是一個布爾值,指示是否可以忽略該參數(shù)永品。
-
index是其對應(yīng)參數(shù)表中從零開始的位置做鹰。例如,對于
[[buffer(2)]]
鼎姐,index
為2
钾麸。 - access描述任何訪問限制,例如炕桨,讀取或?qū)懭朐L問限定符饭尝。
-
type由著色語言限定符指示,例如
[[buffer(n)]]
献宫,[[texture(n)]]
钥平,[[sampler(n)]]
或[[threadgroup(n)]]
。
type確定哪些其他MTLArgument屬性是相關(guān)的姊途。
- 如果
type
是MTLArgumentTypeTexture涉瘾,則textureType屬性指示整體紋理類型(例如著色語言中的texture1d_array
,texture2d_ms
和texturecube
類型)捷兰,textureDataType屬性指示組件數(shù)據(jù)類型(例如half
立叛,float
,int
或uint
) )贡茅。 - 如果
type
是MTLArgumentTypeThreadgroupMemory秘蛇,則threadgroupMemoryAlignment和threadgroupMemoryDataSize屬性是相關(guān)的。 - 如果
type
是MTLArgumentTypeBuffer友扰,則bufferAlignment, bufferDataSize, bufferDataType和bufferStructType屬性是相關(guān)的彤叉。
如果buffer參數(shù)是結(jié)構(gòu)體(即bufferDataType
是MTLDataTypeStruct),則bufferStructType
屬性包含表示結(jié)構(gòu)的MTLStructType村怪,而bufferDataSize
包含結(jié)構(gòu)的大小(以字節(jié)為單位)浮庐。如果buffer
參數(shù)是一個數(shù)組(或指向數(shù)組的指針)甚负,則bufferDataType
指示元素的數(shù)據(jù)類型柬焕,bufferDataSize
包含一個數(shù)組元素的大小(以字節(jié)為單位)梭域。
Listing 4-3
深入研究MTLStructType對象斑举,以檢查struct成員的詳細(xì)信息,每個結(jié)構(gòu)成員由MTLStructMember對象表示病涨。結(jié)構(gòu)成員可以是簡單類型富玷,數(shù)組或嵌套結(jié)構(gòu)。如果成員是嵌套結(jié)構(gòu)既穆,則調(diào)用MTLStructMember
的structType方法以獲取表示結(jié)構(gòu)的MTLStructType
對象赎懦,然后遞歸深入分析以進(jìn)行分析。如果該成員是數(shù)組幻工,請使用MTLStructMember
的arrayType方法獲取表示它的MTLArrayType励两。然后檢查它的MTLArrayType
的elementType屬性。如果elementType
是MTLDataTypeStruct囊颅,則調(diào)用elementStructType方法以獲取結(jié)構(gòu)并繼續(xù)深入查看其成員当悔。如果elementType
是MTLDataTypeArray,則調(diào)用elementArrayType方法以獲取子數(shù)組并進(jìn)一步分析它踢代。
Listing 4-3 Processing a Struct Argument
MTLStructType *structObj = [arg.bufferStructType];
for (MTLStructMember *member in structObj.members) {
// process each MTLStructMember
if (member.dataType == MTLDataTypeStruct) {
MTLStructType *nestedStruct = member.structType;
// recursively drill down into the nested struct
}
else if (member.dataType == MTLDataTypeArray) {
MTLStructType *memberArray = member.arrayType;
// examine the elementType and drill down, if necessary
}
else {
// member is neither struct nor array
// analyze it; no need to drill down further
}
}
后記
本篇主要講述了Metal編程指南之函數(shù)和庫盲憎,感興趣的給個贊或者關(guān)注~~~