Система представляет собой ноутбук с 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 в пользовательском режиме.