Несколько Direct3D устройств и Intel GMA945 - PullRequest
2 голосов
/ 14 января 2011

Я создал 16 устройств Direct3D размером примерно 320x200 пикселей. Я вызываю IDirect3DDevice9 :: Present для каждого устройства в отдельном потоке каждые 40 мс. На ноутбуках с Windows XP и встроенным графическим адаптером Intel GMA945 часть устройств не обновляется, если отображается системная подсказка или меню «Пуск». IDirect3DDevice9 :: Present не возвращает никаких кодов ошибок в данный момент, в программе все выглядит хорошо, но пользователь может видеть, что перемещение на нескольких устройствах зависает. Что может быть причиной для этого?

Это прекрасно работает в Windows 7 с тем же оборудованием и в Windows XP с другим оборудованием, поэтому проблема только в этой комбинации. Я должен поддержать это, так как мои клиенты используют эту комбинацию оборудования и ОС. MSDN ничего не говорит о том, что я должен создать только одно устройство D3D (по крайней мере, я не могу его найти), поэтому проблема должна быть в другом месте.

Что я пытаюсь найти, так это то, что, возможно, есть какая-то комбинация флагов, которая могла бы решить мою проблему. На данный момент я использую следующее:

D3DPRESENT_PARAMETERS param = {};
param.Windowed = TRUE;    
param.SwapEffect = D3DSWAPEFFECT_DISCARD;   
param.hDeviceWindow = GetSafeHwnd();
param.BackBufferCount = 1;
param.BackBufferFormat = D3DFMT_UNKNOWN;
param.BackBufferWidth = m_szDevice.Width;
param.BackBufferHeight = m_szDevice.Height;
param.MultiSampleType = D3DMULTISAMPLE_NONMASKABLE;
param.Flags = D3DPRESENTFLAG_VIDEO;
param.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
param.MultiSampleType = D3DMULTISAMPLE_NONE;
param.MultiSampleQuality = 0;

Ответы [ 4 ]

5 голосов
/ 05 апреля 2011

Не делай этого.Устройство должно отображать в основном 1-к-1 на графический процессор.Создайте одно устройство и используйте его для рисования до 16 различных окон, в зависимости от того, что вам подходит.(Несколько подходящих цепочек обмена - это обычный подход, афаик)

Создание 16 устройств и попытка их параллельного рендеринга - это просто , требуя неприятностей.D3D основан на предположении, что только одно устройство будет выполнять серьезный рендеринг в любое время.

Теоретически, разница должна зависеть только от производительности, но в вашем случае вы пытаетесь запустить 16 устройств параллельнона паршивом графическом процессоре Intel меня не удивит, если это вызовет ошибки рендеринга, такие как вы видите.

1 голос
/ 06 апреля 2011

Я пару лет распространял программное обеспечение DirectX и узнал, что графические чипсеты Intel имеют невероятно дерьмовые драйверы.Однажды я даже увидел ревизию драйвера, которая не могла правильно визуализировать квад.Поэтому, когда у вас есть проблема с набором микросхем Intel, если вы используете последнюю версию драйвера, вы должны признать, что ваше решение будет «начинать взламывать ружья, пока оно не заработает».

Извинитечтобы дать вам слабый ответ, но наборы микросхем Intel не очень хорошо разработаны.Они исключительно для того, чтобы получить что-то - что угодно - на экране, вероятно, для использования офисного типа.Помимо «делает ли это аэростекло», Intel, вероятно, не говорит о том, что она делает или насколько хорошо она работает.Альтернативное «решение» заключается в том, чтобы распространять ваше приложение в любом случае, заявить, что наборы микросхем Intel не поддерживаются из-за сбоев в поддержке аппаратного обеспечения / драйверов, и обратиться в Intel и выяснить, можете ли вы исправить их.люди говорят, что у OpenGL плохие драйверы ...

1 голос
/ 05 апреля 2011

Прежде всего, когда вы говорите «не возвращает никаких кодов ошибок в этот момент», вы используете версию отладки D3D9 на максимальном уровне отладки?

Во-вторых, каждый раз, когда вы создаете новое устройство, и оно получает фокус, поверхности всех существующих устройств теряются.Вы вызываете сброс на всех из них после создания?

Кроме этого, это похоже на другое состояние ответов: не создавайте много устройств из одного приложения.Создание устройства может начать выдавать ошибки после 9 или 10 устройств, вы действительно нажимаете его с 16. Используйте одно устройство с несколькими цепочками подкачки вместо него, см., Например, этот DirectX 8 учебник.

0 голосов
/ 05 апреля 2011

Графические чипы Intel, особенно интегрированные GMA, никогда не были известны своими возможностями. Они могут сообщить об ограничениях, которых у них нет, и позже потерпеть неудачу, с кодами ошибок или без них (были сообщения об ошибках об этом, предположительно поддерживаемые модели шейдеров позже не удалось скомпилировать). Вполне возможно, что вы столкнулись с аналогичной проблемой с их чипами / драйверами. Работает ли оно на другом оборудовании или с другими драйверами?

Я полагаю, из-за наличия нескольких устройств они являются оконными? Вы проверяли дескрипторы окон или пытались явно передать дескриптор / область просмотра при представлении? Сбрасывается ли какое-либо из устройств?

Возможно, драйверы дисплея неправильно перерисовывают окно после отображения всплывающей подсказки или меню «Пуск» (более вероятно, если это окно под всплывающей подсказкой / меню). Вы проверили окно на предмет фокусировки, удостоверились, что оно окрашено и т.д.?

...