Я говорю об конкретном абзаце:
Начиная с Windows 8, всегда присутствует адаптер под названием «Базовый драйвер рендеринга Microsoft». Этот адаптер имеет VendorId 0x1414 и DeviceID 0x8c. Этот адаптер также имеет значение DXGI_ADAPTER_FLAG_SOFTWARE, установленное в элементе Flags его структуры DXGI_ADAPTER_DESC2. Этот адаптер представляет собой устройство только для рендеринга, не имеющее выходов для отображения. DXGI никогда не возвращает DXGI_ERROR_DEVICE_REMOVED для этого адаптера.
Этот адаптер всегда перечисляется. Но у него нет вывода (дисплеев) и соответственно нет режимов отображения? Означает ли это, что я не могу создать с его помощью цепочку обмена?
Это устройство только для рендеринга. Означает ли это, что у него нет вычислительных возможностей?
Для чего на самом деле используется этот конкретный адаптер, когда у него нет выходов?
Microsoft Basic Render Driver — это современная замена резервного варианта «устаревшего VGA». По сути это WARP+VGA. Я считаю, что документы ссылаются на тот факт, что с ним не связан объект «Вывод DXGI».
Что касается Direct3D 11, я рассказываю о рекомендациях по работе с MBR в приложениях в этом посте блога.
Например:
ComPtr<IDXGIDevice> dxgiDevice;
if (SUCCEEDED(device.As(&dxgiDevice)))
{
ComPtr<IDXGIAdapter> adapter;
if (SUCCEEDED(dxgiDevice->GetAdapter(&adapter)))
{
DXGI_ADAPTER_DESC desc;
if (SUCCEEDED(adapter->GetDesc(&desc)))
{
if ( (desc.VendorId == 0x1414) && (desc.DeviceId == 0x8c) )
{
// WARNING: Microsoft Basic Render Driver is active.
// Performance of this application may be unsatisfactory.
// Please ensure that your video card is Direct3D10/11 capable
// and has the appropriate driver installed.
}
}
}
}
При перечислении устройств вы используете флаг для его фильтрации, но знайте, что это ВСЕ ЕЩЕ может оказаться MBR, если в системе нет другого устройства и вы используете «по умолчанию»:
// This method acquires the first available hardware adapter.
// If no such adapter can be found, *ppAdapter will be set to nullptr.
void GetHardwareAdapter(IDXGIAdapter1** ppAdapter)
{
*ppAdapter = nullptr;
ComPtr<IDXGIAdapter1> adapter;
ComPtr<IDXGIFactory6> factory6;
HRESULT hr = m_dxgiFactory.As(&factory6);
if (SUCCEEDED(hr))
{
for (UINT adapterIndex = 0;
SUCCEEDED(factory6->EnumAdapterByGpuPreference(
adapterIndex,
DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE,
IID_PPV_ARGS(adapter.ReleaseAndGetAddressOf())));
adapterIndex++)
{
DXGI_ADAPTER_DESC1 desc;
ThrowIfFailed(adapter->GetDesc1(&desc));
if (desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE)
{
// Don't select the Basic Render Driver adapter.
continue;
}
#ifdef _DEBUG
wchar_t buff[256] = {};
swprintf_s(buff, L"Direct3D Adapter (%u): VID:%04X, PID:%04X - %ls\n", adapterIndex, desc.VendorId, desc.DeviceId, desc.Description);
OutputDebugStringW(buff);
#endif
break;
}
}
if (!adapter)
{
for (UINT adapterIndex = 0;
SUCCEEDED(m_dxgiFactory->EnumAdapters1(
adapterIndex,
adapter.ReleaseAndGetAddressOf()));
adapterIndex++)
{
DXGI_ADAPTER_DESC1 desc;
ThrowIfFailed(adapter->GetDesc1(&desc));
if (desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE)
{
// Don't select the Basic Render Driver adapter.
continue;
}
#ifdef _DEBUG
wchar_t buff[256] = {};
swprintf_s(buff, L"Direct3D Adapter (%u): VID:%04X, PID:%04X - %ls\n", adapterIndex, desc.VendorId, desc.DeviceId, desc.Description);
OutputDebugStringW(buff);
#endif
break;
}
}
*ppAdapter = adapter.Detach();
}
Вы можете выполнять рендеринг за кадром и/или на стороне сервера Learn.microsoft.com/en-us/windows/win32/direct2d/…