本發(fā)明涉及計算機技術(shù)領(lǐng)域,特別涉及一種GPU任務(wù)完成狀態(tài)的判斷方法及裝置。
背景技術(shù):
隨著硬件技術(shù)的不斷發(fā)展,GPU(圖像處理器)強大的計算能力受到了越來越多的重視,相應(yīng)的,對圖形處理任務(wù)的讀寫效率要求也越來越高。當(dāng)程序運行的指令運行在CPU(中央處理器)中時,只要上一條指令運行完,通常意義上就可以判定該任務(wù)執(zhí)行完成,然后可以進(jìn)行下面的任務(wù)。但是當(dāng)所要執(zhí)行的指令運行在GPU中時,在某種情況下通常需要明確運行在GPU中的指令或者任務(wù)是否完成,才能進(jìn)行下面的操作。
現(xiàn)有技術(shù)中跨進(jìn)程很難在一個進(jìn)程GPU任務(wù)還未完成時,另一進(jìn)程對該GPU任務(wù)進(jìn)行讀取,其中一種典型的情況,在跨進(jìn)程共享同一個紋理時,一個進(jìn)程在繪制紋理,而另外一個進(jìn)程在讀取該紋理。在CPU上有相應(yīng)的臨界區(qū)、讀寫鎖機制可以解決這種問題;而在GPU上讀取該共享紋理的進(jìn)程必須要等到另一個繪制該紋理的進(jìn)程在GPU上完成繪制操作時,才能成功的讀取到紋理的圖像,否則就不能正確的獲取到該共享紋理的圖像內(nèi)容。
技術(shù)實現(xiàn)要素:
本發(fā)明提供一種GPU任務(wù)完成狀態(tài)的判斷方法及裝置,解決了在GPU上難以跨進(jìn)程讀取另一個未完成GPU任務(wù)中內(nèi)容的技術(shù)問題,達(dá)到了實現(xiàn)跨進(jìn)程共享未完成GPU任務(wù)內(nèi)容的技術(shù)效果;
尤其是解決了GPU任務(wù)中典型情況,在跨進(jìn)程共享同一個紋理時,一個進(jìn)程在繪制紋理,而另外一個進(jìn)程在讀取該紋理的技術(shù)問題。
第一方面,本申請?zhí)峁┮环NGPU任務(wù)完成狀態(tài)的判斷方法,所述判斷方法包括:
在第一進(jìn)程中預(yù)設(shè)事件查詢;所述第一進(jìn)程中運行有所述GPU任務(wù);
在所述GPU任務(wù)后,將所述事件查詢預(yù)設(shè)為完成狀態(tài);
判斷所述事件查詢是否為就緒狀態(tài);
若是,則確定所述GPU任務(wù)已完成。
優(yōu)選的,所述GPU任務(wù)具體為繪制共享紋理;
所述在所述第一進(jìn)程中預(yù)設(shè)事件查詢,之前還包括:
在第一進(jìn)程中預(yù)設(shè)所述共享紋理,并將所述共享紋理設(shè)置為渲染目標(biāo),以進(jìn)行繪制;
所述確定所述GPU任務(wù)已完成,之后還包括:
第二進(jìn)程讀取所述共享紋理。
優(yōu)選的,所述在第一進(jìn)程中預(yù)設(shè)事件查詢,具體為:
通過IDirect3DDevice9接口的CreateQuery方法,在所述第一進(jìn)程中預(yù)設(shè)一個IDirect3DQuery9接口,以預(yù)設(shè)一個事件查詢。
優(yōu)選的,所述在所述GPU任務(wù)指令后,將所述事件查詢預(yù)設(shè)為完成狀態(tài),具體為:
在所述GPU任務(wù)指令后,通過IDirect3DQuery9接口的Issue方法將所述事件查詢設(shè)置成D3DISSUE_END狀態(tài)。
優(yōu)選的,所述判斷所述事件查詢是否為就緒狀態(tài),具體為:
在所述第一進(jìn)程中通過IDirect3DDevice9接口的GetData方法,判斷GetData方法的返回值,若所述返回值為錯誤S_FALSE時,所述第一進(jìn)程通過GetData方法繼續(xù)判斷;若所述返回值為正確S_OK時,所述事件查詢?yōu)榫途w狀態(tài)。
優(yōu)選的,所述在第一進(jìn)程中預(yù)設(shè)一共享紋理,具體包括:
初始化Direct3D11設(shè)備中D3D11_TEXTURE2D_DESC結(jié)構(gòu),通過Direct3D11設(shè)備指針接口ID3D11Device的CreateTexture2D方法預(yù)設(shè)ID3D11Texture2D紋理接口;
獲取共享的紋理指針接口ID3D11Texture2D,通過接口ID3D11Texture2D的QueryInterface方法獲取IDXGIResource接口;
通過獲取到的IDXGIResource接口中的GetSharedHandle方法,獲取句柄值sharedHandle。
優(yōu)選的,所述在所述第一進(jìn)程中預(yù)設(shè)事件查詢,具體包括:
當(dāng)?shù)诙M(jìn)程需要讀取未完成的所述共享紋理時,通過ID3D11Device接口的CreateQuery方法,在所述第一進(jìn)程中預(yù)設(shè)一個ID3D11Query接口,以預(yù)設(shè)一個事件查詢。
優(yōu)選的,所述在所述GPU任務(wù)后,將所述事件查詢預(yù)設(shè)為完成狀態(tài),具體為:
在所述GPU任務(wù)后,通過ID3D11DeviceContext接口的End方法將所述事件查詢設(shè)置成D3DISSUE_END狀態(tài)。
優(yōu)選的,所述判斷所述事件查詢是否為就緒狀態(tài),具體為:
通過ID3D11DeviceContext接口的GetData方法,判斷GetData方法的返回值,以判斷事件查詢是否完成。
第二方面,本申請還提供一種GPU任務(wù)完成狀態(tài)的判斷裝置,所述判斷裝置包括:
查詢預(yù)設(shè)單元,用于在第一進(jìn)程中預(yù)設(shè)事件查詢;
狀態(tài)預(yù)設(shè)單元,用于在所述GPU任務(wù)后,將所述事件查詢預(yù)設(shè)為完成狀態(tài);
狀態(tài)判斷單元,用于判斷所述事件查詢是否為就緒狀態(tài);
狀態(tài)確定單元,用于在所述狀態(tài)判斷單元判斷結(jié)果為是時,則確定所述GPU任務(wù)已完成。
本發(fā)明實施例中提供的一個或多個技術(shù)方案,至少具有如下技術(shù)效果或優(yōu)點:
1、本申請實施例提供的方法及裝置,通過在所述第一進(jìn)程中預(yù)設(shè)事件查詢;在所述GPU任務(wù)后,將所述事件查詢預(yù)設(shè)為完成狀態(tài),使顯卡驅(qū)動接管了查詢的狀態(tài)控制;并通過判斷事件查詢是否為就緒狀態(tài)來判斷GPU任務(wù)是否完成;若否,則所述第一進(jìn)程繼續(xù)判斷;若是,則確定所述GPU任務(wù)已完成,實現(xiàn)跨進(jìn)程共享作業(yè)中的GPU任務(wù)內(nèi)容。
2、本申請實施例提供的方法及裝置,通過在Direct3D9中通過IDirect3DDevice9接口的CreateTexture接口預(yù)設(shè)紋理,設(shè)置句柄值為0來預(yù)設(shè)一個共享紋理,得到返回所述共享紋理的讀寫句柄值e,通過設(shè)置所述共享句柄值來打開第一進(jìn)程中預(yù)設(shè)的共享紋理,實現(xiàn)了跨進(jìn)程紋理的讀寫。
3、本申請實施例提供的方法及裝置,第二進(jìn)程需要讀取未完成的所述共享紋理時,在所述第一進(jìn)程中預(yù)設(shè)事件查詢,使顯卡驅(qū)動接管了查詢的狀態(tài)控制;通過判斷到所述事件查詢是否就緒狀態(tài),來確定待讀取的共享紋理部分是否已完成,若完成則第二進(jìn)程可以讀取第一進(jìn)程中待讀取的共享紋理部分,實現(xiàn)了在GPU上讀取該共享紋理的進(jìn)程不必等到另一個繪制該紋理的進(jìn)程在GPU上完成繪制操作就可以正確讀取到紋理的圖像內(nèi)容。
上述說明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說明書的內(nèi)容予以實施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點能夠更明顯易懂,以下特舉本發(fā)明的具體實施方式。
附圖說明
為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作一簡單地介紹,顯而易見地,下面描述中的附圖是本發(fā)明的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為本發(fā)明實施例中GPU任務(wù)完成狀態(tài)的判斷方法的流程圖;
圖2為本發(fā)明實施例中GPU任務(wù)完成狀態(tài)的判斷裝置的結(jié)構(gòu)示意圖。
具體實施方式
本申請實施例通過提供一種GPU任務(wù)完成狀態(tài)的判斷方法及裝置,解決了在GPU上難以跨進(jìn)程讀取另一個未完成GPU任務(wù)中內(nèi)容的技術(shù)問題,達(dá)到了實現(xiàn)跨進(jìn)程共享未完成GPU任務(wù)內(nèi)容的技術(shù)效果;尤其是解決了GPU任務(wù)中典型情況,在跨進(jìn)程共享同一個紋理時,一個進(jìn)程在繪制紋理,而另外一個進(jìn)程在讀取該紋理的技術(shù)問題。
本申請實施例中的技術(shù)方案,總體思路如下:
當(dāng)需要判斷第一進(jìn)程中GPU任務(wù)完成狀態(tài)時,在所述第一進(jìn)程中預(yù)設(shè)事件查詢,所述第一進(jìn)程中運行有所述GPU任務(wù);在所述GPU任務(wù)后,將所述事件查詢預(yù)設(shè)為完成狀態(tài)判斷所述事件查詢是否為就緒狀態(tài),則所述第一進(jìn)程繼續(xù)判斷;若判斷到所述事件查詢?yōu)榫途w狀態(tài),若是,則確定所述GPU任務(wù)已完成。
上述方法通過在第一進(jìn)程中預(yù)設(shè)事件查詢,并在目標(biāo)任務(wù)指令后插入將所述事件查詢預(yù)設(shè)為完成狀態(tài),使得用戶可以根據(jù)自身需要選擇待讀取的部分任務(wù)作為目標(biāo)任務(wù),保證了GPU同步過程,即即使所述第一進(jìn)程中的總體任務(wù)還未完成,也能同步讀取目標(biāo)任務(wù)。
為使本發(fā)明實施例的目的、技術(shù)方案和優(yōu)點更加清楚,下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實施例是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有作出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護(hù)的范圍。
實施例一
本申請?zhí)峁┮环NGPU任務(wù)完成狀態(tài)的判斷方法,請參閱圖1,所述判斷方法包括:
步驟S110,在第一進(jìn)程中預(yù)設(shè)事件查詢;所述第一進(jìn)程中運行有所述GPU任務(wù)。
步驟S120,在所述GPU任務(wù)后,將所述事件查詢預(yù)設(shè)為完成狀態(tài)。
步驟S130,判斷所述事件查詢是否為就緒狀態(tài)。
步驟S140,若是,則確定所述GPU任務(wù)已完成。
需要說明的是本方法適用于所有Windows系統(tǒng),特別是Windows Vista系統(tǒng)及之后的版本??梢詾樵赪indows Vista、Windows 7、Windows 8及Windows 10的版本中。
下面結(jié)合圖1,對本申請?zhí)峁┑腉PU任務(wù)完成狀態(tài)的判斷方法進(jìn)行詳細(xì)介紹:
其中,所述GPU任務(wù)具體為繪制共享紋理,所述在所述第一進(jìn)程中預(yù)設(shè)事件查詢,之前還包括:
步驟S109,在第一進(jìn)程中預(yù)設(shè)所述共享紋理,并將所述共享紋理設(shè)置為渲染目標(biāo),以進(jìn)行繪制;
所述確定所述GPU任務(wù)已完成,之后還包括:
步驟S150,第二進(jìn)程讀取所述共享紋理。
本申請?zhí)峁┑呐袛喾椒梢詰?yīng)用于Direct3D9,也應(yīng)用于Direct3D11。
例一
本申請?zhí)峁┑呐袛喾椒☉?yīng)用在Direct3D9中,因此,所述判斷方法的具體實施方式是基于Direct3D11中的接口或方法。本申請?zhí)峁┑腉PU任務(wù)完成狀態(tài)的判斷方法,詳細(xì)如下:
首先,執(zhí)行步驟S110,在第一進(jìn)程中預(yù)設(shè)事件查詢;所述第一進(jìn)程中運行有所述GPU任務(wù)。
在本申請實例中,所述在第一進(jìn)程中預(yù)設(shè)事件查詢;所述第一進(jìn)程中運行有所述GPU任務(wù),具體包括:
通過IDirect3DDevice9接口的CreateQuery方法,在所述第一進(jìn)程中預(yù)設(shè)一個IDirect3DQuery9接口,以預(yù)設(shè)一個事件查詢Query。
需要說明的是,通過步驟S110預(yù)設(shè)的事件查詢Query包括3種狀態(tài):
(1)就緒狀態(tài)(Signaled State):像是一個空閑的狀態(tài)。查詢對象已經(jīng)生成,判斷應(yīng)用程序來完成此次查詢。當(dāng)查詢結(jié)束,查詢狀態(tài)轉(zhuǎn)變?yōu)榫途w狀態(tài)時,就可以獲取到查詢結(jié)果了。
(2)預(yù)設(shè)狀態(tài)(Building State):像是一個暫存區(qū)域。在預(yù)設(shè)狀態(tài),查詢已經(jīng)被發(fā)起(通過調(diào)用D3DISSUE_BEGIN),但還沒有轉(zhuǎn)換到完成狀態(tài)。當(dāng)應(yīng)用程序申明查詢結(jié)束(通過調(diào)用D3DISSUE_END),查詢便轉(zhuǎn)換到了完成狀態(tài)。
(3)完成狀態(tài)(Issued State):表示被查詢的資源已經(jīng)接管了查詢。當(dāng)資源完成工作后,會將狀態(tài)機轉(zhuǎn)換到就緒狀態(tài)。在完成階段,應(yīng)用程序必須判斷是否已經(jīng)轉(zhuǎn)變成就緒狀態(tài),如果是就緒狀態(tài),那么GetData返回的就是需要的查詢結(jié)果了。
接下來執(zhí)行步驟S120,在所述GPU任務(wù)后,將所述事件查詢預(yù)設(shè)為完成狀態(tài)。
在本申請實例中,所述在所述GPU任務(wù)后,將所述事件查詢預(yù)設(shè)為完成狀態(tài),具體為:
在所述GPU任務(wù)后,通過IDirect3DQuery9接口的Issue方法將所述事件查詢設(shè)置成D3DISSUE_END狀態(tài)。
通過執(zhí)行將所述事件查詢Query設(shè)置成D3DISSUE_END狀態(tài),以使顯卡驅(qū)動變成接管查詢的狀態(tài)控制。
再下來執(zhí)行步驟S130,判斷所述事件查詢是否為就緒狀態(tài)。
在步驟S120中在所述GPU任務(wù)后,將所述事件查詢預(yù)設(shè)為完成狀態(tài),之后所述第一進(jìn)程需要判斷查詢事件是否完成,若完成,那么GPU任務(wù)的操作也完成了,那么第二進(jìn)程此時可以正確讀取到所述第一進(jìn)程中共享的GPU任務(wù)的內(nèi)容。
由于步驟S120中通過IDirect3DQuery9接口的Issue方法將所述事件查詢設(shè)置成D3DISSUE_END狀態(tài)后顯卡驅(qū)動接管了查詢的狀態(tài)控制,當(dāng)GPU任務(wù)完成后,所述顯卡驅(qū)動將所述查詢事件的狀態(tài)轉(zhuǎn)換成就緒狀態(tài),所以只需通過判斷事件查詢的狀態(tài)是否為就緒狀態(tài)來判斷GPU任務(wù)是否完成。
在本申請實例中,若未判斷到所述事件查詢?yōu)榫途w狀態(tài),則所述第一進(jìn)程繼續(xù)判斷,具體包括:
在所述第一進(jìn)程中通過IDirect3DDevice9接口的GetData方法,判斷GetData方法的返回值為錯誤S_FALSE時,所述第一進(jìn)程通過GetData方法繼續(xù)判斷。
最后執(zhí)行步驟S140,若是,則確定所述GPU任務(wù)已完成。
在本申請實例中,所述若是,則確定所述GPU任務(wù)已完成,具體包括:
在所述第一進(jìn)程中通過IDirect3DDevice9接口的GetData方法,判斷GetData方法的返回值為正確S_OK時,則確定目標(biāo)任務(wù)已經(jīng)完成,所述第一進(jìn)程退出判斷。
上述本申請還提供的一種GPU任務(wù)完成狀態(tài)的判斷方法,所述GPU任務(wù)完成狀態(tài)的判斷方法解決了在GPU上難以跨進(jìn)程讀取另一個未完成GPU任務(wù)中內(nèi)容的技術(shù)問題。
當(dāng)所述GPU任務(wù)具體為繪制共享紋理時,再執(zhí)行步驟S110之前先執(zhí)行步驟S109,在第一進(jìn)程中預(yù)設(shè)所述共享紋理,并將所述共享紋理設(shè)置為渲染目標(biāo),以進(jìn)行繪制;在執(zhí)行步驟S140之后,執(zhí)行步驟S150,第二進(jìn)程讀取所述共享紋理。
所述步驟S109,在第一進(jìn)程中預(yù)設(shè)所述共享紋理,并將所述共享紋理設(shè)置為渲染目標(biāo),以進(jìn)行繪制,具體包括:
在第一進(jìn)程中,在Direct3D9中通過IDirect3DDevice9接口的CreateTexture接口預(yù)設(shè)一個共享紋理;通過IDirect3DDevice9接口的SetRenderTarget方法,將所述共享紋理設(shè)置成一個渲染目標(biāo)。
在所述共享紋理上繪制可以為IDirect3DDevice9接口中相關(guān)的繪制方法繪制,可以是通過SetRenderTarget方法在所述共享紋理上繪制內(nèi)容。
在第一進(jìn)程中,在Direct3D9中通過IDirect3DDevice9接口的CreateTexture接口預(yù)設(shè)一個共享紋理,具體可以通過設(shè)置句柄(HANDLE)指針,當(dāng)設(shè)置的句柄為0時,來實現(xiàn)預(yù)設(shè)的紋理為可共享的紋理;當(dāng)設(shè)置的句柄不為0,則表示打開一個共享紋理。
在跨進(jìn)程操作共享紋理時,通過在第一進(jìn)程中設(shè)置句柄值為0來預(yù)設(shè)一個共享紋理,得到返回所述共享紋理的讀寫句柄值sharedHandle,其他進(jìn)程可以通過設(shè)置所述共享句柄值sharedHandle來打開第一進(jìn)程中預(yù)設(shè)的共享紋理,實現(xiàn)了跨進(jìn)程紋理的讀寫,即實現(xiàn)了第二進(jìn)程可共享第一進(jìn)程的共享紋理的內(nèi)容。但是當(dāng)?shù)谝贿M(jìn)程中在繪制紋理時仍然不能正確獲取所述共享紋理的圖像內(nèi)容,下面將進(jìn)一步講解如何解決該問題。
所述步驟S150,第二進(jìn)程讀取所述共享紋理,具體包括:
所述第二進(jìn)程通過設(shè)置所述共享句柄值sharedHandle來打開第一進(jìn)程中預(yù)設(shè)的共享紋理,并讀取所述共享紋理,將所述第一進(jìn)程中的共享紋理顯示在所述第二進(jìn)程的窗口上。
在確定所述共享紋理繪制已完成后,所述第二進(jìn)程可以讀取所述第一進(jìn)程中的共享紋理,采用本申請的讀寫方法后即使在某時刻第一進(jìn)程還沒有完成對共享紋理的繪制,第二進(jìn)程仍然可以同步讀取所述共享紋理的內(nèi)容。
在本實施例中,所述讀取所述共享紋理具體是通過IDirect3DDevice9的SetTexture方法,從而實現(xiàn)讀取所述共享紋理。
例二
本申請?zhí)峁┑呐袛喾椒☉?yīng)用于在Direct3D11中,本申請?zhí)峁┑呐袛喾椒ǖ木唧w實施方式是基于Direct3D11中的接口或方法。本申請?zhí)峁┑腉PU任務(wù)完成狀態(tài)的判斷方法,詳細(xì)如下:
首先,執(zhí)行步驟S110,在第一進(jìn)程中預(yù)設(shè)事件查詢;所述第一進(jìn)程中運行有所述GPU任務(wù)。
在本申請實例中,所述在第一進(jìn)程中預(yù)設(shè)事件查詢;所述第一進(jìn)程中運行有所述GPU任務(wù),具體包括:
通過ID3D11Device接口的CreateQuery方法,在所述第一進(jìn)程中預(yù)設(shè)一個ID3D11Query接口,以預(yù)設(shè)一個事件查詢。
具體的,在第一進(jìn)程中通過ID3D11Device接口的CreateQuery方法將查詢的類型設(shè)置為D3D11_QUERY_EVENT來預(yù)設(shè)一個ID3D11Query接口,以預(yù)設(shè)一個事件查詢。
需要說明的是,通過步驟S110預(yù)設(shè)的事件查詢Query包括3種狀態(tài):
(1)就緒狀態(tài)(Signaled State):像是一個空閑的狀態(tài)。查詢對象已經(jīng)生成,判斷應(yīng)用程序來完成此次查詢。當(dāng)查詢結(jié)束,查詢狀態(tài)轉(zhuǎn)變?yōu)榫途w狀態(tài)時,就可以獲取到查詢結(jié)果了。
(2)預(yù)設(shè)狀態(tài)(Building State):像是一個暫存區(qū)域。在預(yù)設(shè)狀態(tài),查詢已經(jīng)被發(fā)起(通過調(diào)用D3DISSUE_BEGIN),但還沒有轉(zhuǎn)換到完成狀態(tài)。當(dāng)應(yīng)用程序申明查詢結(jié)束(通過調(diào)用D3DISSUE_END),查詢便轉(zhuǎn)換到了完成狀態(tài)。
(3)完成狀態(tài)(Issued State):表示被查詢的資源已經(jīng)接管了查詢。當(dāng)資源完成工作后,會將狀態(tài)機轉(zhuǎn)換到就緒狀態(tài)。在完成階段,應(yīng)用程序必須判斷是否已經(jīng)轉(zhuǎn)變成就緒狀態(tài),如果是就緒狀態(tài),那么GetData返回的就是需要的查詢結(jié)果了。
接下來執(zhí)行步驟S120,在所述GPU任務(wù)后,將所述事件查詢預(yù)設(shè)為完成狀態(tài)。
在本申請實例中,所述在所述GPU任務(wù)后,將所述事件查詢預(yù)設(shè)為完成狀態(tài),具體為:
在所述GPU任務(wù)后,通過ID3D11DeviceContext接口的End方法將所述事件查詢設(shè)置成D3DISSUE_END狀態(tài)。通過將事件查詢預(yù)設(shè)為完成狀態(tài)以使顯卡驅(qū)動變成接管查詢的狀態(tài)控制。
再下來執(zhí)行步驟S130,判斷所述事件查詢是否為就緒狀態(tài)。
在步驟S120中在所述GPU任務(wù)后,將所述事件查詢預(yù)設(shè)為完成狀態(tài),之后所述第一進(jìn)程需要判斷查詢事件是否完成,若完成,那么GPU任務(wù)的操作也完成了,那么第二進(jìn)程此時可以正確讀取到所述第一進(jìn)程中共享的GPU任務(wù)的內(nèi)容。
由于步驟S120中通過ID3D11DeviceContext接口的End方法將所述事件查詢設(shè)置成D3DISSUE_END狀態(tài)。通過將事件查詢預(yù)設(shè)為完成狀態(tài)以使顯卡驅(qū)動變成接管查詢的狀態(tài)控制,當(dāng)GPU任務(wù)完成后,所述顯卡驅(qū)動將所述查詢事件的狀態(tài)轉(zhuǎn)換成就緒狀態(tài),所以只需通過判斷事件查詢的狀態(tài)是否為就緒狀態(tài)來判斷GPU任務(wù)是否完成。
在本申請實例中,判斷所述事件查詢是否為就緒狀態(tài),具體包括:
通過ID3D11DeviceContext接口的GetData方法,判斷GetData方法的返回值,以判斷事件查詢是否完成。
當(dāng)GetData方法的返回值為S_FALSE,表示該查詢事件還沒有完成GPU任務(wù)還處于繪制過程中,第一進(jìn)程仍需繼續(xù)等待并再次調(diào)用GetData方法;如果GetData方法的返回值為S_OK,表示該查詢事件完成并且GPU任務(wù)的繪制操作也已經(jīng)完成,第一進(jìn)程則可以退出等待,第二進(jìn)程可以讀取到GPU任務(wù)的內(nèi)容。
最后執(zhí)行步驟S140,若是,則確定所述GPU任務(wù)已完成。
在本申請實例中,所述若是,則確定所述GPU任務(wù)已完成,具體包括:
當(dāng)ID3D11DeviceContext接口的GetData方法的返回值為S_OK,表示該查詢事件完成并且GPU任務(wù)的繪制操作也已經(jīng)完成,則確定所述GPU任務(wù)已完成。
上述本申請還提供的一種GPU任務(wù)完成狀態(tài)的判斷方法,所述GPU任務(wù)完成狀態(tài)的判斷方法解決了在GPU上難以跨進(jìn)程讀取另一個未完成GPU任務(wù)中內(nèi)容的技術(shù)問題。
當(dāng)所述GPU任務(wù)具體為繪制共享紋理時,再執(zhí)行步驟S110之前先執(zhí)行步驟S109,在第一進(jìn)程中預(yù)設(shè)所述共享紋理,并將所述共享紋理設(shè)置為渲染目標(biāo),以進(jìn)行繪制;在執(zhí)行步驟S140之后,執(zhí)行步驟S150,第二進(jìn)程讀取所述共享紋理。
所述步驟S109,在第一進(jìn)程中預(yù)設(shè)所述共享紋理,并將所述共享紋理設(shè)置為渲染目標(biāo),以進(jìn)行繪制,具體包括:
當(dāng)需要紋理讀寫同步時,初始化Direct3D11設(shè)備中D3D11_TEXTURE2D_DESC結(jié)構(gòu),通過Direct3D11設(shè)備指針接口ID3D11Device的CreateTexture2D方法預(yù)設(shè)ID3D11Texture2D紋理接口;
獲取共享的紋理指針接口ID3D11Texture2D,通過接口ID3D11Texture2D的QueryInterface方法獲取IDXGIResource接口;
通過ID3D11DeviceContext接口的OMSetRenderTargets方法,將所述共享紋理設(shè)置成一個渲染目標(biāo),然后利用相關(guān)的繪制方法,在所述共享紋理上繪制圖像;
通過ID3D11DeviceContext接口的OMSetRenderTargets方法,將所述共享紋理設(shè)置成一個渲染目標(biāo),然后利用相關(guān)的繪制方法,在所述共享紋理上繪制圖像。第一進(jìn)程可以通過OMSetRenderTargets方法在所述共享紋理上繪制內(nèi)容。
通過獲取到的IDXGIResource接口中的GetSharedHandle方法,獲取句柄值sharedHandle,這樣在第一進(jìn)程中獲得一個共享的Direct3D11紋理。在其他進(jìn)程中可以通過設(shè)置句柄值sharedHandle來打開所述共享紋理。
其中,初始化Direct3D11設(shè)備中D3D11_TEXTURE2D_DESC結(jié)構(gòu),具體為按預(yù)設(shè)值設(shè)置D3D11_TEXTURE2D_DESC結(jié)構(gòu)中的相關(guān)屬性,并將D3D11_RESOURCE_MISC_SHARED值賦值給該結(jié)構(gòu)的MiscFlags屬性。
所述步驟S150,第二進(jìn)程讀取所述共享紋理,具體包括:
步驟S151,將所述句柄值sharedHandle設(shè)置為不為0,以打開所述第一進(jìn)程中的所述共享紋理。
所述步驟S151,將所述句柄值sharedHandle設(shè)置為不為0,以打開所述第一進(jìn)程中的所述共享紋理,具體為:
通過ID3D11Device接口的OpenSharedHandle方法,和句柄值sharedHandle,獲取一個ID3D11Texture2D接口,以在第二進(jìn)程上共享到第一進(jìn)程中的所述共享紋理。
步驟S152,讀取所述共享紋理。所述讀取所述共享紋理,具體包括:
通過ID3D11DeviceContext接口的PSSetShaderResource方法,從而實現(xiàn)讀取該共享紋理的功能。由于此時第一進(jìn)程中所述共享紋理已經(jīng)確定完成繪制,所以所述第二進(jìn)程可以準(zhǔn)確讀取所述共享紋理的內(nèi)容。
實施例二
基于同樣的發(fā)明構(gòu)思,本申請還提供一種GPU任務(wù)完成狀態(tài)的判斷裝置,請參閱圖2,所述判斷裝置包括:
查詢預(yù)設(shè)單元210,用于在第一進(jìn)程中預(yù)設(shè)事件查詢;
狀態(tài)預(yù)設(shè)單元220,用于在所述GPU任務(wù)后,將所述事件查詢預(yù)設(shè)為完成狀態(tài);
狀態(tài)判斷單元230,用于判斷所述事件查詢是否為就緒狀態(tài);
狀態(tài)確定單元240,用于在所述狀態(tài)判斷單元判斷結(jié)果為是時,則確定所述GPU任務(wù)已完成。
本申請?zhí)峁┑呐袛嘌b置可以應(yīng)用于Direct3D9,也應(yīng)用于Direct3D11。
本實施例二所介紹的判斷裝置為本申請實施例一一種GPU任務(wù)完成狀態(tài)的判斷方法所采用的裝置,故而基于本發(fā)明實施例一所介紹的方法,本領(lǐng)域所屬人員能夠了解該裝置的具體結(jié)構(gòu)及變形,故而在此不再贅述。凡是本發(fā)明實施例一的方法所采用的裝置都屬于本發(fā)明所欲保護(hù)的范圍。
本申請實施例中提供的技術(shù)方案,至少具有如下技術(shù)效果或優(yōu)點:
1、本申請實施例提供的方法及裝置,通過在所述第一進(jìn)程中預(yù)設(shè)事件查詢;在所述GPU任務(wù)后,將所述事件查詢預(yù)設(shè)為完成狀態(tài),使顯卡驅(qū)動接管了查詢的狀態(tài)控制;并通過判斷事件查詢是否為就緒狀態(tài)來判斷GPU任務(wù)是否完成;若否,則所述第一進(jìn)程繼續(xù)判斷;若是,則確定所述GPU任務(wù)已完成,實現(xiàn)跨進(jìn)程共享未完成的GPU任務(wù)內(nèi)容。
2、本申請實施例提供的方法及裝置,通過在Direct3D9中通過IDirect3DDevice9接口的CreateTexture接口預(yù)設(shè)紋理,設(shè)置句柄值為0來預(yù)設(shè)一個共享紋理,得到返回所述共享紋理的讀寫句柄值e,通過設(shè)置所述共享句柄值來打開第一進(jìn)程中預(yù)設(shè)的共享紋理,實現(xiàn)了跨進(jìn)程紋理的讀寫。
3、本申請實施例提供的方法及裝置,第二進(jìn)程需要讀取繪制中的所述共享紋理時,在所述第一進(jìn)程中預(yù)設(shè)事件查詢,使顯卡驅(qū)動接管了查詢的狀態(tài)控制;通過判斷到所述事件查詢是否就緒狀態(tài),來確定待讀取的共享紋理部分是否已完成,若完成則第二進(jìn)程可以讀取第一進(jìn)程中待讀取的共享紋理部分,實現(xiàn)了在GPU上讀取該共享紋理的進(jìn)程不必等到另一個繪制該紋理的進(jìn)程在GPU上完成繪制操作就可以正確讀取到紋理的圖像內(nèi)容。
本領(lǐng)域內(nèi)的技術(shù)人員應(yīng)明白,本發(fā)明的實施例可提供為方法、系統(tǒng)、或計算機程序產(chǎn)品。因此,本發(fā)明可采用完全硬件實施例、完全軟件實施例、或結(jié)合軟件和硬件方面的實施例的形式。而且,本發(fā)明可采用在一個或多個其中包含有計算機可用程序代碼的計算機可用存儲介質(zhì)(包括但不限于磁盤存儲器、CD-ROM、光學(xué)存儲器等)上實施的計算機程序產(chǎn)品的形式。
本發(fā)明是參照根據(jù)本發(fā)明實施例的方法、設(shè)備(系統(tǒng))、和計算機程序產(chǎn)品的流程圖和/或方框圖來描述的。應(yīng)理解可由計算機程序指令實現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合。可提供這些計算機程序指令到通用計算機、專用計算機、嵌入式處理機或其他可編程數(shù)據(jù)處理設(shè)備的處理器以產(chǎn)生一個機器,使得通過計算機或其他可編程數(shù)據(jù)處理設(shè)備的處理器執(zhí)行的指令產(chǎn)生用于實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的裝置。
這些計算機程序指令也可存儲在能引導(dǎo)計算機或其他可編程數(shù)據(jù)處理設(shè)備以特定方式工作的計算機可讀存儲器中,使得存儲在該計算機可讀存儲器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能。
這些計算機程序指令也可裝載到計算機或其他可編程數(shù)據(jù)處理設(shè)備上,使得在計算機或其他可編程設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計算機實現(xiàn)的處理,從而在計算機或其他可編程設(shè)備上執(zhí)行的指令提供用于實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的步驟。
盡管已描述了本發(fā)明的優(yōu)選實施例,但本領(lǐng)域內(nèi)的技術(shù)人員一旦得知了基本創(chuàng)造性概念,則可對這些實施例作出另外的變更和修改。所以,所附權(quán)利要求意欲解釋為包括優(yōu)選實施例以及落入本發(fā)明范圍的所有變更和修改。
顯然,本領(lǐng)域的技術(shù)人員可以對本發(fā)明實施例進(jìn)行各種改動和變型而不脫離本發(fā)明實施例的精神和范圍。這樣,倘若本發(fā)明實施例的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動和變型在內(nèi)。