![](/img/trans.png)
[英]How do I use a Direct3D 11 pointer wrapped in ComPtr to get a 11.1 interface?
[英]How do I use the Direct3D Device Manager?
我想在Direct3D應用程序中的多個線程和對象之間共享一個Direct3D設備。 我遇到了Direct3D設備管理器,它看起來像我想要的,雖然我沒有做任何視頻處理或視頻加速: http : //msdn.microsoft.com/en-us/library/windows/desktop/aa965267( v = vs.85)的.aspx
在我的代碼中,我正在做以下事情:
// Create the device manager
UINT resetToken = 0;
IDirect3DDeviceManager9* deviceManager = NULL;
if (FAILED(DXVA2CreateDirect3DDeviceManager9(&resetToken, &deviceManager)))
return false;
// Add the device to the device manager
if (FAILED(deviceManager->ResetDevice(device, resetToken)))
return false;
deviceManager->AddRef();
我的問題是,一旦我創建了Direct3D設備管理器,如何在不傳遞指向設備管理器的指針的情況下與其他對象共享direct3d設備管理器? 微軟已經明確表示會做以下事情,但我不知道以下內容的真正含義:
設備所有者必須為其他對象提供一種獲取指向IDirect3DDeviceManager9接口的指針的方法。 標准機制是實現IMFGetService接口。 服務GUID是MR_VIDEO_ACCELERATION_SERVICE。
有人可以告訴我如何使用IMFGetService接口共享設備管理器嗎?
如果您沒有進行任何視頻處理,那么我認為實現和/或使用IDirect3DDeviceManager9
接口沒有意義。
只需實現自己管理Direct3D設備生命周期的方法,使接口指針可用於對象/線程並進行同步。 Direct3D設備不是任何只能通過IDirect3DDeviceManager9
在對象/線程之間共享的神奇東西。 它就像任何其他資源一樣。 如果你正確地初始化它,你甚至可以從不同的線程同時調用某些方法(即幾乎所有不依賴於可能被另一個線程更改的設備狀態的方法)。
使接口指針可用就像擁有一個保存指針的單例一樣簡單。 或者,如果您的對象/線程已經以某種方式進行協作,那么它們必須已經有一些交換信息的方法。 所以我想你應該能夠擴展已有的東西,讓對象/線程訪問Direct3D設備。 通過使用CRITICAL_SECTION
可以輕松完成同步。
如果你真的想使用IDirect3DDeviceManager9
,那么 - 據我所知 - 你必須在你想要訪問IDirect3DDeviceManager9
所有對象上實現IMFGetService
接口。 實現GetService
函數,以便在詢問MR_VIDEO_ACCELERATION_SERVICE
/ IDirect3DDeviceManager9
它返回一個指向管理Direct3D設備的對象的接口指針。
編輯:關於代碼示例:我希望這里給出的解釋是足夠的。 在多個線程之間共享內容是我不敢嘗試使用簡短的代碼示例來解釋的。 如果您知道如何編寫多線程應用程序,那么使用Direct3D設備與使用其他資源的方式沒有什么不同。 如果您不知道如何編寫多線程應用程序,那么對於單個stackoverflow答案,該主題目前太復雜了。
關於為什么MS建議使用IDirect3DDeviceManager9
......好吧,我不知道這樣的一般建議。 這只是在進行視頻處理時使用(使用DXVA,EVR等)。 或者更像是強制性的; 我不確定您是否可以在不使用D3D設備管理器的情況下與增強型視頻渲染器共享D3D設備。 畢竟D3D設備管理器就是這樣做的。 使用VMR9與渲染器共享設備只能通過兩種方式實現:
記錄的方式:只能從VMR9的“當前”回調訪問設備。 這是相當有限的 - 例如,您僅限於視頻的幀速率。
未記錄的方式:不要調用IVMRFilterConfig9::SetNumberOfStreams
,只連接一個輸入流。 這樣VMR9就不會切換到“混音模式”,而當不處於“混音模式”時,VMR9不會改變任何設備狀態。 因此,如果D3D設備初始化為多線程,則可以在VMR9使用相同設備時自由使用D3D設備。
同樣使用VMR9,根本無法在另一個DirectShow過濾器中使用D3D設備。 D3D設備管理器對此進行了改進,為過濾器和您自己的應用程序代碼提供了使用D3D設備的能力 - 包括更改狀態。 但是,如果您自己實現了將使用D3D設備的每個組件,那么使用D3D設備管理器並沒有任何意義。 即使您使用的是需要D3D設備的第三方組件,如果這些組件支持D3D設備管理器,您也只能使用它。 除非這些組件恰好是DirectShow或MediaFoundation過濾器/組件,否則可能不會出現這種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.