2019年9月23日 星期一

在 Direct3D12 替換掉 IID_PPV_ARGS()

在 Direct3D12 替換掉 IID_PPV_ARGS()

前言

  在 [ Github ]微軟的 Direct3D12 範例 裡,常常會在製造資源的相關 Function 中看到這個 Macro( IID_PPV_ARGS()  ),如果追蹤這個 Macro 會發現裡面會用到擴充語法 __uuidof ,由於個人不喜歡用擴充語法,所以就想找替代 IID_PPV_ARGS() 的方法,在此把學習的過程做個紀錄。

內容

  在追蹤這個 Macro 後會發現內容如下
#define IID_PPV_ARGS(ppType) __uuidof(**(ppType)), IID_PPV_ARGS_Helper(ppType)

先來看看使用 Macro 的範例,以 D3D12CreateDevice() 為例,如下
ComPtr<IDXGIAdapter1> hardwareAdapter;
ComPtr<ID3D12Device> m_device;
D3D12CreateDevice(hardwareAdapter.Get(),D3D_FEATURE_LEVEL_11_0,IID_PPV_ARGS(&m_device);

再搭配 [ MSDN ] D3D12CreateDevice() 來看,會發現這個 Macro 其實就是說入兩個變數,一個是 RFEIID 與一個 void** 的指標, void**指標的部分很簡單,其實就是強制轉型而已,但 REFIID 的部分就比較麻煩,因為使用到擴充語法  __uuidof ,可以在 [ MSDN ] __uuidof 取得更多的資料。

  REFIID 在追蹤後發現 Direcct3D12 會為一些 COM 定義專屬的ID,ID3D12Device 對應的ID就是 IID_ID3D12Device,這個ID會定義在 d3d12.h 裡,所以範例的程式碼可以換成以下
IDXGIAdapter1* pHardwareAdapter;
ID3D12Device* m_pDevice;
D3D12CreateDevice(pHardwareAdapter,D3D_FEATURE_LEVEL_11_0,IID_ID3D12Device,(void**)&m_pDevice);

使用這個交換要注意要多 Link 一個 dxguid.lib,這樣就可以迴避使用擴充語法。

參考資料

[ Github ]微軟的 Direct3D12 範例
[ MSDN ] __uuidof
[ MSDN ] D3D12CreateDevice()

沒有留言:

張貼留言