Чему соответствуют контроллеры домена Windows и GLRC?

Чему соответствует DC в Windows? Я знаю, что могу получить HDC от HWND или HMONITOR. Означает ли это, что контроллер домена окна является псевдонимом или прокси для контроллера домена его монитора? Windows позволяет вам сказать, что класс окна должен иметь свой собственный контроллер домена, поэтому кажется, что это не один и тот же контроллер домена, хотя Windows API также, похоже, поддерживает отношения родитель-потомок между контроллерами домена. Считаю ли я контроллер домена монитора одним из родительских контроллеров домена?

Что произойдет, если окно охватывает несколько мониторов? API Windows, по-видимому, поддерживает только возврат одного HDC из окна и получение одного HGLRC из HDC. Я читал, что OpenGL не поддерживает полноэкранное окно, охватывающее несколько мониторов, и поэтому для этого у вас должно быть несколько окон.

Будет ли система SLI/Crossfire единственным GLRC?

Мне кажется, что GLRC больше всего похожа на графическую систему. GLRC представляет собой единую графическую систему. DCs представляют выходы. GLRC может рисовать на любых контроллерах домена, связанных с выходами, подключенными к графической системе, и на любых дочерних контроллерах домена этих контроллеров домена. Вы также можете иметь несколько мониторов и несколько графических карт, каждая из которых соединена вместе, и, таким образом, каждый GLRC связан с каждым контроллером домена.

Исправить или подтвердить?


person Sion Sheevok    schedule 29.09.2012    source источник


Ответы (1)


Контекст устройства в Windows — это поверхность, которую (теоретически) можно нарисовать и которая вполне может быть видна на дисплее. Windows имеет контексты устройств, как и окно рабочего стола и мониторы. Отдельные окна могут совместно использовать контексты устройств; это может произойти с подокнами, представляющими простые элементы управления и так далее.

Контексты устройства не имеют отношений родитель/потомок, как вы имеете в виду. Вся CS_PARENTDC штука относится к прямоугольнику отсечения для контекста устройства окна.

Окно имеет контекст одного устройства, точку (это немного сложнее, если окно не использует CS_OWNDC, но вы всегда должны использовать это при работе с OpenGL), независимо от того, куда идет окно. Термин «контекст устройства» не следует путать с «монитором» или любым реальным оборудованием. Это просто поверхность, на которую вы можете рисовать.

Что касается OpenGL, контексты устройства имеют относительно слабую связь с контекстами рендеринга. Допустимо использовать любой контекст устройства с RC, если этот RC был создан с тем же форматом пикселей, что и новый DC. Таким образом, вы можете установить формат пикселей на DC1, создать с ним RC, затем установить тот же формат пикселей на DC2, и вы можете использовать wglMakeCurrent с DC1 или DC2 и этим RC.

То, как многомониторные вещи работают с OpenGL, полностью зависит от настройки графического процессора. Механизм ICD, позволяющий OpenGL работать в Windows, допускает установку только одного драйвера. Таким образом, если в вашей системе есть две карты, каждая из которых подключена к отдельному монитору, с двумя разными драйверами, OpenGL распознает только одну из них. Попытка отрисовки на контроллере домена, который частично находится на экране другого графического процессора, приведет к непредсказуемым результатам.

Теперь, если у вас есть одна карта, питающая несколько мониторов, OpenGL все равно. Проблема в количестве независимых, видимых графических процессоров.

При этом весь смысл SLI/Crossfire заключается в том, чтобы притвориться, что два графических процессора на самом деле просто один. Таким образом, у вас есть один драйвер, ОС действительно видит только один графический процессор, и только одна из этих карт выводит данные на мониторы. Таким образом, OpenGL работает точно так же, как если бы одна карта питала несколько мониторов.

person Nicol Bolas    schedule 29.09.2012
comment
Это было очень полезно. Я, скорее всего, отмечу это как принятый ответ. Спасибо друг. Этот пост также подтверждает то, что вы упомянули - (opengl.org/discussion_boards/showthread.php/). Настоящий позор, OpenGL не имеет такой поддержки, даже в качестве специфичной для ОС части API. Мой уровень абстракции API OpenGL просто должен вернуть поддержку одного устройства. - person Sion Sheevok; 29.09.2012
comment
@SionSheevok: это связано не с отсутствием функций на стороне OpenGL, а с моделью драйвера операционной системы. Аналогичные ограничения присутствуют в Linux/X11, и сейчас идет сильное движение по перепроектированию модели драйвера OpenGL, чтобы можно было устанавливать несколько драйверов от разных поставщиков параллельно и использовать их одновременно. ATM можно использовать несколько драйверов OpenGL в Linux с большими усилиями (включает много волшебства LD_PRELOAD). В долгосрочной перспективе неизбежна правильная поддержка гибридной графики. - person datenwolf; 29.09.2012