Получение показателя refre sh на D3D12 - PullRequest
1 голос
/ 02 мая 2020

Я портирую свой код на 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. Я открыт для того, чтобы при необходимости использовать два пути кода для разных моделей приложений.

...