2014-02-10 3 views
0

У меня есть приложение DX11, к которому я хотел бы добавить поддержку для рендеринга программного обеспечения. Это связано с тем, что в некоторых случаях он будет работать на машинах без графических процессоров. Из исследования, которое я сделал, кажется, что мой лучший выбор - WARP.Программно определить, нужно ли мне использовать аппаратный растеризатор

Это было удивительно просто изменить приложение, чтобы использовать WARP:

hr = D3D11CreateDevice(
    NULL, 
    D3D_DRIVER_TYPE_WARP, // was D3D_DRIVER_TYPE_HARDWARE 
    NULL, 
    creationFlag, 
    featureLevels, 
    ARRAYSIZE(featureLevels), 
    D3D11_SDK_VERSION, 
    &mDevice, 
    &mFeatureLevel, 
    &mDeviceContext 
    ); 

Он работает хорошо. Где я боюсь, определяется, когда устанавливать DriverType в WARP вместо аппаратного обеспечения. Есть ли функция, которую я могу вызвать, которая скажет мне, есть ли в системе аппаратная поддержка?

Я использую функциональный уровень DX 11 9_1.

ответ

2

Вот как это делается обычно: просто попробуйте D3D11CreateDevice() со всеми параметрами, которые вы ожидаете, чтобы быть в порядке, в том числе D3D_DRIVER_TYPE_HARDWARE (попробуйте различные уровни элементов в цикле, чтобы узнать лучше). Если это не удастся, откатитесь к WARP. Если WARP не удастся, откажитесь от программного обеспечения, D3D9, GL и т. Д. Если все возможные варианты не удастся, сообщите пользователю, что ему необходимо обновить его машину и/или ОС =)

Каждая попытка проверить код возврата и устройств и указателей контекста. Когда вы нашли (HRESULT == S_OK) && (device != 0) && (context != 0) - Bingo!

Надеюсь, это поможет.

+0

Могу ли я спросить, почему я должен проверять контекст и hresult? –

+0

Я не знаю, есть ли какая-либо возможность, когда только один или только два из 'HRESULT',' device' и 'context' терпят неудачу, но я считаю, что всегда рекомендуется проверять * Все * постусловий в конец. Кроме того, он не указывается в документах, если не удалось «устройство» всегда равно null или нет. Кроме того, проверьте все три каждой итерации, просто проще написать ([принцип KISS] (http://en.wikipedia.org/wiki/KISS_principle)). При инициализации дополнительные операции сравнения не будут выполнять потери производительности (по сравнению с производительностью самого D3D11CreateDevice()), поэтому «лучше безопасно, чем извините». – Drop

0

Я думаю, что аппаратные средства будут падать до программного обеспечения, если оборудование не доступно:

http://msdn.microsoft.com/en-us/library/windows/desktop/ff476328(v=vs.85).aspx

В частности:

http://msdn.microsoft.com/en-us/library/windows/desktop/ff476082(v=vs.85).aspx

Где он говорит:

Если DriverType == D3D_DRIVER_TYPE_HARDWARE, адаптер используется адаптер по умолчанию, который является первым адаптером, который указан IDXGIFactory1 :: EnumAdapters.

В качестве альтернативы, если вы хотите контролировать между WARP или аппаратным обеспечением и ничего другого, используйте EnumAdapters, чтобы получить доступные адаптеры:

http://msdn.microsoft.com/en-us/library/windows/desktop/bb174538(v=vs.85).aspx

Это дает вам больше контроля в случае, если некоторых программы третьей стороны адаптера установлен ,

+0

Проблема в том, что если аппаратное обеспечение выходит из строя, следующий тип драйвера - это программное обеспечение, которое медленнее, чем WARP. Мне нравится ваша идея использования EnumAdapters; возможно, я смогу что-то с этим поделать. Спасибо! –

Смежные вопросы