本發(fā)明涉及圖形處理系統(tǒng),特別地,涉及包括一個(gè)或更多個(gè)可編程處理階段(“著色器”)的圖形處理系統(tǒng)的操作。
背景技術(shù):
圖形處理通常是以流水線的方式來執(zhí)行的,具有對數(shù)據(jù)進(jìn)行操作以生成最終渲染輸出(例如顯示的幀)的一個(gè)或更多個(gè)流水線階段?,F(xiàn)在,很多圖形處理流水線包括一個(gè)或更多個(gè)可編程處理階段,通常被稱為“著色器(shader)”。例如,圖形處理流水線可以包括幾何著色器、頂點(diǎn)著色器和片段(fragment)(像素)著色器中的一個(gè)或更多個(gè),并且通常為全部的上述著色器。這些著色器是這樣的可編程處理階段:其對輸入數(shù)據(jù)值執(zhí)行著色器程序以生成期望的一組輸出數(shù)據(jù)(例如,在片段著色的情況下適當(dāng)?shù)剡M(jìn)行著色(shade)和渲染的片段數(shù)據(jù)),用于通過圖形流水線的其余部分進(jìn)行的處理和/或用于輸出。圖形處理流水線的著色器可以共享可編程處理電路,或者它們各自可以是不同的可編程處理單元。
因此,圖形處理單元(GPU)著色器核心是這樣的處理單元:其通過運(yùn)行針對要生成的圖形輸出中的每個(gè)圖形項(xiàng)目的小程序來執(zhí)行圖形處理,上述圖形輸出諸如是渲染目標(biāo),例如,幀(“項(xiàng)目”在這方面通常是頂點(diǎn)或采樣位置(例如,在片段著色器的情況下))。這通常使得具有高并行度,這是由于典型的渲染輸出(例如,幀)特征在于具有相當(dāng)大數(shù)量的頂點(diǎn)和片段,這些頂點(diǎn)和片段中的每一個(gè)可以獨(dú)立地進(jìn)行處理。
在圖形著色器操作中,每個(gè)“項(xiàng)目”將借助于執(zhí)行線程來進(jìn)行處理,該執(zhí)行線程將執(zhí)行針對討論中的圖形“項(xiàng)目”的討論中的著色器。
提高著色器執(zhí)行效率的已知方式是將執(zhí)行線程(在每個(gè)線程對應(yīng)于例如一個(gè)頂點(diǎn)或一個(gè)采樣位置的情況下)分組成“成組”或者“成束”的線程,在這種情況下,一組的線程以一致步調(diào)運(yùn)行,一次一個(gè)指令。這樣,能夠在該組中的全部線程之間共享指令取出和調(diào)度資源。(用于這種線程組的其它術(shù)語包括“warps”和“wavefronts”。為了方便起見,將在本文中使用術(shù)語“線程組”,但是除非另有說明,該術(shù)語旨在包含全部的等同術(shù)語和布置。)
在片段著色器的情況下(對渲染輸出的基元中的每個(gè)采樣位置執(zhí)行一次的著色器),線程組通常包含一個(gè)或更多個(gè)“四元組(quads)”,其中“四元組”是采樣位置的2x2分組。按照這種方式將采樣位置組織成每四元組有利于在片段著色器中完成的部分操作,諸如取決于這種采樣點(diǎn)增量的采樣點(diǎn)增量計(jì)算和操作,諸如利用分級細(xì)化(mipmapping)的紋理查找。
申請人已經(jīng)意識到在這種布置中,在基元的邊緣處,2x2采樣位置四元組可以跨越基元的邊緣,采樣位置中的一部分在基元內(nèi)部,而其它采樣位置則在外部。在這種情況下,仍將針對四元組中的全部四個(gè)采樣位置開始線程,但是事實(shí)上僅被基元覆蓋的那些采樣位置將是“活動(dòng)”線程。
然而,對于對應(yīng)于在基元外部的采樣位置的線程(為了方便起見,在本文中其將被稱為“非活動(dòng)”和/或“輔助”線程),仍然需要部分片段著色處理。這是因?yàn)槔纾枰槍@種非活動(dòng)(“輔助”)線程的片段著色結(jié)果中的一部分作為對諸如采樣位置增量類型計(jì)算這樣的片段著色操作中的一部分的輸入。(然后,通過這種輔助線程計(jì)算出的結(jié)果在片段著色器結(jié)束時(shí)被丟棄(因?yàn)樗鼈儾涣肀恍枰?)。
圖1例示了這種情況。
圖1示意性地示出要生成的圖形輸出的采樣位置102的陣列101,其中采樣位置的各個(gè)2x2分組被組織成將共同進(jìn)行處理的“四元組”103。
當(dāng)基元被柵格化時(shí),柵格化器將識別至少部分地被基元覆蓋的這些采樣位置四元組(分組),并且發(fā)出用于對每個(gè)至少部分地被覆蓋的四元組(采樣位置的分組(組))進(jìn)行渲染的圖形片段。然后,每個(gè)這種片段將作為線程組(warp)通過片段著色器進(jìn)行處理,每個(gè)被覆蓋的采樣位置是該組(warp)中的“活動(dòng)”線程,并且任何未被覆蓋的采樣位置是非活動(dòng)(“輔助”)線程。
圖1示出覆蓋采樣位置的陣列的示例性基元104。從圖1中可以看出,當(dāng)采樣位置四元組105針對基元103進(jìn)行處理時(shí),2x2四元組105內(nèi)的采樣位置中的三個(gè)采樣位置將是“活動(dòng)的”(即,表示基元3內(nèi)部的采樣位置),而四元組104中的第四個(gè)采樣位置106由于其落在基元103的邊緣的外部將是“非活動(dòng)的”。因此,當(dāng)針對四元組104執(zhí)行片段著色器程序時(shí),針對未被覆蓋的采樣位置106的線程組內(nèi)部的線程將作為“輔助”線程被執(zhí)行和處理。
申請人相信,線程組的處理特別是在圖形處理流水線的著色器中的處理仍然有改進(jìn)的空間。
技術(shù)實(shí)現(xiàn)要素:
根據(jù)本發(fā)明的第一方面,提供有一種操作圖形處理流水線的方法,該圖形處理流水線包括執(zhí)行指令以進(jìn)行著色操作的可編程著色階段,其中,執(zhí)行線程能夠一起被分組為線程組,在所述線程組中,分組的線程以一致步調(diào)、一次一個(gè)指令地來執(zhí)行,所述方法包括以下步驟:
連同線程組合并事件指示一起向所述著色器階段發(fā)出用于通過所述著色器階段執(zhí)行以對執(zhí)行線程進(jìn)行處理用于生成渲染輸出的著色器程序,所述線程組合并事件指示表示所述著色器程序執(zhí)行中的如下的點(diǎn),即,在該點(diǎn)處,能夠?qū)⒕€程組中的并非全部線程都是活動(dòng)的所述線程組進(jìn)行合并;
所述圖形處理流水線:
識別要通過所述著色階段進(jìn)行處理的一組兩個(gè)或更多個(gè)線程組,對于所述兩個(gè)或更多個(gè)線程組,所述線程組中的并非全部線程都是活動(dòng)的,并且所述兩個(gè)或更多個(gè)線程組能夠被合并為單個(gè)線程組;以及
所述著色階段:
針對所識別的線程組執(zhí)行所述著色器程序,針對所識別的線程組執(zhí)行所述著色器程序包括以下步驟:
當(dāng)所識別的線程組已經(jīng)到達(dá)所述線程組合并事件指示時(shí),將所述線程組合并為包含來自所述線程組中的每一個(gè)線程組的活動(dòng)線程的單個(gè)線程組;以及
在所述合并事件指示點(diǎn)之后,針對經(jīng)合并的線程組執(zhí)行所述著色器程序中的進(jìn)一步的指令。
根據(jù)本發(fā)明的第二方面,提供有一種數(shù)據(jù)處理系統(tǒng),該數(shù)據(jù)處理系統(tǒng)包括:
圖形處理流水線,該圖形處理流水線包括執(zhí)行指令以進(jìn)行著色操作的可編程著色階段,其中,執(zhí)行線程能夠一起被分組為線程組,在所述線程組中,分組的線程以一致步調(diào)、一次一個(gè)指令地來執(zhí)行;以及
編譯器,該編譯器對針對所述著色階段的程序進(jìn)行編譯以生成用于通過所述著色階段執(zhí)行的指令;
其中,所述編譯器被配置為:
連同線程組合并事件指示一起向所述著色器階段發(fā)出用于通過所述著色器階段執(zhí)行以對執(zhí)行線程進(jìn)行處理用于生成渲染輸出的著色器程序,所述線程組合并事件指示表示所述著色器程序執(zhí)行中的如下的點(diǎn),即,在該點(diǎn)處,能夠?qū)⒕€程組中的并非全部線程都是活動(dòng)的所述線程組進(jìn)行合并;
所述圖形處理流水線被配置為:
識別要通過所述著色階段進(jìn)行處理的各個(gè)組的兩個(gè)或更多個(gè)線程組,對于所述兩個(gè)或更多個(gè)線程組,所述線程組中的并非全部線程都是活動(dòng)的,并且所述兩個(gè)或更多個(gè)線程組能夠被合并為相應(yīng)的單個(gè)線程組;以及
所述著色階段被配置為:
執(zhí)行針對所識別的線程組的所述著色器,所述執(zhí)行針對所識別的線程組的所述著色器包括以下步驟:
當(dāng)相應(yīng)的所識別的一組可合并的線程組中的線程組已經(jīng)到達(dá)所述線程組合并事件指示時(shí),將所述線程組合并為包含來自所述線程組中的每一個(gè)線程組的活動(dòng)線程的單個(gè)線程組;以及
在所述合并事件指示點(diǎn)之后,針對經(jīng)合并的線程組執(zhí)行所述著色器程序中的進(jìn)一步的指令。
本發(fā)明涉及執(zhí)行線程可以一起被分組到線程組(“warp”)中的圖形處理流水線中著色器程序的執(zhí)行。在本發(fā)明中,具有部分“非活動(dòng)”(“輔助”)線程的線程組被識別,然后“合并事件”指示被用來觸發(fā)將這些線程組合并為單個(gè)線程組,用于在著色器執(zhí)行期間的包含所述線程組的所述活動(dòng)線程的執(zhí)行。如下面將進(jìn)一步討論的,這然后具有減少在線程組僅具有部分“活動(dòng)”線程(例如,與所覆蓋的采樣位置相關(guān)的線程)的線程組的情況下所需要的整體處理的效果。
申請人已經(jīng)意識到,在這方面,如上述討論的,盡管當(dāng)執(zhí)行片段著色器程序時(shí),必須要例如執(zhí)行針對非活動(dòng)(未被覆蓋的)“輔助線程”的那個(gè)程序,例如用于生成對采樣位置增量類型計(jì)算的輸入的目的,但是這些計(jì)算也可以僅在靠近所述片段著色器程序的開始時(shí)發(fā)生(和/或能夠被僅布置為發(fā)生)。這意味著一旦已經(jīng)執(zhí)行了非活動(dòng)“輔助”線程所需要的計(jì)算,則這些非活動(dòng)“輔助”線程有可能被終止?!拜o助線程”的這種提早終止本身將有利于節(jié)省電力。
然而,申請人已經(jīng)進(jìn)一步意識到,即使“輔助線程”以這種方式被終止,其本身也將不會(huì)允許線程組作為一個(gè)整體被終止(即,即使“輔助線程”不執(zhí)行任何計(jì)算,該“輔助線程”仍將占據(jù)線程組執(zhí)行路徑,并且因此不必要地占據(jù)執(zhí)行周期,即使其不再需要進(jìn)行處理)。這對于具有大量小基元和長著色器程序的工作負(fù)載(其例如是在現(xiàn)代游戲中經(jīng)常出現(xiàn)的工作負(fù)載)來說,可能變得特別浪費(fèi)。
本發(fā)明通過識別和指示著色器程序中的線程組合并事件機(jī)會(huì)來對此進(jìn)行說明,在此之后,具有非互動(dòng)“輔助”線程的線程組被合并為包含原始“稀疏地”活動(dòng)線程組的“活動(dòng)”線程的單個(gè)線程組。這然后有效地避免原始線程組的非活動(dòng)“輔助”線程占據(jù)執(zhí)行周期。
本發(fā)明所考慮的線程組可以是任何合適且需要的尺寸。在優(yōu)選實(shí)施方式中,每個(gè)線程組包含四個(gè)線程(即,存在為四的warp寬度)。在這種情況下,每個(gè)線程組(warp)優(yōu)選地對應(yīng)于2x2采樣位置“四元組”。然而,如果需要的話,諸如使用更寬的線程組(warp)的其它安排將是可能的。
圖形處理流水線的可編程著色階段能夠包括圖形處理流水線的任何合適且需要的可編程著色階段(“著色器”)。然而,可以設(shè)想的是本申請將具有對片段著色操作的特殊應(yīng)用,因此在優(yōu)選實(shí)施方式中,可編程著色階段作為(正作為)可編程片段著色階段(片段著色器)進(jìn)行操作??删幊讨A段可以僅作為片段著色器進(jìn)行操作,但是將要理解的是在這方面,可編程著色階段通常能夠(且優(yōu)選地能夠)運(yùn)行除了僅片段著色器以外的著色器,即,使得可以存在可以例如在不同的時(shí)間適當(dāng)?shù)剡M(jìn)行編程的圖形處理流水線的一個(gè)或更多個(gè)可編程階段,以用作片段著色器(以執(zhí)行片段著色操作)并且用作其它形式(類型)的著色器。
相應(yīng)地,向(可編程)著色階段發(fā)出的著色器程序可以是用于通過可編程著色階段執(zhí)行的任何合適且需要的著色器程序,但是在特定的優(yōu)選實(shí)施方式中是片段著色器程序(用于執(zhí)行片段著色操作的程序)(并且能夠包括用于通過可編程著色階段執(zhí)行的任何合適且需要的片段著色器程序)。
正被生成的渲染輸出能夠是圖形處理流水線的任何合適且需要的渲染輸出。在一個(gè)優(yōu)選實(shí)施方式中,渲染輸出是要進(jìn)行顯示的幀(圖像),但是本發(fā)明也同樣適用于其它形式的渲染輸出,諸如紋理(在渲染到紋理操作中)等。
著色器程序中包括的線程組合并事件指示能夠采用能夠指示(并且能夠被著色器使用來識別)使線程組合并的機(jī)會(huì)的任何合適且需要的形式。
在一個(gè)優(yōu)選實(shí)施方式中,提供線程組合并指示作為著色器程序中的指令或其一部分。例如,能夠提供線程組合并指示作為包括在著色器程序中的特定指令(“合并”指令)。還將能夠借助于著色器程序中的修改程序或者針對著色器程序中的指令來指示線程組合并事件機(jī)會(huì)。
在其它實(shí)施方式中,線程組合并事件指示沒有作為著色器程序中的指令或作為其一部分被包括,但是相反地按照能夠指示著色器程序中的線程組合并事件點(diǎn)(諸如與著色器代碼本身分開指出的分界點(diǎn))的某些其它方式來指示。在這種情況下,合并事件點(diǎn)能夠被指示為例如已經(jīng)被執(zhí)行的著色器程序的特定數(shù)量的指令,和/或在執(zhí)行著色器的同時(shí)達(dá)到特定的程序計(jì)數(shù)器值。
能夠以任何合適且需要的方式在著色器程序中或者與著色器程序相關(guān)地、并且通過整體數(shù)據(jù)處理系統(tǒng)的任何合適且需要的元件來提供線程組合并事件指示。
在特別優(yōu)選實(shí)施方式中,通過圖形處理流水線的編譯器(著色編譯器)來提供線程組合并事件指示。因此編譯器優(yōu)選地例如,在合適的點(diǎn)處將線程組合并事件指令嵌入到例如片段、著色器程序中,或者將線程組合并事件修改程序添加到著色器程序的指令中,或相反地生成針對線程組合并事件指示的分界點(diǎn)的指示。使編譯器提供線程組合并事件指示具有如下優(yōu)勢:編譯器能夠?qū)χ鞒绦蜻M(jìn)行評估,以確定是否能夠在著色器程序執(zhí)行中包括線程組合并事件指示。
在特定優(yōu)選實(shí)施方式中,編譯器例如通過對要求圖形處理的主處理器的應(yīng)用來對所提供的著色器程序代碼進(jìn)行分析,確定線程組合并事件在著色器程序執(zhí)行中的某個(gè)點(diǎn)處是否可能,并且如果可能的話,則在著色器程序中的合適的點(diǎn)處并且針對該點(diǎn)提供線程組合并事件指示(例如,通過在該點(diǎn)處將特定指令嵌入到著色器程序中,或者以其它方式),以指示線程組合并事件機(jī)會(huì)。
在特定優(yōu)選實(shí)施方式中,編譯器還可以操作(在這種情況下是可能的)以對著色器程序中的操作進(jìn)行重新排序,以便例如提供在著色器程序執(zhí)行中包括線程組合并事件的機(jī)會(huì),和/或以便允許在著色器程序的執(zhí)行中更加有效地包括并使用線程組合并事件機(jī)會(huì)。
在這方面,編譯器優(yōu)選地進(jìn)行操作以將諸如紋理查找的需要針對非活動(dòng)線程的結(jié)果的任何著色器程序操作放在線程組合并事件指示點(diǎn)之前。相應(yīng)地,編譯器優(yōu)選地將不需要針對線程組中的非活動(dòng)(輔助)線程來執(zhí)行的諸如算術(shù)運(yùn)算的任何著色器程序操作放在著色器程序執(zhí)行中的線程組合并事件點(diǎn)之后。
編譯器可以例如,并且在優(yōu)選實(shí)施方式中確實(shí)可以在包括圖形處理流水線的整體數(shù)據(jù)處理系統(tǒng)的主處理器上運(yùn)行(圖形處理流水線然后在諸如圖形處理器的與主處理器相關(guān)聯(lián)的另一處理器上(使得編譯器和編譯代碼在整體數(shù)據(jù)圖形處理系統(tǒng)內(nèi)部的單獨(dú)的處理器上運(yùn)行))。然而,其它安排將是可能的,諸如編譯器在與編譯代碼相同的處理器上運(yùn)行,或者編譯器(完全)在單獨(dú)的處理器上運(yùn)行,諸如程序在單獨(dú)的系統(tǒng)上進(jìn)行預(yù)編譯并且以編譯的形式分布。
能夠針對要通過圖形處理流水線執(zhí)行的每個(gè)和每一著色器程序來考慮(并且在一個(gè)實(shí)施方式中)按照本發(fā)明的方式識別并提供要執(zhí)行的著色器程序中的線程組合并事件機(jī)會(huì)的操作。還將能夠嘗試識別并提供僅針對特定類別或類型的著色器程序但是不針對其它類別或類型的著色器程序的線程組合并事件機(jī)會(huì)(例如,在著色器程序的類型不大可能提供有用的線程組合并事件機(jī)會(huì)的情況下)。
在優(yōu)選實(shí)施方式中,按照本發(fā)明的方式識別并提供線程組合并事件機(jī)會(huì)的操作是針對要執(zhí)行的片段著色器程序來進(jìn)行的(并且優(yōu)選地是針對要通過圖形處理流水線執(zhí)行的每個(gè)和每一片段著色器程序來進(jìn)行的)。
(然而,例如在編譯器確定合適的合并事件點(diǎn)不存在或者在所討論的著色器程序中可能不是那么有用的情況下,不必每個(gè)和每一(例如片段)著色器程序都必須具有線程組合并事件指示和包括在其中的點(diǎn)。)
如有需要,還將能夠在著色器程序中包括多個(gè)線程組合并事件點(diǎn)。這在例如大部分著色器程序被包含在IF塊中時(shí)可能是有用的,使得在著色器程序執(zhí)行中將一個(gè)合并點(diǎn)放在IF塊的中間并且將第二個(gè)合并點(diǎn)放在緊接著IF塊的末端之后可能是合適的。在這種情況下,在合并事件能夠發(fā)生之前,線程組中的全部活動(dòng)線程優(yōu)選不得不到達(dá)合并點(diǎn)中的至少一個(gè)。
本發(fā)明還延伸至編譯器本身。
因此,根據(jù)本發(fā)明的另一方面,提供有一種編譯器,該編譯器對程序進(jìn)行編譯以生成用于圖形處理流水線的著色階段的指令,該圖形處理流水線執(zhí)行指令以執(zhí)行著色操作,并且其中,其中,執(zhí)行線程能夠一起被分組為線程組,在所述線程組中,分組的線程以一致步調(diào)、一次一個(gè)指令地來執(zhí)行;
其中,所述編譯器被配置為,針對要通過著色器階段執(zhí)行的著色器程序執(zhí)行以下步驟:
確定在所述著色器程序的執(zhí)行內(nèi)是否存在如下的點(diǎn),即,在該點(diǎn)處,能夠?qū)⒏髯跃哂蟹腔顒?dòng)線程的兩個(gè)或更多個(gè)線程組進(jìn)行合并;以及
當(dāng)確定在所述著色器程序執(zhí)行中存在能夠?qū)⒕哂蟹腔顒?dòng)線程的兩個(gè)或更多個(gè)線程組進(jìn)行合并的點(diǎn)時(shí),在所述著色器程序中包括或者為所述著色器程序提供線程組合并事件指示,所述線程組合并事件指示表示所述著色器程序執(zhí)行中能夠?qū)⒏髯跃哂蟹腔顒?dòng)線程的兩個(gè)或更多個(gè)線程組進(jìn)行合并的點(diǎn)。
因此,根據(jù)本發(fā)明的另一方面,提供有一種對程序進(jìn)行編譯以生成用于圖形處理流水線的著色階段的指令的方法,該圖形處理流水線執(zhí)行指令以執(zhí)行著色操作,并且其中,執(zhí)行線程能夠一起被分組為線程組,在所述線程組中,分組的線程以一致步調(diào)、一次一個(gè)指令地來執(zhí)行;
針對要通過著色器階段執(zhí)行的著色器程序,所述方法包括以下步驟:
確定在所述著色器程序的執(zhí)行內(nèi)是否存在如下的點(diǎn),即,在該點(diǎn)處,能夠?qū)⒏髯跃哂蟹腔顒?dòng)線程的兩個(gè)或更多個(gè)線程組進(jìn)行合并;以及
當(dāng)確定在所述著色器程序執(zhí)行中存在能夠?qū)⒕哂蟹腔顒?dòng)線程的兩個(gè)或更多個(gè)線程組進(jìn)行合并的點(diǎn)時(shí),在所述著色器程序中包括或者為所述著色器程序提供線程組合并事件指示,所述線程組合并事件指示表示所述著色器程序執(zhí)行中能夠?qū)⒏髯跃哂蟹腔顒?dòng)線程的兩個(gè)或更多個(gè)線程組進(jìn)行合并的點(diǎn)。
本發(fā)明還延伸至能夠響應(yīng)于針對正在被著色階段執(zhí)行的著色器程序的線程組合并指示來將線程組進(jìn)行合并的圖形處理流水線的著色器階段。
因此,根據(jù)本發(fā)明的另一方面,提供有一種圖形處理流水線的著色器階段,該著色器階段執(zhí)行指令以執(zhí)行著色操作,并且其中,執(zhí)行線程可以一起被分組為線程組,在線程組中,分組的線程以一致步調(diào)、一次一個(gè)指令地來執(zhí)行,所述著色器階段被配置為:
當(dāng)執(zhí)行著色器程序的指令時(shí),響應(yīng)于指示所述著色器程序執(zhí)行中的可以將與所述著色器程序相關(guān)聯(lián)的兩個(gè)或更多個(gè)線程組進(jìn)行合并的點(diǎn)的線程組合并事件指示:
確定是否存在正在執(zhí)行所述著色器程序的并且能夠被合并為單個(gè)線程組的兩個(gè)或更多個(gè)線程組;以及
當(dāng)存在可以被合并為單個(gè)線程組的兩個(gè)或更多個(gè)線程組時(shí),將所述線程組合并為包含來自所述線程組中的每一個(gè)的活動(dòng)線程的單個(gè)線程組;以及
在合并事件指示之后,針對經(jīng)合并的線程組執(zhí)行所述著色器程序中的進(jìn)一步的指令。
根據(jù)本發(fā)明的另一方面,提供有一種操作圖形處理流水線的著色器階段的方法,該著色器階段執(zhí)行指令以執(zhí)行著色器操作,并且其中,執(zhí)行線程可以一起被分組為線程組,在線程組中,分組的線程以一致步調(diào)、一次一個(gè)指令地來執(zhí)行;
所述方法包括所述著色器階段,當(dāng)執(zhí)行著色器程序的指令時(shí),響應(yīng)于指示所述著色器程序執(zhí)行中的可以將與所述著色器程序相關(guān)聯(lián)的兩個(gè)或更多個(gè)線程組進(jìn)行合并的點(diǎn)的線程組合并事件指示:
確定是否存在正在執(zhí)行所述著色器程序的并且能夠被合并為單個(gè)線程組的兩個(gè)或更多個(gè)線程組;以及
當(dāng)存在可以被合并為單個(gè)線程組的兩個(gè)或更多個(gè)線程組時(shí),將所述線程組合并為包含來自所述線程組中的每一個(gè)的活動(dòng)線程的單個(gè)線程組;以及
在合并事件指示之后,針對經(jīng)合并的線程組執(zhí)行所述著色器程序中的進(jìn)一步的指令。
如本領(lǐng)域技術(shù)人員所理解的,本發(fā)明的這些方面能夠并且優(yōu)選地確實(shí)包括本文酌情所公開的本發(fā)明的優(yōu)選和可選特征的任何一個(gè)或多個(gè)或者全部。因此,例如,著色器程序優(yōu)選是片段著色器程序,并且相應(yīng)地,著色器階段優(yōu)選是(操作為)圖形處理流水線的片段著色器階段。
能夠通過圖形處理流水線和其元件以任何合適的且需要的方式來執(zhí)行線程組中的并非全部線程都是活動(dòng)的并且可以被合并為單個(gè)線程組的一組(多組)的兩個(gè)或更多個(gè)線程組的識別。這例如可以取決于著色器程序和正在執(zhí)行的著色器階段。
在優(yōu)選實(shí)施方式中,至少在著色器程序是匹片段著色器程序的情況下(并且因此可編程著色階段用作片段著色階段(片段著色器)),圖形處理流水線的柵格化器識別線程組中的并非全部線程都是活動(dòng)的、可以被合并為單個(gè)線程組的該一組或多組的兩個(gè)或更多個(gè)線程組,例如并且優(yōu)選地,當(dāng)該柵格化器對基元進(jìn)行柵格化以生成片段(例如采樣位置的四元組(或其它分組))用于渲染時(shí)。
如上所述,圖形處理流水線的柵格化器將對要針對所生成的渲染輸出的采樣位置進(jìn)行渲染的基元進(jìn)行測試,并且生成要針對被所述的基元覆蓋的(或者包括被所述的基元覆蓋的至少一個(gè)采樣位置的)每個(gè)采樣位置(或者相應(yīng)組的采樣位置(例如,采樣位置的每個(gè)2x2四元組))進(jìn)行渲染的片段。
然后,由柵格化器生成的用于對基元進(jìn)行渲染的片段被發(fā)送到圖形處理流水線的其余部分(包括片段著色階段),用于處理。每個(gè)片段因此將對應(yīng)于并且被用來對一組采樣位置進(jìn)行渲染(每組采樣位置包括一個(gè)采樣位置或多個(gè)采樣位置,這取決于片段是否代表各個(gè)采樣位置或者多組(例如四元組)的多個(gè)采樣位置)。
然后,在片段著色階段,每個(gè)片段(即,片段所代表的一組采樣位置)將作為相應(yīng)的線程組(warp)進(jìn)行處理,該線程組中的并且針對該線程組的每個(gè)線程(并因此執(zhí)行路徑)對應(yīng)于片段所代表的一組采樣位置中的給定采樣位置。針對片段的一組采樣位置中的被覆蓋的采樣位置因此將是線程組的活動(dòng)線程,并且未被覆蓋的采樣位置將是線程組(warp)的非活動(dòng)(“輔助”)線程。
要(可能地)進(jìn)行合并的一組線程組中的全部線程組應(yīng)當(dāng),并且優(yōu)選地確實(shí)應(yīng)當(dāng)運(yùn)行(執(zhí)行)同一著色器程序。只要滿足這個(gè)要求,就不需要(可能地)要進(jìn)行合并的一組線程組中的線程組以任何特殊方式另外進(jìn)行關(guān)聯(lián)。
然而,如有需要,可以設(shè)置其它要求。例如,要進(jìn)行合并的線程組可能屬于同一繪制調(diào)用(并且在優(yōu)選實(shí)施方式中這是已經(jīng)在做的)。類似地,要(可能地)進(jìn)行合并的一組線程組中的線程組可能與同一圖形基元相關(guān)。然而,這不是必需的,并且在優(yōu)選實(shí)施方式中,要(可能地)進(jìn)行合并的一組線程組中的線程組能夠與不同基元相關(guān)。允許不同基元中的線程組進(jìn)行合并能夠是有利的,特別是在平均基元尺寸是一個(gè)采樣位置四元組或更小的情況下是有利的。
被包括在要(可能地)進(jìn)行合并的一組線程組中的線程組應(yīng)當(dāng)各具有至少一個(gè)非活動(dòng)線程(例如,未被覆蓋的采樣點(diǎn)),但是如有需要另外也能夠進(jìn)行選擇。
在一個(gè)優(yōu)選實(shí)施方式中,可以被合并為單個(gè)線程組的該組(并且每組)的線程組僅包含兩個(gè)線程組(即,可以被合并為單個(gè)線程組的成對的線程組被識別)。然而,如有需要,還將能夠識別可以被合并為單個(gè)線程組的多組三個(gè)或更多個(gè)線程組(warp)。
要(可能地)進(jìn)行合并的線程組應(yīng)當(dāng),并且優(yōu)選地確實(shí)應(yīng)當(dāng)在單個(gè)線程組能夠包含的不超過最大數(shù)量的活動(dòng)線程之間進(jìn)行合計(jì)(然后這允許針對線程組的全部的活動(dòng)線程被合并為單個(gè)線程組)。在優(yōu)選實(shí)施方式中,將進(jìn)行組合以提供“完全”合并的、單個(gè)線程組的線程組優(yōu)選地被識別為合并候選。
在優(yōu)選實(shí)施方式中,具有不重疊的活動(dòng)線程(即,活動(dòng)線程存在于不同的線程組(warp)路徑中)的線程組被識別為能夠被合并為單個(gè)線程組的線程組。
在一個(gè)優(yōu)選實(shí)施方式中,僅具有不重疊的活動(dòng)線程(即,活動(dòng)線程存在于不同的線程組(warp)路徑中)的線程組被識別為能夠被合并為單個(gè)線程組的線程組。
然而,在特定優(yōu)選實(shí)施方式的,能夠(例如,并且優(yōu)選地柵格化器能夠)(例如,通過將線程組水平地或垂直地相對應(yīng)的2x2四元組進(jìn)行翻轉(zhuǎn))將線程的分配(例如,采樣位置)重新映射到針對線程組的線程組路徑,以便(嘗試)將針對在其初始配置中具有重疊的活動(dòng)線程(路徑)的線程組的重疊去除,以允許這種線程組然后(可能地)進(jìn)行合并。
因此,在特定優(yōu)選實(shí)施方式中,例如柵格化器能夠?qū)⒗缇€程組所代表的采樣位置的分配重新映射到線程組執(zhí)行(warp)路徑,以便例如,并且優(yōu)選地,能夠?qū)⒉煌€程組之間的活動(dòng)線程執(zhí)行(warp)路徑重疊去除。
在這種情況下,在優(yōu)選實(shí)施方式中,針對被重新映射的線程組的重新映射(重新定位)以某種方式被跟蹤或者被記錄,以便允許(例如,片段)著色操作仍保證正確地計(jì)算在“重新映射的”線程組上執(zhí)行的任何著色操作,并且允許針對重新映射的線程組的最終結(jié)果在需要時(shí)(例如,當(dāng)它們被提交至輸出時(shí))“不被映射”。
在優(yōu)選實(shí)施方式中,例如當(dāng)生成片段用于通過柵格化器進(jìn)行渲染時(shí),和/或當(dāng)基元正在被柵格化時(shí),和/或當(dāng)正在生成所述的渲染輸出時(shí),重復(fù)識別能夠進(jìn)行合并的多組線程組的過程。因此,優(yōu)選地識別可以被合并為單個(gè)線程組的多對(或其它組)的線程組。最優(yōu)選地,例如當(dāng)柵格化器進(jìn)行操作以對基元進(jìn)行柵格化用于渲染時(shí),該柵格化器進(jìn)行操作以識別可以被合并為相應(yīng)的單個(gè)線程組的多對(或其它組)的線程組。
能夠被合并為相應(yīng)的單個(gè)線程組的所識別的線程組優(yōu)選地被指示為圖形處理流水線的著色器階段,使得該著色器階段能夠識別當(dāng)線程組到達(dá)著色器程序執(zhí)行中的線程組合并事件指示點(diǎn)時(shí)已經(jīng)被識別(關(guān)聯(lián))為“合并”候選的線程組。這可以按照任何合適的且所需的方式來完成。例如,并且優(yōu)選地,當(dāng)柵格化器向片段著色器發(fā)出線程組時(shí),該柵格化器能夠向片段著色器階段發(fā)出信號以通知那些線程組能夠被合并在一起。
按照能夠?qū)崿F(xiàn)上述的一種方式,柵格化器保持局部線程組的(例如,小)隊(duì)列作為其輸出。當(dāng)柵格化器生成新局部線程組時(shí),該柵格化器然后將該新局部線程組對隊(duì)列中的局部線程組進(jìn)行匹配(將該新局部線程組與隊(duì)列中的局部線程組進(jìn)行比較),試圖找到能夠與其合并的更早的線程組。如果成功(即,如果在隊(duì)列中找到合適的更早線程組),則能夠?qū)蓚€(gè)線程組一起向片段著色器發(fā)出。如果失敗,則將該新局部線程組嵌入到隊(duì)列中。有可能該隊(duì)列變滿,在這種情況下,未被合并的局部線程組能夠被傳遞到片段著色器中。
本發(fā)明還延伸至識別可以被合并為單個(gè)線程組的線程組的圖形處理流水線的柵格化器的操作。
因此,根據(jù)本發(fā)明的另一方面,提供有一種操作圖形處理流水線的柵格化器的方法,所述柵格化器對圖形基元進(jìn)行柵格化以被渲染到圖形片段中用于渲染,每個(gè)圖形片段代表要生成的渲染輸出的一組多個(gè)采樣位置;
所述方法包括所述柵格化器:
識別針對包括未被基元覆蓋的采樣位置的該基元的片段并且確定這些片段中的任何片段是否能夠被合并以形成代表所述片段的全部被覆蓋的采樣點(diǎn)的單個(gè)片段;以及
當(dāng)確定包括未被覆蓋的采樣位置的兩個(gè)或更多個(gè)片段能夠被合并以形成代表所述片段的全部被覆蓋的采樣點(diǎn)的單個(gè)片段時(shí),向所述圖形處理流水線的片段著色階段發(fā)信號,所述圖形處理流水線是這樣的圖形處理流水線:包括未被覆蓋的采樣位置的兩個(gè)或更多個(gè)片段能夠被合并以形成代表所述片段的全部被覆蓋的采樣點(diǎn)的單個(gè)片段。
根據(jù)本發(fā)明的另一方面,提供有一種用于圖形處理流水線的柵格化器,所述柵格化器對圖形基元進(jìn)行柵格化以被渲染到圖形片段中用于渲染,每個(gè)圖形片段代表要生成的渲染輸出的一組多個(gè)采樣位置;
其中,所述柵格化器被配置為:
識別針對包括未被基元覆蓋的采樣位置的該基元的片段并且確定這些片段中的任何片段是否能夠被合并以形成代表所述片段的全部被覆蓋的采樣點(diǎn)的單個(gè)片段;以及
當(dāng)確定包括未被覆蓋的采樣位置的兩個(gè)或更多個(gè)片段能夠被合并以形成代表所述片段的全部被覆蓋的采樣點(diǎn)的單個(gè)片段時(shí),向所述圖形處理流水線的片段著色階段發(fā)信號,所述圖形處理流水線是這樣的圖形處理流水線:包括未被覆蓋的采樣位置的兩個(gè)或更多個(gè)片段能夠被合并以形成代表所述片段的全部被覆蓋的采樣點(diǎn)的單個(gè)片段。
如本領(lǐng)域技術(shù)人員所理解的,本發(fā)明的這些方面能夠并且優(yōu)選地確實(shí)包括本文酌情所公開的本發(fā)明的優(yōu)選和可選特征的任何一個(gè)或多個(gè)或者全部。
在優(yōu)選實(shí)施方式中,已經(jīng)被識別為能夠被合并為單個(gè)線程組的一組(并且優(yōu)選地每組)的線程組的線程組被連續(xù)地向著色階段發(fā)出(但是這不是必需的并且其它安排將是可能的)。
類似地,在特定優(yōu)選實(shí)施方式中,可能與彼此進(jìn)行合并為單個(gè)線程組的任何線程組優(yōu)選地向著色器階段發(fā)出,用于按照適于并符合圖形處理流水線中的線程組的處理的任何限制的方式來執(zhí)行。因此,例如,在存在線程組可用的多個(gè)不同的寄存器和存儲(chǔ)器組的情況下,可能與彼此進(jìn)行合并的任何線程組優(yōu)選地向著色器階段發(fā)出,以用于按照線程組將共享同一存儲(chǔ)器組和/或一組寄存器等的方式來執(zhí)行。
申請人已經(jīng)進(jìn)一步意識到,并非要執(zhí)行的全部線程組都將能夠(可能地)與另一線程組或多個(gè)組進(jìn)行合并(例如,因?yàn)榫€程組(例如,四元組)中的全部線程都是活動(dòng)的或者不存在線程組能夠與其進(jìn)行合并的另一合適的線程組)。
因此,在優(yōu)選實(shí)施方式中,如果要向著色器階段發(fā)出的線程組被識別(例如,通過柵格化器)為無法(可能地)與另一線程組進(jìn)行合并,則該線程組優(yōu)選被指示為無法進(jìn)行合并(作為單個(gè)線程組進(jìn)行處理)。這種指示能夠例如包括簡單地省略掉線程組能夠與另一線程組進(jìn)行合并的任何指示。
一旦線程組已經(jīng)向例如片段、著色階段發(fā)出,該著色階段就將執(zhí)行針對所述線程組的著色器程序。然后,當(dāng)可以被合并為單個(gè)線程組的所識別的線程組已經(jīng)到達(dá)線程組合并事件指示時(shí),這些線程組被合并為包含來自每個(gè)的線程組的活動(dòng)線程的單個(gè)線程組。
這可以根據(jù)需要來實(shí)現(xiàn),但是在優(yōu)選實(shí)施方式中,當(dāng)要進(jìn)行合并的一組線程組中的第一線程組到達(dá)著色器程序執(zhí)行中的線程組合并點(diǎn)(例如,到達(dá)線程組合并指令)時(shí),針對該線程組的著色器程序執(zhí)行被停止直至要與該線程組進(jìn)行合并的其它線程組或多個(gè)組也已經(jīng)到達(dá)著色器程序執(zhí)行中的線程組合并點(diǎn)。然后,一旦要進(jìn)行合并的全部(例如兩個(gè))線程組都已經(jīng)到達(dá)著色器程序執(zhí)行中的線程組合并點(diǎn),線程組就被合并為包含來自每個(gè)的線程組的活動(dòng)線程的單個(gè)線程組。
能夠根據(jù)需要來執(zhí)行將線程組合并為包含來自每個(gè)的線程組的活動(dòng)線程的單個(gè)線程組。優(yōu)選地來自每個(gè)warp組的活動(dòng)線程被映射到經(jīng)合并的單個(gè)線程組(warp)的相應(yīng)線程組(warp)路徑。在優(yōu)選實(shí)施方式中,要進(jìn)行合并的一組線程組中的其中一個(gè)線程組被保留作為包含來自每個(gè)的線程組的活動(dòng)線程的單個(gè)線程組,然后終止要進(jìn)行合并的一組線程組中的其它線程組或多個(gè)組。
在線程組合并事件之后,被合并的線程組作為(優(yōu)選地)共享單個(gè)(活動(dòng))程序計(jì)數(shù)器的一個(gè)共享線程組(warp)前進(jìn)。
在著色器程序的執(zhí)行中,優(yōu)選地尚未被終止的任何非活動(dòng)線程在線程組被合并時(shí)被終止。(在優(yōu)選實(shí)施方式中,一旦已經(jīng)執(zhí)行了線程組中的任何非活動(dòng)“輔助”線程所要求的操作,則它們就被終止。)
一旦關(guān)聯(lián)線程組已經(jīng)被合并為單個(gè)線程組,就針對合并后的線程組執(zhí)行著色器程序中的進(jìn)一步指令。在優(yōu)選實(shí)施方式中,在著色器程序中在合并事件指示點(diǎn)之后的其余指令的執(zhí)行(合適地)針對合并后的線程組來完成。
如上所述,可以存在不能與其它線程組進(jìn)行合并的線程組。在優(yōu)選實(shí)施方式中,當(dāng)這種“不可合并的”線程組到達(dá)著色器程序執(zhí)行中的線程組合并事件指示點(diǎn)時(shí),該線程組合并事件指示被忽略(不起作用),并且簡單地繼續(xù)執(zhí)行針對線程組本身的著色器程序(即,著色器程序中的在合并事件指示點(diǎn)之后的指令針對線程組本身來執(zhí)行)。換句話說,針對未被識別為能夠與另一線程組進(jìn)行合并的任何線程組,線程組合并事件指示優(yōu)選將對針對線程組的著色器程序的執(zhí)行不起作用。
通過針對線程組的著色階段執(zhí)行的著色器程序通常將執(zhí)行從相應(yīng)寄存器中讀取并且向相應(yīng)寄存器寫入數(shù)據(jù)的一系列指令。在優(yōu)選實(shí)施方式中,從中讀取數(shù)據(jù)并向其寫入數(shù)據(jù)的寄存器當(dāng)執(zhí)行針對線程組的著色器程序時(shí)以特定的方式進(jìn)行布置,如下文中討論的,這將有助于促進(jìn)線程組合并操作。
因此,在特定優(yōu)選實(shí)施方式中,被分配以被著色器程序使用的(當(dāng)著色器程序正在被執(zhí)行時(shí))寄存器被分成兩個(gè)子集,一組是在物理上由要被合并為單個(gè)線程組的一組線程組中的線程組共享的“公共”寄存器,優(yōu)選地從針對線程組的著色器程序的執(zhí)行開始,并且一組是對于該組中的每個(gè)線程組來說分別是本地的(且專屬的)并且對于要進(jìn)行合并的該組線程組中的其它線程組或多個(gè)組來說是不可訪問的多組寄存器的“私人”寄存器(即,該組中的每個(gè)線程組將具有其自身的僅其自身能夠訪問的一組“私人”寄存器)。
將寄存器劃分成“公共”子集和“私人”子集能夠按照任何合適的且需要的方式來完成。在一個(gè)優(yōu)選實(shí)施方式中,寄存器指數(shù)截止被用來按照這種方式對寄存器進(jìn)行劃分,在該截止之下的全部寄存器是“公共”寄存器,并且在該截止之上的全部寄存器是“私人”寄存器(反之亦然)。寄存器指數(shù)截止可以例如,并且優(yōu)選地,由編譯器來指定。如有需要,用于將寄存器劃分成“公共”子集和“私人”子集的其它布置還可以或者替代地被使用,諸如具有寄存器的硬編碼劃分,或者指示哪些寄存器進(jìn)入哪個(gè)子集的位圖。
然后,針對線程組的公共寄存器和私人寄存器優(yōu)選地按照如下的方式來使用和處理。
首先,在著色器程序執(zhí)行中在線程組合并點(diǎn)之前,線程組優(yōu)選地能夠自由地從針對該線程組的私人寄存器讀取和向針對該線程組的私人寄存器寫入該組的全部線程(路徑)(即,針對“真實(shí)的”(活動(dòng))線程和“輔助”(非活動(dòng))線程)。
相應(yīng)地,在著色器程序執(zhí)行中在線程組合并點(diǎn)之前,線程組能夠優(yōu)選地僅向針對用于活動(dòng)線程的該組線程組(針對包含“真實(shí)的”(活動(dòng))線程的路徑)的“公共”寄存器進(jìn)行寫入。
類似地,在著色器程序執(zhí)行中在線程組合并點(diǎn)之前,通過線程組來對公共寄存器進(jìn)行讀取優(yōu)選地受到限制。例如,線程組優(yōu)選地根本無法讀取公共寄存器,或者僅能讀取針對包含“真實(shí)的”線程的這些路徑(針對線程組的活動(dòng)線程)的公共寄存器,和/或線程組僅讀取包含“真實(shí)的”(活動(dòng))線程中的實(shí)際值,包含“輔助”(非活動(dòng))線程的路徑接收默認(rèn)值(例如,全部為零)。
這有助于防止在線程組合并事件之前在線程組之間的通信。
在線程組已經(jīng)被合并之后(已經(jīng)執(zhí)行了合并事件),在特定優(yōu)選實(shí)施方式中,針對曾被合并的線程組的“私人”寄存器的內(nèi)容是無效的(并且因此僅針對曾被合并的線程組的公共寄存器被認(rèn)為具有有效值)。
對私人寄存器空間的訪問能夠相應(yīng)地針對合并后的單個(gè)線程組完全被阻斷。然而,在優(yōu)選實(shí)施方式中,針對合并后的單個(gè)線程組來分配新的一組私人寄存器。這可以根據(jù)需要例如通過如下方式來完成:將其中一個(gè)線程組的私人寄存器映射到單個(gè)、合并后的線程組的寄存器空間中,或者在合并事件之后將新的一組私人寄存器映射到針對合并后的線程組的寄存器空間中,或者將兩個(gè)線程組的私人寄存器進(jìn)行組合以給出更大的針對合并后的、單個(gè)線程組的私人寄存器空間。
在著色器程序包括多個(gè)線程組合并事件點(diǎn)的情況下,被合并的私人寄存器可以,并且優(yōu)選地確實(shí)僅在最后一個(gè)合并點(diǎn)之后變得可用。
對應(yīng)于針對線程組的公共寄存器和私人寄存器的上述布置,在特定優(yōu)選實(shí)施方式中,在著色器程序執(zhí)行中在合并事件點(diǎn)之前執(zhí)行要求使用非活動(dòng)(“輔助”)線程的任何指令,并且優(yōu)選地使用針對所討論的線程組的私人寄存器。
因此,執(zhí)行交叉采樣點(diǎn)計(jì)算(諸如像素增量、mipmap紋理查找)的任何指令優(yōu)選在線程組合并事件點(diǎn)之前出現(xiàn)并且使用私人寄存器作為其輸入,和/或結(jié)果可能是輸入到交叉采樣點(diǎn)計(jì)算中的輸入的任何指令優(yōu)選地在合并事件點(diǎn)之前出現(xiàn)并且將其結(jié)果寫入私人寄存器。
相應(yīng)地,在優(yōu)選實(shí)施方式中,需要跨越線程組合并事件而保存的來自合并事件點(diǎn)之前的任何數(shù)據(jù)項(xiàng)(即,在合并事件之后要針對合并后的、單個(gè)線程組可用)(在合并事件之前)被存儲(chǔ)在公共寄存器中。
這意味著可以安全地假設(shè)的是,在線程組合并事件之后,不再需要線程組的私人寄存器的內(nèi)容,使得這些私人寄存器然后能夠被無效掉和/或作為針對合并后的線程組的私人寄存器來重新使用。
著色器程序操作(代碼)優(yōu)選地通過對著色器程序代碼進(jìn)行編譯的編譯器來優(yōu)選地進(jìn)行組織(構(gòu)造),以實(shí)現(xiàn)該目的。
針對在著色器程序的執(zhí)行期間要(可能地)進(jìn)行合并的線程組的寄存器的上述細(xì)分和處理有利于被執(zhí)行的線程組的合并,無需實(shí)際上在物理上移動(dòng)寄存器之間的任何數(shù)據(jù)用于合并操作。
在需要使線程組的部分寄存器溢出以進(jìn)行堆積的情況下(這可以例如當(dāng)利用非常大的數(shù)據(jù)工作集來運(yùn)行片段著色器時(shí)發(fā)生),能夠按照上述針對寄存器所討論的方式再次使用兩個(gè)堆棧,一個(gè)“私人”、一個(gè)“公共”。然而,這不是必需的,并且在又一優(yōu)選實(shí)施方式中,在這種情況下使用單個(gè)堆棧,但是該單個(gè)堆棧在合并事件處被無效掉。為了便于這種操作,著色器程序優(yōu)選地被配置為(例如,通過編譯器)使得堆棧在合并事件的時(shí)候?yàn)榭铡?如果這在將作為線程組合并事件點(diǎn)有用的著色器程序中的任何一個(gè)點(diǎn)處都無法得到保證,則優(yōu)選地生成不具有任何線程組合并事件點(diǎn)的著色器程序。)
上文描述了在著色器程序操作期間將多個(gè)線程組合并為單個(gè)線程組的操作。申請人已經(jīng)意識到,逆向操作(即,使單個(gè)線程組“分離”成多個(gè)線程組)也能夠是有用的。
例如,存在諸如樣本頻率著色的這樣的一些圖形處理操作,其中,多個(gè)(例如,四個(gè))采樣點(diǎn)針對要生成的渲染輸出內(nèi)部的每個(gè)采樣位置進(jìn)行處理。在這種情況下,針對給定采樣位置的每組采樣點(diǎn)能夠作為一個(gè)線程組(warp)進(jìn)行處理(即,使得將存在針對要進(jìn)行處理的渲染輸出的每個(gè)采樣位置的一個(gè)線程組)。然而,申請人已經(jīng)意識到,在這些操作中,以及存在需要進(jìn)行的每采樣點(diǎn)計(jì)算中,能夠存在需要針對給定采樣位置的每個(gè)采樣點(diǎn)而等同地進(jìn)行的一些計(jì)算,并且事實(shí)上能夠根據(jù)采樣位置來進(jìn)行。這些每采樣位置計(jì)算將不需要針對每個(gè)采樣位置的完整的線程組,而單個(gè)線程組(路徑)能夠執(zhí)行針對給定采樣位置的計(jì)算。
在這種情況下,申請人已經(jīng)意識到,例如單個(gè)線程組(warp)能夠被用來執(zhí)行針對一組多個(gè)采樣位置的每采樣位置計(jì)算,多個(gè)各線程組然后被用來執(zhí)行針對采樣位置的每采樣點(diǎn)計(jì)算。因此,如果片段著色器程序例如被配置為或者能夠被配置為使得首先執(zhí)行每采樣位置操作,則對于針對給定的一組采樣位置的片段著色器執(zhí)行來說,在正在執(zhí)行每采樣位置計(jì)算的同時(shí),利用單個(gè)線程組開始將是可能的,然后該線程組被分割(“分離”)成多個(gè)線程組以執(zhí)行每采樣點(diǎn)操作(計(jì)算)。
因此,根據(jù)本發(fā)明的另一方面,提供有一種操作圖形處理流水線的方法,該圖形處理流水線包括執(zhí)行指令以進(jìn)行著色操作的可編程著色階段,其中,執(zhí)行線程可以一起被分組為線程組,在線程組中,分組的線程以一致步調(diào)、一次一個(gè)指令地來執(zhí)行,所述方法包括以下步驟:
連同線程組劃分事件指示一起向著色器階段發(fā)出用于通過所述著色器階段執(zhí)行以對執(zhí)行線程進(jìn)行處理用于生成渲染輸出的著色器程序,所述線程組劃分事件指示表示在所述著色器程序執(zhí)行中單個(gè)線程組要被劃分成多個(gè)單獨(dú)的線程組的點(diǎn);以及
所述著色階段:
執(zhí)行針對線程組的所述著色器程序,所述執(zhí)行針對線程組的所述著色器程序包括以下步驟:
當(dāng)所述線程組到達(dá)所述線程組劃分事件指示時(shí),將所述單個(gè)線程組劃分成多個(gè)單獨(dú)的線程組;以及
在劃分事件指示點(diǎn)之后,針對所述多個(gè)單獨(dú)的線程組執(zhí)行所述著色器程序中的進(jìn)一步的指令。
根據(jù)本發(fā)明的另一方面,提供有一種數(shù)據(jù)處理系統(tǒng),該數(shù)據(jù)處理系統(tǒng)包括:
圖形處理流水線,該圖形處理流水線包括執(zhí)行指令以進(jìn)行著色操作的可編程著色階段,其中,執(zhí)行線程能夠一起被分組為線程組,在所述線程組中,分組的線程以一致步調(diào)、一次一個(gè)指令地來執(zhí)行;以及
編譯器,該編譯器對針對所述著色階段的程序進(jìn)行編譯以生成用于通過所述著色階段執(zhí)行的指令;
其中,所述編譯器被配置為:
連同線程組劃分事件指示一起向著色器階段發(fā)出用于通過所述著色器階段執(zhí)行以對執(zhí)行線程進(jìn)行處理用于生成渲染輸出的著色器程序,所述線程組劃分事件指示表示在所述著色器程序執(zhí)行中線程組要被劃分成多個(gè)單獨(dú)的線程組的點(diǎn);以及
所述著色階段被配置為:
執(zhí)行針對線程組的所述著色器程序,所述執(zhí)行針對線程組的所述著色器程序包括以下步驟:
當(dāng)線程組到達(dá)所述線程組劃分事件指示時(shí),將所述單個(gè)線程組劃分成多個(gè)單獨(dú)的線程組;以及
在劃分事件指示點(diǎn)之后,針對所述多個(gè)單獨(dú)的線程組執(zhí)行所述著色器程序中的進(jìn)一步的指令。
在本發(fā)明的這些方面中,在著色器程序執(zhí)行中的某個(gè)點(diǎn)之后,正在進(jìn)行處理的線程組被劃分成多個(gè)單獨(dú)的線程組。然后這允許例如需要針對采樣位置的每個(gè)采樣點(diǎn)而等同地進(jìn)行的每采樣位置計(jì)算作為單個(gè)線程組進(jìn)行處理,然后一旦所述單個(gè)線程組已經(jīng)被劃分成多個(gè)單獨(dú)的線程組,就執(zhí)行所述每采樣點(diǎn)計(jì)算。這避免了例如消耗實(shí)際上并不需要的用于針對采樣點(diǎn)的計(jì)算的處理資源(諸如執(zhí)行周期)的需要。
如本領(lǐng)域技術(shù)人員所理解的,本發(fā)明的這些方面能夠并且優(yōu)選地確實(shí)包括本文酌情所公開的本發(fā)明的優(yōu)選和可選特征的任何一個(gè)或多個(gè)或者全部。
因此,例如,著色器程序優(yōu)選是片段著色器程序,并且相應(yīng)地,著色器階段優(yōu)選是(操作為)圖形處理流水線的片段著色器階段。
因此,例如線程組能夠是任何合適的其需要的尺寸。在優(yōu)選實(shí)施方式中,每個(gè)初始的單個(gè)線程組包含四個(gè)線程(即,存在為四的warp寬度)。在劃分事件之后的線程組優(yōu)選包含與初始的單個(gè)線程組相同數(shù)量的線程(所以例如是4個(gè)線程)。
類似地,包括在著色器程序中的線程組劃分事件指示優(yōu)選地按照上述的其中一種方式來提供(因此作為著色器程序中的指令或者其一部分,借助于著色器程序中的指令的修改程序或者對該指令的修改程序,或者通過能夠指示著色器程序中的線程組劃分事件點(diǎn)(諸如與著色器程序代碼本身分離地指定的分界點(diǎn))的某種其它方式)。
線程組劃分事件指示再次優(yōu)選地由用于圖形處理流水線的編譯器(著色器編譯器)來提供。
在特定優(yōu)選實(shí)施方式中,編譯器例如通過對要求圖形處理的主處理器的應(yīng)用來對所提供的著色器程序代碼進(jìn)行分析,確定線程組劃分事件在著色器程序執(zhí)行中的某個(gè)點(diǎn)處是否可能,并且如果可能的話,則在著色器程序中的合適的點(diǎn)處并且針對該點(diǎn)提供線程組劃分事件指示(例如,通過在該點(diǎn)處將特定指令嵌入到著色器程序中,或者以其它方式),以指示線程組劃分事件點(diǎn)。
在特定優(yōu)選實(shí)施方式中,編譯器還可以操作(在這種情況下是可能的)以對著色器程序中的操作進(jìn)行重新排序,以便例如提供在著色器程序執(zhí)行中包括線程組劃分事件的機(jī)會(huì),和/或以便允許在著色器程序的執(zhí)行中更加有效地包括并使用線程組劃分事件。
在這方面,編譯器優(yōu)選地進(jìn)行操作以將執(zhí)行每采樣位置計(jì)算的任何著色器程序操作布置在線程組劃分事件指示點(diǎn)之前。相應(yīng)地,編譯器優(yōu)選將執(zhí)行根據(jù)采樣點(diǎn)計(jì)算的任何著色器程序操作布置在著色器程序執(zhí)行中的線程組劃分事件點(diǎn)之后。
本發(fā)明的這些方面再次延伸至編譯器操作本身。
因此,根據(jù)本發(fā)明的另一方面,提供有一種編譯器,該編譯器對程序進(jìn)行編譯以生成用于圖形處理流水線的著色階段的指令,該圖形處理流水線執(zhí)行指令以執(zhí)行著色操作,并且其中,執(zhí)行線程可以一起被分組為線程組,在線程組中,分組的線程以一致步調(diào)、一次一個(gè)指令地來執(zhí)行;
其中,所述編譯器被配置為,針對要通過著色器階段執(zhí)行的著色器程序:
確定所述著色器程序是否包括必須針對要執(zhí)行的線程來單獨(dú)執(zhí)行的操作和能夠針對要執(zhí)行的多組線程來共同執(zhí)行的操作;以及
當(dāng)確定所述著色器程序包括必須針對要執(zhí)行的線程來單獨(dú)執(zhí)行的操作和能夠針對要執(zhí)行的多組線程來共同執(zhí)行的操作時(shí),在所述著色器程序中包括或者為所述著色器程序提供指示在所述著色器程序執(zhí)行中線程組應(yīng)當(dāng)被劃分成多個(gè)單獨(dú)的線程組的點(diǎn)的線程組劃分事件指示,所述線程組劃分點(diǎn)在所述著色器程序中在能夠針對要執(zhí)行的多組線程來共同執(zhí)行的操作之后,并且在所述著色器程序中在必須針對要執(zhí)行的線程來單獨(dú)執(zhí)行的操作中的一個(gè)或更多個(gè)(并且優(yōu)選地全部)操作之前。
因此,根據(jù)本發(fā)明的另一方面,提供有一種對程序進(jìn)行編譯以生成用于圖形處理流水線的著色階段的指令的方法,該圖形處理流水線執(zhí)行指令以執(zhí)行著色操作,并且其中,執(zhí)行線程可以一起被分組為線程組,在線程組中,分組的線程以一致步調(diào)、一次一個(gè)指令地來執(zhí)行;
針對要通過著色器階段執(zhí)行的著色器程序,所述方法包括以下步驟:
確定所述著色器程序是否包括必須針對要執(zhí)行的線程來單獨(dú)執(zhí)行的操作和能夠針對要執(zhí)行的多組線程來共同執(zhí)行的操作;以及
當(dāng)確定所述著色器程序包括必須針對要執(zhí)行的線程來單獨(dú)執(zhí)行的操作和能夠針對要執(zhí)行的多組線程來共同執(zhí)行的操作時(shí),在所述著色器程序中包括或者為所述著色器程序提供指示在所述著色器程序執(zhí)行中線程組應(yīng)當(dāng)被劃分成多個(gè)單獨(dú)的線程組的點(diǎn)的線程組劃分事件指示,所述線程組劃分點(diǎn)在所述著色器程序中在能夠針對要執(zhí)行的多組線程來共同執(zhí)行的操作之后,并且在所述著色器程序中在必須針對要執(zhí)行的線程來單獨(dú)執(zhí)行的操作中的一個(gè)或更多個(gè)(并且優(yōu)選地全部)操作之前。
本發(fā)明的這些方面相應(yīng)地還延伸至能夠響應(yīng)于針對正在被著色器階段執(zhí)行的著色器程序的線程組劃分指示來劃分線程組的圖形處理流水線的著色器階段。
因此,根據(jù)本發(fā)明的另一方面,提供有一種圖形處理流水線的著色器階段,該著色器階段執(zhí)行指令以執(zhí)行著色操作,并且其中,執(zhí)行線程可以一起被分組為線程組,在線程組中,分組的線程以一致步調(diào)、一次一個(gè)指令地來執(zhí)行,所述著色階段被配置為:
當(dāng)執(zhí)行著色器程序的指令時(shí),響應(yīng)于指示所述著色器程序執(zhí)行中的如下的點(diǎn)的線程組劃分事件指示,即,在該點(diǎn)處,線程組應(yīng)當(dāng)被劃分成與所述著色器程序相關(guān)聯(lián)的多個(gè)單獨(dú)的線程組:
將線程組劃分成多個(gè)單獨(dú)的線程組;以及
在劃分事件指示之后,針對所述多個(gè)單獨(dú)的線程組執(zhí)行所述著色器程序中的進(jìn)一步的指令。
根據(jù)本發(fā)明的另一方面,提供有一種操作圖形處理流水線的著色器階段的方法,該著色器階段執(zhí)行指令以執(zhí)行著色操作,并且其中,執(zhí)行線程可以一起被分組為線程組,在線程組中,分組的線程以一致步調(diào)、一次一個(gè)指令地來執(zhí)行;
所述方法包括所述著色器階段,當(dāng)執(zhí)行著色器程序的指令時(shí),響應(yīng)于指示所述著色器程序執(zhí)行中的如下的點(diǎn)的線程組劃分事件指示,即,在該點(diǎn)處,線程組應(yīng)當(dāng)被劃分成與所述著色器程序相關(guān)聯(lián)的多個(gè)單獨(dú)的線程組:
將線程組劃分成多個(gè)單獨(dú)的線程組;以及
在劃分事件指示之后,針對所述多個(gè)單獨(dú)的線程組執(zhí)行所述著色器程序中的進(jìn)一步的指令。
如本領(lǐng)域技術(shù)人員所理解的,本發(fā)明的這些方面能夠并且優(yōu)選地確實(shí)包括本文酌情所公開的本發(fā)明的優(yōu)選和可選特征的任何一個(gè)或多個(gè)或者全部。因此,例如,著色器程序優(yōu)選是片段著色器程序,并且相應(yīng)地,著色器階段優(yōu)選是(操作為)圖形處理流水線的片段著色器階段。
在本發(fā)明的這些方面和實(shí)施方式中,一旦線程組已經(jīng)被向著色階段發(fā)出,該著色階段就將執(zhí)行針對所述線程組的著色器程序。然后,當(dāng)(優(yōu)選地當(dāng)每個(gè))線程組到達(dá)線程組劃分事件指示時(shí),線程組被劃分成多個(gè)單獨(dú)的線程組。如有需要,能夠在著色器程序中包括超過一個(gè)的線程組劃分事件點(diǎn)(和指示)。在這種情況下,所劃分的線程組當(dāng)其到達(dá)著色器程序執(zhí)行中的后面的劃分點(diǎn)時(shí)可以再次被劃分。
能夠根據(jù)需要選擇初始的單個(gè)線程組被劃分成的線程組的數(shù)量,并且可以,例如并且優(yōu)選地,取決于著色器所支持的線程組的大小和要針對每個(gè)采樣位置考慮的采樣點(diǎn)的數(shù)量。
因此,例如并且優(yōu)選地,初始的單個(gè)線程組能夠被劃分成多個(gè)單獨(dú)的線程組,每個(gè)線程組代表來自初始的單個(gè)線程組的其中一個(gè)線程(路徑)。這可以在例如每個(gè)采樣位置具有與著色器程序中的線程組能夠包含的線程的數(shù)量相對應(yīng)的與該采樣位置相關(guān)聯(lián)的多個(gè)采樣點(diǎn)的情況下是合適的。在這種情況下,(優(yōu)選地每個(gè))初始的線程組將被劃分成和初始的線程組中的線程一樣多的單獨(dú)的線程組。
另選地或者另外,能夠使用同一線程組對來自不同采樣位置的采樣點(diǎn)進(jìn)行處理。例如,針對初始的單個(gè)線程組所代表的采樣位置中的每一個(gè)采樣位置的相應(yīng)的采樣點(diǎn)位置的采樣點(diǎn)能夠在所述初始的單個(gè)線程組已經(jīng)被劃分之后作為相應(yīng)的線程組來進(jìn)行處理。在這種情況下,初始的線程組將被劃分成多個(gè)單獨(dú)的線程組,每個(gè)線程組代表(例如并且優(yōu)選地)來自針對來自初始的單個(gè)線程組的線程(路徑)中的每一個(gè)線程(路徑)的各個(gè)采樣點(diǎn)位置中的一個(gè)采樣點(diǎn)位置的采樣點(diǎn)。因此,在這種情況下,(優(yōu)選地每個(gè))初始的線程組將被(并且優(yōu)選地被)劃分成與根據(jù)要進(jìn)行處理的采樣位置的采樣點(diǎn)一樣多的單獨(dú)的線程組。
在線程組劃分事件之后,針對經(jīng)劃分后的線程組(多個(gè)單獨(dú)的線程組)來執(zhí)行著色器程序中的進(jìn)一步指令。在優(yōu)選實(shí)施方式中,在著色器程序中在劃分事件指示點(diǎn)之后的其余指令的執(zhí)行(合適地)針對多個(gè)單獨(dú)的線程組來完成。
在本發(fā)明的這些方面和實(shí)施方式的優(yōu)選實(shí)施方式中,從中讀取數(shù)據(jù)并向其寫入數(shù)據(jù)的寄存器當(dāng)執(zhí)行針對線程組的著色器程序時(shí)以特定的方式進(jìn)行布置,因?yàn)檫@將再次有助于促進(jìn)線程組劃分操作。
因此,在特定優(yōu)選實(shí)施方式中,在著色器程序的執(zhí)行期間使用的寄存器再次被劃分成兩個(gè)子集,一組是優(yōu)選從著色器程序的執(zhí)行開始在物理上由初始的單個(gè)線程組和在要從該單個(gè)線程組中劃分出的一組線程組中的線程組共享的“公共”寄存器,并且一組是對于每個(gè)線程組來說跟別是本地的(且專屬的)并且對于其它線程組或多個(gè)組來說是不可訪問的多組寄存器的“私人”寄存器(即,每個(gè)線程組(初始的單個(gè)線程組和該單個(gè)線程組劃分成的一組線程組中的線程組)將具有僅其自身能夠訪問的其自身的一組“私人”寄存器)。
在這些布置中,在著色器程序執(zhí)行中在線程組劃分點(diǎn)之前,初始的“單個(gè)”線程組優(yōu)選將針對(多個(gè))線程組的公共寄存器用于其計(jì)算(并且因此能夠優(yōu)選自由地從針對該(多個(gè))線程組的公共寄存器讀取并且向針對該(多個(gè))線程組的公共寄存器寫入該組的全部線程(路徑))。
因此,在初始的單個(gè)線程組已經(jīng)被劃分之后(劃分事件已經(jīng)執(zhí)行),針對曾被劃分的公共寄存器優(yōu)選作為(多個(gè))只讀寄存器來進(jìn)行處理(以便保存每采樣位置值),并且在線程組劃分事件之后執(zhí)行的計(jì)算優(yōu)選地(并且優(yōu)選地僅)使用針對所討論的線程組的私人寄存器。
著色器程序操作(代碼)優(yōu)選地通過對著色器程序代碼進(jìn)行編譯的編譯器來優(yōu)選地進(jìn)行組織(構(gòu)造),以實(shí)現(xiàn)該目的。相應(yīng)地,能夠在開始著色器程序執(zhí)行之前針對線程組保留合適的私人寄存器和公共寄存器。
針對在著色器程序的執(zhí)行期間要進(jìn)行劃分的線程組的寄存器的上述細(xì)分和處理有利于被執(zhí)行的線程組的劃分,而無需實(shí)際上物理地在寄存器之間移動(dòng)任何數(shù)據(jù)用于劃分操作。
如有需要,將有可能在給定的著色器程序中包括線程組合并事件機(jī)會(huì)和線程組劃分事件兩者。然而,申請人相信在大多數(shù)情況下,在給定的著色器程序中包括這些事件中的一個(gè)或另一個(gè),而不是兩者,將是合適的。
從上述內(nèi)容中將理解,在本發(fā)明的線程組合并操作和線程組劃分操作兩者中,一個(gè)重要的特征是線程和線程組使用的寄存器被設(shè)置成“私人”寄存器和“公共”寄存器。可以相信的是,當(dāng)正在執(zhí)行著色器程序時(shí)被線程組使用的寄存器的這種設(shè)置在其自身而言是新穎且有利的。
因此,根據(jù)本發(fā)明的又一方面,提供有一種分配寄存器的方法,所述寄存器供線程組在執(zhí)行指令以進(jìn)行圖形處理流水線中的處理操作時(shí)使用,該圖形處理流水線包括執(zhí)行指令以進(jìn)行著色操作的可編程著色階段,并且其中,執(zhí)行線程可以一起被分組為線程組,在線程組中,分組的線程以一致步調(diào)、一次一個(gè)指令地來執(zhí)行,所述方法包括以下步驟:
針對在著色器程序的執(zhí)行期間要由所述圖形處理流水線的可編程著色階段來執(zhí)行所述著色器程序的線程組,提供以下組件以供使用:
要與要執(zhí)行所述著色器程序的其它線程組共享的公共寄存器或多個(gè)公共寄存器;以及
對所述線程組來說是本地的(專屬的)并且對要執(zhí)行所述著色器程序的其它線程組來說不可訪問的私人寄存器或多個(gè)私人寄存器。
根據(jù)本發(fā)明的又一方面,提供有一種圖形處理流水線,所述圖形處理流水線包括:
一個(gè)或更多個(gè)可編程著色階段,所述一個(gè)或更多個(gè)可編程著色階段執(zhí)行指令以進(jìn)行著色操作,其中,執(zhí)行線程可以一起被分組為線程組,在線程組中,分組的線程以一致步調(diào)、一次一個(gè)指令地來執(zhí)行;以及
多個(gè)寄存器,所述多個(gè)寄存器供線程組在執(zhí)行指令以進(jìn)行處理操作時(shí)使用;其中:
在使用中設(shè)置所述多個(gè)寄存器,以便針對在著色器程序的執(zhí)行期間要由所述圖形處理流水線的可編程著色階段來執(zhí)行所述著色器程序的線程組,提供以下組件以供使用:
要與要執(zhí)行所述著色器程序的其它線程組共享的公共寄存器或多個(gè)公共寄存器;以及
對所述線程組來說是本地的(專屬的)并且對要執(zhí)行所述著色器程序的其它線程組來說不可訪問的私人寄存器或多個(gè)私人寄存器。
如本領(lǐng)域技術(shù)人員所理解的,本發(fā)明的這些方面能夠并且優(yōu)選地確實(shí)包括本文酌情所公開的本發(fā)明的優(yōu)選和可選特征的任何一個(gè)或多個(gè)或者全部。
因此,例如,將寄存器細(xì)分成公共寄存器和私人寄存器優(yōu)選地按照上述的其中一種方式來執(zhí)行。
相應(yīng)地,著色器程序執(zhí)行優(yōu)選將針對線程組的公共寄存器或多個(gè)公共寄存器用于特定(優(yōu)選所選擇的)操作,并且優(yōu)選將針對線程組的私人寄存器或多個(gè)私人寄存器用于其它(優(yōu)選所選擇的)操作。
類似地,在特定優(yōu)選實(shí)施方式中,將公共寄存器和私人寄存器用于線程組的著色器程序操作優(yōu)選地基于已經(jīng)到達(dá)的著色器程序內(nèi)的點(diǎn)而發(fā)生變化和/或進(jìn)行選擇。
圖形處理流水線的片段著色器能夠根據(jù)需要并且以任何合適的方式來實(shí)現(xiàn),并且能夠視情況而定來執(zhí)行任何需要的且合適的片段著色功能。其可以例如對基元或多個(gè)基元進(jìn)行渲染以生成一組渲染輸出值,例如表示用于顯示的幀。這些輸出值然后可以被導(dǎo)出到外部存儲(chǔ)器用于存儲(chǔ)和使用,諸如被導(dǎo)出到顯示器的幀緩存。
如有需要且根據(jù)需要,和片段著色器一樣,圖形處理流水線的(多個(gè))可編程處理階段可以用作(操作為)(圖形處理流水線可以包括)其它著色器階段(著色器),諸如頂點(diǎn)著色器、幾何著色器等。
圖形處理流水線的每個(gè)可編程處理階段(執(zhí)行單元)可以包括任何合適的可編程硬件元件,諸如可編程處理電路。每個(gè)可編程處理階段可以作為單獨(dú)的電路元件被提供到處理流水線的其它可編程階段,或者可編程處理階段可以共享其部分或全部的可編程處理電路(然后不同地進(jìn)行編程以用作所需的可編程處理階段)。
和任何可編程處理(著色)階段一樣,圖形處理流水線還可以包含任何其它的合適且需要的處理階段,在這些處理階段中,圖形處理流水線可以包含諸如柵格化器、早期深度(或者早期深度和模板)測試儀、后期深度(或深度和模板)測試儀、混合器、塊元緩存、寫出單元等。
本發(fā)明能夠被用于圖形處理流水線可以被用來生成的全部形式的輸出,例如用于顯示的幀、渲染到紋理輸出等。來自圖形處理的輸出(例如,片段著色的數(shù)據(jù)值)優(yōu)選被導(dǎo)出到外部(例如,主)存儲(chǔ)器用于存儲(chǔ)和使用,諸如被導(dǎo)出到顯示器的幀緩存。
在一些實(shí)施方式中,所述圖形處理流水線包括和/或與存儲(chǔ)本文描述的所述數(shù)據(jù)和/或存儲(chǔ)用于執(zhí)行本文描述的過程的一個(gè)或更多個(gè)存儲(chǔ)器和/或存儲(chǔ)設(shè)備進(jìn)行通信。圖形處理流水線還可以與主微處理器進(jìn)行通信,和/或利用顯示器用于基于由圖形處理器生成的數(shù)據(jù)來顯示圖像。
本發(fā)明適用于任何合適的形式或配置的圖形處理器。其特別適用于基于塊元的圖形處理器和圖形處理系統(tǒng)。因此在優(yōu)選實(shí)施方式中,圖形處理系統(tǒng)和圖形處理流水線分別是基于塊元的系統(tǒng)和流水線。
在特別優(yōu)選的實(shí)施方式中,本發(fā)明的各種功能在生成并輸出例如被寫出到用于顯示設(shè)備的幀緩存的經(jīng)渲染的片段數(shù)據(jù)的單個(gè)圖形處理平臺(tái)上執(zhí)行。
本發(fā)明能夠在任何合適的系統(tǒng),例如合適配置的基于微處理器的系統(tǒng)中實(shí)現(xiàn)。在優(yōu)選實(shí)施方式中,本發(fā)明在計(jì)算機(jī)和/或基于微處理器的系統(tǒng)中實(shí)現(xiàn)。
本發(fā)明的各種功能能夠以任何合適且期望的方式來執(zhí)行。例如,如所期望的,本發(fā)明的功能能夠在硬件或軟件中實(shí)現(xiàn)。因此,例如,除非另有說明,本發(fā)明的各種功能元件、階段和“手段”可以包括能夠被操作為執(zhí)行各種功能等的合適的處理器或多個(gè)處理器、控制器或多個(gè)控制器、功能單元、電路、處理邏輯器、微處理器裝置等,例如能夠被編程為以期望的方式運(yùn)行的適當(dāng)專用的硬件元件和/或可編程硬件元件。
這里應(yīng)當(dāng)注意的是,如本領(lǐng)域技術(shù)人員將要理解的,本發(fā)明的各種功能等可以在給定的處理器上重復(fù)和/或執(zhí)行。同樣地,如果需要的話,各種處理階段可以共享處理電路等。
關(guān)于執(zhí)行上述的特定功能所需的任何硬件,數(shù)據(jù)處理系統(tǒng)和流水線另外能夠包括數(shù)據(jù)處理流水線所包括的通常的功能單元中的任何一個(gè)或更多個(gè)或者全部等。
本領(lǐng)域技術(shù)人員還將理解,視情況而定,本發(fā)明的全部所述的方面和實(shí)施方式都能夠并且優(yōu)選地確實(shí)包括本文所述的優(yōu)選的和可選的特征中的任何一個(gè)或多個(gè)或者全部。
根據(jù)本發(fā)明的方法可以至少部分地利用軟件,例如計(jì)算機(jī)程序,來實(shí)現(xiàn)。因此可見,當(dāng)從其他方面來看時(shí),本發(fā)明提供:計(jì)算機(jī)軟件,當(dāng)安裝在數(shù)據(jù)處理裝置上時(shí),該計(jì)算機(jī)軟件具體適用于執(zhí)行本文所述的方法的;計(jì)算機(jī)程序元件,其包括當(dāng)該程序元件在數(shù)據(jù)處理裝置上運(yùn)行時(shí)用于執(zhí)行本文所述的方法的計(jì)算機(jī)軟件代碼部分;以及計(jì)算機(jī)程序,當(dāng)該程序在數(shù)據(jù)處理系統(tǒng)上運(yùn)行時(shí),該計(jì)算機(jī)程序包括適用于執(zhí)行本文所述的方法或多種方法的全部步驟的代碼裝置。數(shù)據(jù)處理器可以是微處理器系統(tǒng)、可編程FPGA(現(xiàn)場可編程門陣列)等。
本發(fā)明還延伸至包括如下軟件的計(jì)算機(jī)軟件載體,即,當(dāng)該軟件被用來操作圖形處理器時(shí),包括數(shù)據(jù)處理裝置的渲染器或微處理器系統(tǒng)促進(jìn)與所述數(shù)據(jù)處理裝置和所述處理器、渲染器或系統(tǒng)的連接,以執(zhí)行本發(fā)明的方法的步驟。這種計(jì)算機(jī)軟件載體可以是諸如ROM芯片、CD ROM、RAM、閃速存儲(chǔ)器或磁盤的物理存儲(chǔ)介質(zhì),或者可以是諸如通過電線的電子信號、光學(xué)信號或例如對衛(wèi)星等的無線電信號這樣的信號。
將要進(jìn)一步理解的是,并非本發(fā)明的方法的全部步驟都需要由計(jì)算機(jī)軟件來執(zhí)行,因此從更寬泛的方面來看,本發(fā)明提供用于執(zhí)行本文所列出的方法的步驟中的至少一個(gè)的計(jì)算機(jī)軟件和安裝在計(jì)算機(jī)軟件載體上的這種軟件。
因此本發(fā)明可以被合適地體現(xiàn)為計(jì)算機(jī)程序產(chǎn)品,與計(jì)算機(jī)系統(tǒng)一起使用。這種實(shí)施可以包括要么是固定在有形非瞬時(shí)性介質(zhì)上的一系列計(jì)算機(jī)可讀指令,該有形非瞬時(shí)性介質(zhì)例如有計(jì)算機(jī)可讀介質(zhì),例如磁盤、CD-ROM、ROM、RAM、閃速存儲(chǔ)器或硬盤。這種實(shí)施還可以包括通過有形介質(zhì)或者無形地利用無線技術(shù)經(jīng)由調(diào)制解調(diào)器或其它接口裝置可以向計(jì)算機(jī)系統(tǒng)傳輸?shù)囊幌到y(tǒng)計(jì)算機(jī)可讀指令,該有形介質(zhì)包括但不限制于光學(xué)或模擬通信線路,該無線技術(shù)包括但不限制于微波、紅外或其它傳輸技術(shù)。一系列的計(jì)算機(jī)可讀指令體現(xiàn)本文之前所述的全部或部分的功能。
本領(lǐng)域技術(shù)人員將理解,這種計(jì)算機(jī)可讀指令能夠以許多編程語言的形式來編寫,與很多計(jì)算機(jī)架構(gòu)或操作系統(tǒng)一起使用。進(jìn)一步地,這種指令可以利用當(dāng)前或未來的包括但不限制于半導(dǎo)體、磁性的或光學(xué)的任何存儲(chǔ)技術(shù)來存儲(chǔ),或者可以利用當(dāng)前或未來包括但不限制于光學(xué)、紅外或微波的任何通信技術(shù)來進(jìn)行發(fā)送??梢韵氲剑@種計(jì)算機(jī)程序產(chǎn)品可以利用另外的印刷或電子文檔,例如利用計(jì)算機(jī)系統(tǒng)在例如系統(tǒng)ROM或固定磁盤上預(yù)加載的壓縮打包軟件,作為可去除介質(zhì)進(jìn)行分發(fā),或者通過網(wǎng)絡(luò)例如因特網(wǎng)或萬維網(wǎng)從服務(wù)器或電子公告板進(jìn)行分發(fā)。
附圖說明
將通過僅示例的方式并參照附圖描述本發(fā)明的多個(gè)優(yōu)選實(shí)施方式,在附圖中:
圖1示意性地示出與采樣點(diǎn)的網(wǎng)格重疊的基元;
圖2示出示例性計(jì)算機(jī)圖形處理系統(tǒng);
圖3示意性地示出能夠按照本發(fā)明的方式進(jìn)行操作的圖形處理流水線;
圖4示意性地示出對著色器程序進(jìn)行編譯以用于通過圖形處理流水線來執(zhí)行;
圖5示意性地示出本發(fā)明的第一實(shí)施方式;
圖6A和圖6B示意性地示出在本發(fā)明的第一實(shí)施方式中寄存器的使用;
圖7示意性地示出在本發(fā)明的第一實(shí)施方式中編譯器的操作;
圖8示意性地示出本發(fā)明的第二實(shí)施方式;
圖9A和圖9B示意性地示出在本發(fā)明的第二實(shí)施方式中寄存器的使用;
圖10示意性地示出在本發(fā)明的第二實(shí)施方式中編譯器的操作。
具體實(shí)施方式
相同的參考標(biāo)記在附圖中合適的地方被用于相同的部件。
下面將在用于顯示的計(jì)算機(jī)圖形的處理的上下文中來描述本發(fā)明的多個(gè)優(yōu)選實(shí)施方式。
圖2示出典型的計(jì)算機(jī)圖形處理系統(tǒng)。
應(yīng)用2(諸如在主處理器1上執(zhí)行的游戲)將要求圖形處理操作由關(guān)聯(lián)圖形處理單元(圖形處理流水線)3來執(zhí)行。為此,該應(yīng)用將生成被用于圖形處理流水線3的正在主處理器1上運(yùn)行的驅(qū)動(dòng)器4解讀的API(應(yīng)用編程接口)調(diào)用,以對圖形處理器3生成合適的命令以生成應(yīng)用2所需的圖形輸出。為了促進(jìn)這一過程,將響應(yīng)于來自在主系統(tǒng)1上運(yùn)行的應(yīng)用2的命令向圖形處理器3提供一組“命令”,用于圖形輸出(例如,以生成要進(jìn)行顯示的幀)。
圖3更加詳細(xì)地示出該實(shí)施方式的圖形處理流水線3。
圖3中所示的圖形處理流水線3是基于塊元的渲染器,并且如本領(lǐng)域中已知的,將因此產(chǎn)生渲染輸出數(shù)據(jù)陣列的塊元,諸如要生成的輸出幀。
(在基于塊元的渲染中,渲染輸出(例如要顯示的幀)被劃分成多個(gè)更小的子區(qū)域,通常被稱為“塊元”,而不是整個(gè)渲染輸出(例如,如在即時(shí)模式渲染中一氣呵成地有效地進(jìn)行處理的幀)。每個(gè)塊元(子區(qū)域)被分別(通常一個(gè)接著一個(gè)地)渲染,然后經(jīng)渲染的塊元(子區(qū)域)被重新組合以提供完整的渲染輸出,例如用于顯示的幀。在這種設(shè)置中,渲染輸出通常被劃分成規(guī)則大小和形狀的子區(qū)域(塊元)(其例如通常是正方形或長方形),但是這不是最重要的。)
如本領(lǐng)域中已知的,渲染輸出數(shù)據(jù)陣列通??梢允怯糜谠谥T如屏幕或打印機(jī)的顯示設(shè)備上顯示的輸出幀,但是例如還可以包括用于在后面的渲染中使用的中間數(shù)據(jù)(還被已知為“渲染到紋理(render to texture)”輸出)等。
(當(dāng)要顯示計(jì)算機(jī)圖形圖像時(shí),其通常首先被限定為一系列基元(多邊形),然后所述基元被劃分(被柵格化)成圖形片段,接下來用于圖形渲染。在正常的圖形渲染操作中,渲染器將修改與每個(gè)片段相關(guān)聯(lián)的(例如)顏色(紅色、綠色和藍(lán)色,RGB)和透明度(阿爾法,α)數(shù)據(jù),使得能夠正確地顯示片段。一旦片段已經(jīng)完全遍歷了渲染器,則其關(guān)聯(lián)數(shù)據(jù)值就被存儲(chǔ)在存儲(chǔ)器中,準(zhǔn)備用于輸出例如用于顯示。)
圖3示出與本實(shí)施方式的操作相關(guān)的圖形處理流水線3的主要元件和流水線階段。如本領(lǐng)域技術(shù)人員將要理解的,可以存在未在圖3中例示的圖形處理流水線的其它元件。這里還應(yīng)當(dāng)注意,圖3僅僅是示意性的,并且例如實(shí)際上所述的功能單元和流水線階段可以共享重要的硬件電路,即使在圖3中它們被示意性地示出為單獨(dú)的階段。還將理解,如圖3中所示的圖形處理流水線的階段、元件和單元等中的每個(gè)階段、元件和單元可以根據(jù)需要來實(shí)現(xiàn),并且因此將包括例如合適的電路和/或處理邏輯等,用于執(zhí)行必要的操作和功能。
如圖3中所示,圖形處理流水線3包括多個(gè)階段,該多個(gè)階段包括頂點(diǎn)著色器20、外殼著色器21、曲面細(xì)分器22、域著色器23、幾何著色器24、柵格化階段25、早期Z(深度)和模板測試階段26、以片段著色階段的形式的渲染器27、后期Z(深度)和模板測試階段28、混合階段29、塊元緩存30以及降采樣和寫出(多重采樣分辨)階段31。
頂點(diǎn)著色器20采用針對要生成的輸出而限定的與頂點(diǎn)相關(guān)聯(lián)的輸入數(shù)據(jù)值等,并且對這些數(shù)據(jù)值進(jìn)行處理以生成一組相應(yīng)的“頂點(diǎn)著色的”輸出數(shù)據(jù)值,以供圖形處理流水線3的后續(xù)階段使用。頂點(diǎn)著色例如對輸入數(shù)據(jù)進(jìn)行修改,以將要進(jìn)行渲染的圖像的照明效果考慮在內(nèi)。
外殼著色器21執(zhí)行對多組補(bǔ)丁控制點(diǎn)的操作并且生成已知為補(bǔ)丁常數(shù)的附加數(shù)據(jù),曲面細(xì)分階段22將幾何圖形細(xì)分以創(chuàng)建外殼的更高階的表示,域著色器23執(zhí)行對通過曲面細(xì)分階段輸出的頂點(diǎn)的操作(與頂點(diǎn)著色器相似),并且?guī)缀沃?4處理諸如三角形、點(diǎn)或線的全部基元。響應(yīng)于向圖形處理流水線3提供的命令和頂點(diǎn)數(shù)據(jù),這些階段和頂點(diǎn)著色器21一起有效地執(zhí)行全部的必要片段前端操作,諸如轉(zhuǎn)換操作和照明操作,并且執(zhí)行基元設(shè)置來設(shè)置要進(jìn)行渲染的基元。
圖形處理流水線3的柵格化階段25進(jìn)行操作以將組成渲染輸出(例如要進(jìn)行顯示的圖像)的基元柵格化成各個(gè)圖形片段以用于處理。為此,柵格化器25接收圖形基元以用于渲染,將基元柵格化成采樣點(diǎn)并且生成具有合適位置(代表合適的采樣位置)的圖形片段,用于對基元進(jìn)行渲染。
由柵格化器生成的片段然后進(jìn)一步被發(fā)送到流水線的其余部分用于處理。
早期Z/模板測試階段26對其從柵格化器25接收的片段執(zhí)行Z(深度)測試,以看看在這個(gè)階段是否能夠丟棄(剔除)任何片段。為此,早期Z/模板測試階段26將從柵格化器25發(fā)出的片段的(與片段相關(guān)聯(lián)的)深度值與已經(jīng)進(jìn)行渲染的片段的深度值進(jìn)行比較(這些深度值被存儲(chǔ)在作為塊元緩存30的一部分的深度(Z)緩存中),以確定新片段是否將被已經(jīng)進(jìn)行渲染的片段排除在外。同時(shí),執(zhí)行早期模板測試。
經(jīng)過片段早期Z和模板測試階段26的片段然后被發(fā)送到片段著色階段27。片段著色階段27對經(jīng)過早期Z和模板測試的片段執(zhí)行合適的片段處理操作,以便處理片段以生成合適的經(jīng)渲染的片段數(shù)據(jù)。
該片段處理可以包括任何合適的且需要的片段著色處理,諸如對片段執(zhí)行片段著色器程序、向片段施加紋理、向片段施加霧化操作或其它操作等,以生成合適的片段數(shù)據(jù)。在該實(shí)施方式中,片段著色階段27是著色器流水線的形式(可編程片段著色器)。
然后還存在“后期”片段Z和模板測試階段28,其尤其是對經(jīng)著色的片段執(zhí)行流水線末端深度測試,以確定在最終的圖像中實(shí)際上是否能看到經(jīng)渲染的片段。該深度測試使用針對存儲(chǔ)在塊元緩存30中的Z緩存中的片段的位置的Z緩存值,以如本領(lǐng)域中已知的,通過將從片段著色階段27發(fā)出的片段的(與片段相關(guān)聯(lián)的)深度值與已經(jīng)進(jìn)行渲染的片段的深度值(如存儲(chǔ)在深度緩存中的)進(jìn)行比較,確定針對新片段的片段數(shù)據(jù)是否應(yīng)當(dāng)替換已經(jīng)進(jìn)行渲染的片段的片段數(shù)據(jù)。該后期片段深度和模板測試階段28還對片段執(zhí)行任何必要的“后期”阿爾法和/或模板測試。
如有需要,經(jīng)過后期片段測試階段28的片段然后利用已經(jīng)被存儲(chǔ)在混合器29中的塊元緩存30中的片段來進(jìn)行任何必要的混合操作。對片段來說必要的任何其它剩余操作,諸如抖動(dòng)等(未示出),也在這個(gè)階段執(zhí)行。
最后,(經(jīng)混合的)輸出片段數(shù)據(jù)(值)被寫入到塊元緩存30,這些輸出片段數(shù)據(jù)(值)能夠從該塊元緩存30例如被輸出到幀緩存用于顯示。針對輸出片段的深度值也被恰當(dāng)?shù)貙懭雺K元緩存30內(nèi)部的Z緩存。(塊元緩存存儲(chǔ)顏色緩存和深度緩存,所述顏色緩存和深度緩存針對這些緩存所代表的每個(gè)采樣點(diǎn)(實(shí)質(zhì)上針對正在進(jìn)行處理的塊元的每個(gè)采樣點(diǎn))分別存儲(chǔ)合適的顏色等或者Z值。這些緩存存儲(chǔ)代表整體渲染輸出(例如,要顯示的圖像)的一部分(塊元)的片段數(shù)據(jù)的陣列,緩存中的相應(yīng)組的樣本值對應(yīng)于整體渲染輸出的相應(yīng)的像素(例如,每個(gè)2x2組的樣本值可以對應(yīng)于輸出像素,其中4x多重采樣正在被使用)。
提供塊元緩存作為被定位在圖形處理流水線(芯片)上(對圖形處理流水線來說是本地的)的RAM的一部分。
來自塊元緩存30的數(shù)據(jù)被輸入到降采樣(多重采樣分辨)寫出單元31,并且從其輸出(寫回)到外部存儲(chǔ)器輸出緩存,諸如顯示設(shè)備的幀緩存(未示出)。(顯示設(shè)備能夠包括例如包括像素的陣列的顯示器,諸如計(jì)算機(jī)監(jiān)控器或打印機(jī)。)
降采樣和寫出單元31將存儲(chǔ)在塊元緩存30中的片段數(shù)據(jù)降采樣成針對輸出緩存(設(shè)備)的合適的分辨率(即,使得生成與輸出設(shè)備的像素相對應(yīng)的像素?cái)?shù)據(jù)的陣列),以生成輸出值(像素)用于輸出到輸出緩存。
一旦渲染輸出的塊元已經(jīng)進(jìn)行處理并且其數(shù)據(jù)被導(dǎo)出到主存儲(chǔ)器(例如,被導(dǎo)出到主存儲(chǔ)器中的幀緩存(未示出))用于存儲(chǔ),則下一個(gè)塊元接著進(jìn)行處理,諸如此類,直至足夠的塊元已經(jīng)進(jìn)行處理以生成全部渲染輸出(例如,要顯示的幀(圖像))。然后重復(fù)該處理用于下一渲染輸出(例如幀)等。
針對圖形處理流水線3的其它布置也將當(dāng)然是可能的。
上文描述了圖2中所示的圖形處理系統(tǒng)的操作的某些特征。下面將描述根據(jù)本發(fā)明的實(shí)施方式的圖2中所示的圖形處理系統(tǒng)的操作的其它特征。
如從圖3中可以看出的,圖形處理流水線3包括多個(gè)可編程處理或“著色器”階段,即頂點(diǎn)著色器20、外殼著色器21、域著色器23、幾何著色器24和片段著色器27。這些可編程著色器階段執(zhí)行相應(yīng)的著色器程序,所述著色器程序具有一個(gè)或更多個(gè)輸入變量、生成多組輸出變量并且通過應(yīng)用來提供。
為此,應(yīng)用2提供使用諸如GLSL、HLSL、OpenCL等的高級著色器可編程語言來實(shí)現(xiàn)的著色器程序。然后,這些著色器程序通過著色器語言編譯器被轉(zhuǎn)化成二進(jìn)制代碼,用于目標(biāo)圖形處理流水線3。如本領(lǐng)域中已知的,這可以包括創(chuàng)建編譯器內(nèi)部的程序的一個(gè)或更多個(gè)中間表示。(編譯器例如可以是驅(qū)動(dòng)器4的一部分,存在特殊API調(diào)用以使得該編譯器運(yùn)行。因此,編譯器執(zhí)行能夠被看作是響應(yīng)于由應(yīng)用生成的API調(diào)用通過驅(qū)動(dòng)器來完成的繪制調(diào)用準(zhǔn)備的一部分。)
圖4對此進(jìn)行了例示,并且示出通過應(yīng)用2用高級著色器編程語言40向驅(qū)動(dòng)器4提供的著色器程序,然后該驅(qū)動(dòng)器4將著色器程序編譯41成二進(jìn)制代碼42以用于圖形處理流水線3。
如上所述,圖形處理流水線中的每個(gè)著色器是這樣的處理單元,其通過運(yùn)行針對要生成的圖形輸出中的每個(gè)圖形項(xiàng)目的小程序來執(zhí)行圖形處理(“項(xiàng)目”在這方面通常是頂點(diǎn)、片段或像素)。該實(shí)施方式涉及以下情況:要通過著色器執(zhí)行的執(zhí)行線程(在每個(gè)線程對應(yīng)于一個(gè)圖形項(xiàng)目的情況下)已經(jīng)被組織成要以一致步調(diào)、一次一個(gè)指令地運(yùn)行的“一組”或“一束”線程。
下面將特別地參照圖形處理流水線的片段著色器27的操作來描述本發(fā)明的實(shí)施方式。
在片段著色器27中,正在被執(zhí)行的片段著色器程序針對要進(jìn)行處理的每個(gè)采樣位置(或點(diǎn))運(yùn)行一次,針對每個(gè)采樣位置產(chǎn)生一個(gè)執(zhí)行線程。通常地,采樣位置(并且因此其相應(yīng)的執(zhí)行線程)被組織成并且作為多組的多個(gè)采樣位置(并且因此線程)來進(jìn)行處理。在該實(shí)施方式中,采樣位置被組織成2x2“四元組”,并且相應(yīng)地作為包含四個(gè)線程的線程組在片段著色器中進(jìn)行處理,每個(gè)線程對應(yīng)于“四元組”的采樣位置中的一個(gè)。然后,代表給定的采樣位置四元組的該組線程通過片段著色器以一致步調(diào)、一次一個(gè)指令地運(yùn)行。
圖5示出通過片段著色器27執(zhí)行的線程組在片段著色器程序的執(zhí)行期間被合并的本發(fā)明的第一實(shí)施方式。這具有如下效果:不需要針對片段著色器程序的部分來執(zhí)行的線程不會(huì)不必要地占據(jù)執(zhí)行路徑和周期。
如圖5中所示,要進(jìn)行渲染的(每個(gè))基元50(通過針對表示渲染輸出的采樣點(diǎn)52的陣列測試基元50)被柵格化51,以生成與相應(yīng)的2x2采樣位置“四元組”相對應(yīng)的合適的片段。
柵格化器51還進(jìn)行操作以識別針對如下的基元的多對片段,即,針對該基元,并非片段中的全部采樣位置都被基元50覆蓋(并且因此并非片段著色器中的相應(yīng)線程組中的全部線程都將是活動(dòng)的)。
在本實(shí)施方式中,柵格化器識別具有非重疊的被覆蓋采樣位置的多對片段(即,這將產(chǎn)生具有非重疊活動(dòng)線程的線程組(即,活動(dòng)線程將存在于不同的線程組(warp)路徑中)。(然而,如有需要,將能夠識別可以被合并的多組三個(gè)或更多個(gè)片段(線程組(warp))。
如有需要,柵格化器還能被配置為能夠?qū)⒉蓸游恢玫姆峙渲匦掠成涞结槍€程組的線程組路徑(例如,通過將線程組水平地或垂直地相對應(yīng)的2x2四元組進(jìn)行翻轉(zhuǎn)),以便(嘗試)將針對在其初始配置中具有重疊的被覆蓋采樣位置(活動(dòng)線程)(路徑)的片段(線程組)的重疊去除,以允許這種線程組然后(可能地)進(jìn)行合并。
然后,當(dāng)柵格化器向片段著色器發(fā)出片段時(shí),該柵格化器以信號方式向該片段著色器發(fā)出能夠被合并在一起的所識別的片段對(線程組),使得片段著色器能夠識別如下的線程組,即,當(dāng)所述線程組到達(dá)著色器程序執(zhí)行中的線程組合并事件點(diǎn)時(shí),這些線程組已經(jīng)被識別(關(guān)聯(lián))為“合并”候選。
(如果要向片段著色器發(fā)出的片段被柵格化器識別為無法(可能地)與另一片段進(jìn)行合并,則該片段被指示為無法進(jìn)行合并(作為單個(gè)線程組進(jìn)行處理))。
圖5示出與相應(yīng)的采樣位置四元組相對應(yīng)的兩個(gè)示例性“可合并”片段54、55??梢钥闯觯瑢τ趦蓚€(gè)片段(四元組)54、55來說,并非全部的采樣位置都被基于50覆蓋(因此片段是“稀疏的(sparse)”),并且針對所述片段的被覆蓋的采樣位置不重疊。
當(dāng)片段54、55到達(dá)片段著色器27時(shí),創(chuàng)建56相應(yīng)的執(zhí)行線程用于由片段著色器27來執(zhí)行以對片段54、55進(jìn)行處理。如圖5中所示,在片段54的情況下,產(chǎn)生包括三個(gè)活動(dòng)(“真實(shí)的”)線程和一個(gè)非活動(dòng)、“輔助”線程的線程組57。相應(yīng)地,對于片段55來說,產(chǎn)生包含三個(gè)輔助線程和一個(gè)活動(dòng)線程的線程組58。
然后,片段著色階段執(zhí)行針對線程組的片段著色器程序。
首先,執(zhí)行59片段著色器程序的使用線程組57、58的輔助線程的第一部分。片段著色器程序的這一部分執(zhí)行需要對于線程組中的非活動(dòng)(輔助)線程(諸如紋理查看)的結(jié)果的片段著色器程序操作。
然后,在片段著色器程序中存在進(jìn)行操作以使得線程組57、58的活動(dòng)線程被合并到單個(gè)的、組合的線程組61中的合并指令60。
為此,當(dāng)要進(jìn)行合并的一對線程組57、58中的第一線程組到達(dá)著色器程序執(zhí)行中的線程組合并指令時(shí),針對該線程組的著色器程序執(zhí)行被停止直至要與該線程組進(jìn)行合并的另一個(gè)線程組也已經(jīng)到達(dá)著色器程序執(zhí)行中的線程組合并指令。然后,線程組57、58被合并到包含來自線程組57、58中的每一個(gè)線程組的活動(dòng)線程的單個(gè)線程組61中。
線程組57、58通過將來自每個(gè)線程組的活動(dòng)線程映射到合并后的單個(gè)線程組61的相應(yīng)路徑而被合并為包含來自線程組中的每一個(gè)線程組的活動(dòng)線程的單個(gè)線程組61。經(jīng)合并的線程組然后作為具有單個(gè)(活動(dòng))程序計(jì)數(shù)器的一個(gè)共享線程組61來進(jìn)行處理。
緊接著該線程組合并器,片段著色器程序的其余程序步驟針對合并后的線程組61來被執(zhí)行62。片段著色器程序的這一部分執(zhí)行不需要針對線程組的非活動(dòng)(輔助)線程而被執(zhí)行的諸如算術(shù)運(yùn)算的操作。
(如果“不可合并的”線程組到達(dá)著色器程序執(zhí)行中的線程組合并指令,則線程組合并事件指令被忽略(不起作用),并且片段著色器程序簡單地繼續(xù)針對線程組本身來執(zhí)行。)
這針對由柵格化器51發(fā)出的每個(gè)片段來重復(fù)。
圖5示出片段著色器程序的執(zhí)行。為了便于圖5中所示的操作,片段著色器程序讀取并寫入數(shù)據(jù)的寄存器如圖6A和圖6B中所示地進(jìn)行布置,以便于圖5中所示的線程組的合并。圖6A示出在線程組被合并之前的寄存器布置,圖6B示出在線程組被合并之后的寄存器布置。
如圖6A和圖6B中所示,被片段著色器程序使用的寄存器被劃分成兩個(gè)子集,一組70是在物理上由要被合并為單個(gè)線程組的一對線程組中的線程組共享的“公共”寄存器,以及各個(gè)組71、72是對于該對中的每個(gè)線程組來說分別是專屬的并且對于要進(jìn)行合并的該對線程組中的另一個(gè)線程組來說是不可訪問的“私人”寄存器。
在該實(shí)施方式中,使用寄存器指數(shù)截止來將寄存器劃分成“公共”子集和“私人”子集,在該截止之下的全部寄存器是“公共”寄存器,在該截止之上的全部寄存器是“私人”寄存器。該寄存器指數(shù)截止是由編譯器指定的。如有需要,用于將寄存器劃分成“公共”子集和“私人”子集的其它布置還可以或者替代地被使用,諸如具有寄存器的硬編碼劃分,或者指示哪些寄存器進(jìn)入哪個(gè)子集的位圖。
針對線程組的公共寄存器和私人寄存器按照如下的方式來使用和處理。
首先,在著色器程序執(zhí)行中在線程組合并指令60之前,線程組能夠自由地從針對該線程組的私人寄存器讀取和向針對該線程組的私人寄存器寫入該組的全部線程(路徑)(即,針對“真實(shí)的”(活動(dòng))線程和“輔助”(非活動(dòng))線程)。
相應(yīng)地,在著色器程序執(zhí)行中在線程組合并指令之前,線程組僅能夠針對其活動(dòng)線程(針對包含“真實(shí)的”(活動(dòng)線程)的路徑)向針對一組線程組的“公共”寄存器寫入,并且線程組僅能夠針對包含“真實(shí)的”線程(針對線程組的活動(dòng)線程)讀取針對其路徑的公共寄存器。
在線程組已經(jīng)被合并之后(已經(jīng)執(zhí)行了合并指令),針對曾被合并的線程組的“私人”寄存器的內(nèi)容是無效的(并且因此僅針對曾被合并的線程組的公共寄存器被認(rèn)為具有有效值),并且為合并后的單個(gè)線程組分配一組新的私人寄存器(如圖6B中所示)。在該實(shí)施方式中,通過將其中一個(gè)線程組57的私人寄存器71映射到單個(gè)的合并后的線程組61的寄存器空間中來為合并后的單個(gè)線程組分配一組新的私人寄存器,但是如有需要,其它布置也將是可能的。
當(dāng)執(zhí)行針對線程組57、58的片段著色器程序時(shí),在著色器程序執(zhí)行中在合并事件點(diǎn)之前執(zhí)行要求使用非活動(dòng)(“輔助”)線程的任何操作,并且使用針對所述的線程組的私人寄存器。
相應(yīng)地,需要跨越線程組合并事件而保存的來自合并事件點(diǎn)之前的任何數(shù)據(jù)項(xiàng)(即,在合并事件之后要針對合并后的、單個(gè)線程組需要是可用的)(在合并事件之前)被存儲(chǔ)在公共寄存器中。
片段著色器程序操作(代碼)通過對片段著色器程序代碼進(jìn)行編譯的編譯器來進(jìn)行配置,以實(shí)現(xiàn)該目的。當(dāng)編譯器對片段著色器程序進(jìn)行編譯時(shí),該編譯器還包括在該片段著色器程序中的合適的點(diǎn)處的合并指令60。圖7從這方面例示了編譯器的操作。
如圖7中所示,編譯器接收80利用高級源語言的片段著色器程序,并且對該程序進(jìn)行解析81和處理82。然后,編譯器識別使用非活動(dòng)(輔助)線程的程序操作83以及僅要求活動(dòng)線程的程序操作84,并且在編譯后的片段著色器程序中對這些操作合適地進(jìn)行分組(使用非活動(dòng)(輔助)線程的程序操作在僅要求活動(dòng)線程的程序操作之前)。
然后,編譯器在片段著色器程序中在合適的點(diǎn)處(即,在要求使用片段著色器程序中的非活動(dòng)(輔助)線程的全部操作之后并且在僅要求活動(dòng)線程的這些程序操作之前)嵌入85線程組合并指令。
然后,這樣進(jìn)行布置的片段著色器程序被編碼86成合適的二進(jìn)制代碼以用于圖形處理流水線,并且被發(fā)送到圖形處理流水線以用于執(zhí)行。
在該實(shí)施方式中,在片段著色器程序中提供線程組合并事件作為片段著色器程序中的指令或其一部分。然而,其它布置將是可能的,例如借助于片段著色器程序中的指令的修改程序或者對該指令的修改程序,或者通過諸如與片段著色器程序代碼本身分離地指定的截止點(diǎn)這樣的某種其它方式來指示線程組合并事件。
圖8至圖10示出本發(fā)明的第二實(shí)施方式,在該第二實(shí)施方式中,線程組在片段著色器程序執(zhí)行期間被劃分(分離)成多個(gè)單獨(dú)的線程組。
這在諸如樣本頻率著色的圖形處理操作中能夠是有用的,在這些圖形處理操作中,多個(gè)(例如四個(gè))采樣點(diǎn)針對要生成的渲染輸出內(nèi)的每個(gè)采樣位置被處理,但是也存在需要進(jìn)行的每采樣點(diǎn)計(jì)算,針對給定的采樣位置,能夠存在對每個(gè)采樣點(diǎn)需要等同地進(jìn)行的某些計(jì)算。
圖8示意性地示出本發(fā)明的該第二實(shí)施方式中的操作,在該第二實(shí)施方式中,通過片段著色器27執(zhí)行的線程組在片段著色器程序的執(zhí)行期間被劃分(分離)。
如圖8中所示,要進(jìn)行渲染的(每個(gè))基元50(通過針對表示渲染輸出的采樣點(diǎn)52的陣列來測試基元50)被再次柵格化51,以生成與相應(yīng)的2x2采樣位置“四元組”相對應(yīng)的合適的片段53。
然而,如圖8中所示,在這種情況下,渲染輸出的每個(gè)采樣位置具有與其相關(guān)聯(lián)的兩個(gè)采樣點(diǎn)90(通過片段著色器針對其進(jìn)行處理)。
柵格化器識別陣列52的這些采樣位置,以及被基元50覆蓋的針對每個(gè)采樣位置的相應(yīng)的采樣點(diǎn),并且針對包括被覆蓋的采樣點(diǎn)的每個(gè)2x2采樣位置四元組生成片段。
圖8示出與部分被覆蓋的采樣位置四元組相對應(yīng)的示例性片段91。
當(dāng)片段91到達(dá)片段著色器27時(shí),創(chuàng)建56相應(yīng)的執(zhí)行線程以用于由片段著色器27來執(zhí)行以對片段91所代表的采樣位置進(jìn)行處理。如圖8中所示,在片段91的情況下,創(chuàng)建包括對應(yīng)于片段91所代表的采樣位置的三個(gè)活動(dòng)(“真實(shí)的”)線程和一個(gè)非活動(dòng)、“輔助”線程的線程組92。
然后,片段著色階段執(zhí)行針對線程組92的片段著色器程序。
首先,執(zhí)行93片段著色器程序的第一部分,該第一部分執(zhí)行每采樣位置計(jì)算(即,不取決于由采樣位置所代表的渲染輸出區(qū)域內(nèi)的位置(點(diǎn))的計(jì)算)。
然后,在片段著色器程序中存在劃分指令94,該劃分指令94進(jìn)行操作以將線程組92劃分成兩個(gè)單獨(dú)的線程組95、96,每個(gè)線程組代表針對片段91(并且因此線程組92)所代表的采樣位置的一組采樣點(diǎn)。
緊接著該線程組劃分,片段著色器程序的其余程序步驟針對兩個(gè)線程組95、96被執(zhí)行97。片段著色器程序的這一部分執(zhí)行進(jìn)行每采樣點(diǎn)計(jì)算(即,取決于由所考慮的采樣位置所代表的渲染輸出區(qū)域內(nèi)的位置(點(diǎn))的計(jì)算)的操作。
這針對由柵格化器51發(fā)出的每個(gè)片段來重復(fù)。
應(yīng)當(dāng)注意的是,在這方面,雖然圖8中所示的線程組92、95和96包含活動(dòng)線程和非活動(dòng)線程雙方(根據(jù)此,采樣位置和四元組的相應(yīng)的采樣點(diǎn)被基元50覆蓋),但是在該實(shí)施方式中能夠是這樣的情況(并且確實(shí)可以通常的情況):每個(gè)線程組(即,初始的單個(gè)線程組和在線程組劃分事件之后的多個(gè)單獨(dú)的線程組兩者)將全部包含活動(dòng)線程(即,全部的線程組(warp)路徑將始終是活動(dòng)的)。
圖8示出在該實(shí)施方式中片段著色器程序的執(zhí)行。為了便于圖8中所示的操作,片段著色器程序讀取并寫入數(shù)據(jù)的寄存器如圖9A和圖9B中所示地進(jìn)行布置,以便于圖8中所示的線程組的劃分。圖9A示出在線程組被劃分之前的寄存器布置,圖9B示出在線程組已經(jīng)被劃分之后的寄存器布置。
如圖9A和圖9B中所示,被片段著色器程序使用的寄存器再次被劃分成兩個(gè)子集,一組70是在物理上由線程組共享的“公共”寄存器(在線程組被劃分之前和之后都是),以及各個(gè)組71、72是對于該對所劃分的線程組中的每個(gè)線程組來說分別是專屬的并且對于另一個(gè)線程組來說是不可訪問的“私人”寄存器。這些寄存器被分配(保留),以用于由線程組在著色器程序執(zhí)行開始時(shí)使用。
在該實(shí)施方式中,在著色器程序執(zhí)行中在線程組劃分點(diǎn)94之前,初始的“單個(gè)”線程組92將針對線程組的公共寄存器70用于其每采樣位置計(jì)算(并且因此能夠自由地從針對線程組的公共寄存器讀取并且向針對線程組的公共寄存器寫入該組的全部線程(路徑))。
因此,在初始的單個(gè)線程組92已經(jīng)被劃分之后(劃分事件94已經(jīng)執(zhí)行),針對線程組的公共寄存器70作為只讀寄存器進(jìn)行處理(以便保存所計(jì)算的每采樣位置值),并且在線程組劃分事件94之后執(zhí)行的計(jì)算使用針對所討論的線程組95、96的私人寄存器71、72。
片段著色器程序操作(代碼)通過對片段著色器程序代碼進(jìn)行編譯的編譯器來再次進(jìn)行配置,以實(shí)現(xiàn)該目的。當(dāng)編譯器對片段著色器程序進(jìn)行編譯時(shí),該編譯器還包括在該片段著色器程序中的合適的點(diǎn)處的劃分指令94。圖10從這方面例示了編譯器的操作。
如圖10中所示,編譯器接收80利用高級源語言的片段著色器程序,并且對該程序進(jìn)行解析81和處理82。然后,該編譯器確定線程組劃分事件在片段著色器程序執(zhí)行中的某個(gè)點(diǎn)處是否可能,并且如果可能的話,則識別作為“每采樣位置”110的程序操作和作為“每采樣點(diǎn)”(在采樣位置內(nèi))111的程序操作,并且在編譯后的片段著色器程序中對這些操作合適地進(jìn)行分組(作為“每采樣位置”110的程序操作被布置在作為“每采樣點(diǎn)”(在采樣位置內(nèi))111的程序操作之前)。
然后,編譯器在片段著色器程序中在合適的點(diǎn)處嵌入112線程組劃分指令(即,在作為“每采樣位置”110的全部操作之后并且在作為“每采樣點(diǎn)”(在采樣位置內(nèi))111的程序操作之前)。
然后,這樣進(jìn)行布置的片段著色器程序被編碼86成合適的二進(jìn)制代碼87以用于圖形處理流水線,并且被發(fā)送到圖形處理流水線以用于執(zhí)行。
在該實(shí)施方式中,在片段著色器程序中再次提供線程組劃分事件作為片段著色器程序中的指令或其一部分。然而,其它布置將再次是可能的,例如借助于片段著色器程序中的指令的修改程序或者對該指令的修改程序,或者通過諸如與片段著色器程序代碼本身分離地指定的截止點(diǎn)的某種其它方式來指示線程組劃分事件。在適當(dāng)?shù)那闆r下,還將可能將上述兩種實(shí)施方式進(jìn)行組合,即,以具有在其執(zhí)行期間既包括合并點(diǎn)又包括劃分點(diǎn)的片段著色器程序,在這種情況下片段著色器程序要執(zhí)行的操作使其便利。
從上文中可以看出,本發(fā)明在其優(yōu)選實(shí)施方式中至少提供用于執(zhí)行圖形處理系統(tǒng)中的著色器程序的更加有效的機(jī)制。在本發(fā)明的優(yōu)選實(shí)施方式中,通過識別并包括將正在執(zhí)行著色器程序的線程組進(jìn)行合并和/或劃分的時(shí)機(jī)以促進(jìn)著色器程序的更加有效的執(zhí)行,來實(shí)現(xiàn)上述目的。