2016-11-04 17 views
0

IDXGIDevice1 :: SetMaximumFrameLatency 메서드를 내 dx12app에서 호출하고 싶습니다. 현재 Direct3D 12 장치에서 유효한 IDXGIDevice1을 가져와야합니다. 인터페이스가 E_NOINTERFACE를 반환 조회 :은 dx12의 ID3D12Device에서 IDXGIDevice 또는 IDXGIDevice1을 획득 할 수 없습니다.

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 

확실하지 내가 뭔가를 누락 또는 I 유효한 IDXGIDevice1 인터페이스를 얻기 위해 구현해야 DXGI 논리의 순서가있는 경우.

미리 감사드립니다. & 감사합니다. KLIP

는 첫 걸음으로 위의 코드가 작동하지 않도록 Direct3D를 (12), DXGI 공장을 얻는이 '기존의 패턴'에 대한

답변

1

이 지원되지 않습니다 : Direct3D를 12

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)) 
     ); 

, 당신을 항상 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)를 지원하려면 Present에 대해 새 DXGI_PRESENT_ALLOW_TEARING 플래그를 사용합니다. 이 플래그 사용에 대한 자세한 내용은 MSDN 또는 YouTube 비디오를 참조하십시오.

도 참조하십시오. DirectX 12: Presentation Modes In Windows 10 (YouTube).

+0

답장을 보내 주셔서 감사합니다. 는 이미 다음 블로그에 설명 된 단계와 유사한 장치를 만들고, Direct3D의 12을 지원하는 하나를 찾을 수 다음 스캔 DXGI 어댑터를 명시 적으로 생성 된 공장, 'CreateDXGIFactory1 (__ uuidof (IDXGIFactory4), dxgiFactory)를'사용합니다. 내가 귀하의 회신을 오해하지 않는 한 내가 IDXGIDevice1을 취득 할 수없는 이유 'D3D12CreateDevice (myAdapter, D3D_FEATURE_LEVEL_11_0, __uuidof (ID3D12Device), myDevice)은' 그래서, 난 아직 확실하지 않다. 프레임 대기 시간에 대한 나의 이해는 드라이버의 현재 큐를 제한하는 스왑 체인의 버퍼 수보다 작은 값입니다. –

+0

대신에 "IDXGISwapChain2 :: SetMaximumFrameLatency'를 사용할 수 있습니다. –

+0

대기 가능한 스왑 체인에만''IDXGISwapChain2 :: SetMaximumFrameLatency''를 사용할 수 있습니다. –