Metal框架詳細(xì)解析(四十) —— Metal編程指南之函數(shù)和庫(五)

版本記錄

版本號 時間
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ù)

MTLLibrarynewFunctionWithName:方法返回具有所請求名稱的MTLFunction對象。 如果在庫中找不到使用Metal著色語言函數(shù)限定符的函數(shù)的名稱堂湖,則newFunctionWithName:返回nil闲先。

Listing 4-1使用MTLDevicenewLibraryWithFile:error:方法通過其完整路徑名定位庫文件,并使用其內(nèi)容創(chuàng)建具有一個或多個MTLFunction對象的MTLLibrary對象无蜂。 加載文件時的任何錯誤都會返回error伺糠。 然后MTLLibrarynewFunctionWithName:方法創(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é)的反射對象(MTLRenderPipelineReflectionMTLComputePipelineReflection抬伺,具體取決于命令編碼器的類型)螟够。有關(guān)創(chuàng)建管道狀態(tài)和反射對象的詳細(xì)信息,請參閱Creating a Render Pipeline StateCreating a Compute Pipeline State峡钓。如果不使用反射數(shù)據(jù)妓笙,請避免獲取反射數(shù)據(jù)。

反射對象包含命令編碼器支持的每種函數(shù)類型的MTLArgument對象數(shù)組能岩。對于MTLComputeCommandEncoder寞宫,MTLComputePipelineReflectionarguments屬性中有一個MTLArgument對象數(shù)組,對應(yīng)于其計算函數(shù)的參數(shù)拉鹃。對于MTLRenderCommandEncoder辈赋,MTLRenderPipelineReflection有兩個屬性鲫忍,vertexArgumentsfragmentArguments,它們分別對應(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)]]鼎姐,index2钾麸。
  • access描述任何訪問限制,例如炕桨,讀取或?qū)懭朐L問限定符饭尝。
  • type由著色語言限定符指示,例如[[buffer(n)]]献宫,[[texture(n)]]钥平,[[sampler(n)]][[threadgroup(n)]]

type確定哪些其他MTLArgument屬性是相關(guān)的姊途。

如果buffer參數(shù)是結(jié)構(gòu)體(即bufferDataTypeMTLDataTypeStruct),則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)用MTLStructMemberstructType方法以獲取表示結(jié)構(gòu)的MTLStructType對象赎懦,然后遞歸深入分析以進(jìn)行分析。如果該成員是數(shù)組幻工,請使用MTLStructMemberarrayType方法獲取表示它的MTLArrayType励两。然后檢查它的MTLArrayTypeelementType屬性。如果elementTypeMTLDataTypeStruct囊颅,則調(diào)用elementStructType方法以獲取結(jié)構(gòu)并繼續(xù)深入查看其成員当悔。如果elementTypeMTLDataTypeArray,則調(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)注~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市胳挎,隨后出現(xiàn)的幾起案子饼疙,更是在濱河造成了極大的恐慌,老刑警劉巖串远,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宏多,死亡現(xiàn)場離奇詭異,居然都是意外死亡澡罚,警方通過查閱死者的電腦和手機(jī)伸但,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來留搔,“玉大人更胖,你說我怎么就攤上這事「粝裕” “怎么了却妨?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長括眠。 經(jīng)常有香客問我彪标,道長,這世上最難降的妖魔是什么掷豺? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任捞烟,我火速辦了婚禮薄声,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘题画。我一直安慰自己默辨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布苍息。 她就那樣靜靜地躺著缩幸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪竞思。 梳的紋絲不亂的頭發(fā)上表谊,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機(jī)與錄音衙四,去河邊找鬼铃肯。 笑死,一個胖子當(dāng)著我的面吹牛传蹈,可吹牛的內(nèi)容都是我干的押逼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惦界,長吁一口氣:“原來是場噩夢啊……” “哼挑格!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起沾歪,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤漂彤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后灾搏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挫望,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年狂窑,在試婚紗的時候發(fā)現(xiàn)自己被綠了媳板。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡泉哈,死狀恐怖蛉幸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情丛晦,我是刑警寧澤奕纫,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站烫沙,受9級特大地震影響匹层,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜锌蓄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一又固、第九天 我趴在偏房一處隱蔽的房頂上張望仲器。 院中可真熱鬧嫂伞,春花似錦宝剖、人聲如沸典勇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至昼捍,卻和暖如春识虚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背妒茬。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工担锤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乍钻。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓肛循,卻偏偏與公主長得像,于是被迫代替她去往敵國和親银择。 傳聞我的和親對象是個殘疾皇子多糠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容