2016-11-04 19 views
0

Я хотел бы вызвать метод IDXGIDevice1 :: SetMaximumFrameLatency из моего dx12app, для этого мне нужно получить действительный IDXGIDevice1 с текущего устройства Direct3D 12. запрашивая интерфейс возвращает E_NOINTERFACE:не может приобрести IDXGIDevice или IDXGIDevice1 из ID3D12Device в dx12

IDXGIDevice * pDXGIDevice; 
HRESULT hr = myDevice->QueryInterface(__uuidof(IDXGIDevice), (void **)&pDXGIDevice); 
assert(hr != S_OK); // returns E_NOINTERFACE 

IDXGIDevice1 * pDXGIDevice1; 
HRESULT hr1 = myDevice->QueryInterface(__uuidof(IDXGIDevice1), (void **)&pDXGIDevice1); 
assert(hr != S_OK); // returns E_NOINTERFACE 

Не уверен, что если я что-то отсутствует или есть последовательность DXGI логики мне нужно реализовать, чтобы получить правильный интерфейс IDXGIDevice1.

Поблагодарили бы любые подсказки & заранее! Klip

ответ

1

для Direct3D 12, это «наследство картины» из получения DXGI завод не поддерживается, так что ваш код не будет работать, так как это первый шаг:

ComPtr<IDXGIDevice3> dxgiDevice; 
    DX::ThrowIfFailed(
     m_d3dDevice.As(&dxgiDevice) 
     ); 

    ComPtr<IDXGIAdapter> dxgiAdapter; 
    DX::ThrowIfFailed(
     dxgiDevice->GetAdapter(&dxgiAdapter) 
     ); 

    ComPtr<IDXGIFactory4> dxgiFactory; 
    DX::ThrowIfFailed(
     dxgiAdapter->GetParent(IID_PPV_ARGS(&dxgiFactory)) 
     ); 

для Direct3D 12, вам должен всегда создавать фабрику DXGI явно. См. Anatomy of Direct3D 12 Create Device.

В цепях подкачки Direct3D 12 вы явно контролируете поведение подкачки буферов. В идеале вы должны использовать DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT, а затем использовать ожидаемый объект, чтобы уменьшить скорость рендеринга. Вы можете установить счетчик латентности с помощью IDXGISwapChain2::SetMaximumFrameLatency, который по умолчанию равен 3 (MSDN в настоящее время ошибается в отношении значений по умолчанию).

Если вы хотите поддерживать обновления с более высоким уровнем обновления (такие как nVidia G-Sync или AMD FreeSync), то вы используете новый флаг DXGI_PRESENT_ALLOW_TEARING для Present. Подробнее об использовании этого флага см. В разделе MSDN или об этом YouTube видео.

См. Также DirectX 12: Presentation Modes In Windows 10 (YouTube).

+0

Спасибо за ответ Чак. Я уже использую явно созданный завод, 'CreateDXGIFactory1 (__ uuidof (IDXGIFactory4), & dxgiFactory)' затем сканируйте адаптеры DXGI, чтобы найти тот, который поддерживает Direct3D 12, а затем создайте устройство, подобное описанным в вашем блоге. 'D3D12CreateDevice (myAdapter, D3D_FEATURE_LEVEL_11_0, __uuidof (ID3D12Device), и MyDevice)' Так что, если я не понял ваш ответ, я до сих пор не знаю, почему я не могу получить IDXGIDevice1. Мое понимание латентности кадров - это значение, равное <=, чем количество буферов цепи обмена, чтобы ограничить текущую очередь драйвера –

+0

Вместо этого вы можете использовать '' IDXGISwapChain2 :: SetMaximumFrameLatency''. –

+0

Обратите внимание, что вы можете использовать '' IDXGISwapChain2 :: SetMaximumFrameLatency' для только доступных swapchains. –

 Смежные вопросы

  • Нет связанных вопросов^_^