无法从dx12中的ID3D12Device获取IDXGIDevice或IDXGIDevice1

时间:2016-11-04 06:38:33

标签: direct3d dxgi directx-12

我想从我的dx12app调用IDXGIDevice1 :: SetMaximumFrameLatency方法,因为我需要从当前的Direct3D 12设备获取有效的IDXGIDevice1。查询接口返回E_NOINTERFACE:

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接口。

非常感谢任何提示&提前致谢! 剪辑

1 个答案:

答案 0 :(得分: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)