我想从我的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接口。
非常感谢任何提示&提前致谢! 剪辑
答案 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视频。