Совместное использование текстуры D3D 11 на графических процессорах - PullRequest
0 голосов
/ 19 февраля 2019

Система представляет собой ноутбук с 2 графическими процессорами, Intel UHD 630, NVIDIA GTX 1070, работающий под управлением Windows 10.

Мое приложение использует D3D 11, и оно не помечено в свойствах драйвера как«Использовать высокопроизводительную графику nVidia», и я не могу пометить ее, см. эту статью о поддержке по этой причине.

Мне нужно передать 2D-текстуру от Intel в графический процессор Nvidia,Невозможно сделать это, потому что ID3D11Device::OpenSharedResource возвращает E_INVALIDARG без дополнительной информации из среды выполнения, даже с отладочной средой выполнения.

Попытка создания текстуры на любом графическом процессоре и открытия на другом, обновление до D3D 11.1 и использованиеNT обрабатывает вместо обычных, переключаясь на более совместимый формат RGBA вместо BGRA (оба устройства созданы с поддержкой BGRA), указывая флаги привязки SHADER_RESOURCE и RENDER_TARGET, как написано в разделе «Текстуры, передаваемые из D3D9 в D3D11» документы, все тот же результат.

Вот код:

HRESULT createSharedTexture( ID3D11Device* device1, ID3D11Device* device2, const CSize& size, ID3D11Texture2D** ppTexture1, ID3D11Texture2D** ppTexture2 )
{
    D3D11_TEXTURE2D_DESC texDesc;
    ZeroMemory( &texDesc, sizeof( texDesc ) );
    texDesc.Width = (UINT)size.cx;
    texDesc.Height = (UINT)size.cy;
    texDesc.MipLevels = 1;
    texDesc.ArraySize = 1;
    texDesc.SampleDesc.Count = 1;
    texDesc.SampleDesc.Quality = 0;
    texDesc.Usage = D3D11_USAGE_DEFAULT;
    texDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
    texDesc.BindFlags = 0;
    texDesc.MiscFlags = D3D11_RESOURCE_MISC_SHARED;

    CComPtr<ID3D11Texture2D> tex1, tex2;
    CHECK( device1->CreateTexture2D( &texDesc, nullptr, &tex1 ) );

    CComQIPtr<IDXGIResource> res = tex1.operator ->();
    HANDLE h = nullptr;
    CHECK( res->GetSharedHandle( &h ) );

    // The following line always fails
    CHECK( device2->OpenSharedResource( h, IID_PPV_ARGS( &tex2 ) ) );

    *ppTexture1 = tex1.Detach();
    *ppTexture2 = tex2.Detach();
    return S_OK;
}

Я думал, что Windows просто отключила графический процессор Nvidia, но нет, я могу рендерить на обоих графических процессорах и копироватьданные между ними через системную оперативную память.Но эта копия слишком медленная для моих требований, я копирую текстуры FullHD со скоростью 140 кадров в секунду, от промежуточных до динамических текстур, и наблюдаю очень высокую загрузку ЦП драйвером графического процессора Nvidia в пользовательском режиме.

...