Я портирую свой код на D3D12 с D3D11 и пытаюсь получить показатель refre sh дисплея на D3D12. Я использую показатель refre sh для точной синхронизации анимации (это жесткое требование). Этот код работает на D3D11:
HRESULT GetRefreshRate(IUnknown* device, IDXGISwapChain* swapChain, double* outRefreshRate)
{
Microsoft::WRL::ComPtr<IDXGIOutput> dxgiOutput;
HRESULT hr = swapChain->GetContainingOutput(&dxgiOutput);
if (FAILED(hr))
return hr;
Microsoft::WRL::ComPtr<IDXGIOutput1> dxgiOutput1;
hr = dxgiOutput.As(&dxgiOutput1);
if (FAILED(hr))
return hr;
DXGI_MODE_DESC1 emptyMode = {};
DXGI_MODE_DESC1 modeDescription;
hr = dxgiOutput1->FindClosestMatchingMode1(&emptyMode, &modeDescription, device);
if (SUCCEEDED(hr))
*outRefreshRate = (double)modeDescription.RefreshRate.Numerator / (double)modeDescription.RefreshRate.Denominator;
return hr;
}
К сожалению, ID3D12Device не реализует интерфейс IDXGIDevice, поэтому FindClosestMatchingMode1 завершается с ошибкой:
DXGI ERROR: IDXGIOutput::FindClosestMatchingMode: pConcernedDevice doesn't support the IDXGIDevice interface [ MISCELLANEOUS ERROR #69: ]
Есть ли способ получить IDXGIDevice при использовании D3D12? В качестве альтернативы, как определить скорость рефракции sh дисплея для D3D12?
Я знаю о EnumDisplaySettings
, однако он возвращает целое число и, следовательно, ему не хватает точности, что приводит к смещению анимации. Я также обнаружил DwmGetCompositionTimingInfo
, однако, кажется, что он поддерживает только получение информации для основного монитора.
Мне также нужно решение, которое бы работало как на традиционных приложениях Win32, так и на приложениях UWP. Я открыт для того, чтобы при необходимости использовать два пути кода для разных моделей приложений.