Как обрабатываются инструкции Direct3D и OpenGL на видеокарте? - PullRequest
8 голосов
/ 15 июня 2011

Я пытаюсь лучше понять, как работают графические процессоры, и меня смущает то, как они работают с высокоуровневыми API, такими как Direct3D или OpenGL.Очень часто можно увидеть рекламу графических карт, которые поддерживают аппаратное ускорение Direct3D и OpenGL.Означает ли это, что они обрабатывают инструкции Direct3D и OpenGL непосредственно на аппаратном уровне?Я не смог найти четких доказательств этого или того, что они компилируются в представление сборки, которое может обработать графический процессор.Если есть такое преобразование, кто это делает?Библиотека программного обеспечения (Direct3D / OpenGL), драйвер или сам графический процессор?На той же строке, где определяется графический конвейер?в оборудовании GPU, драйвере или библиотеке программного обеспечения?Это меня особенно смущает идея программируемых конвейеров.

Есть ли хороший ресурс, где я могу найти информацию об этих деталях?

Ответы [ 3 ]

9 голосов
/ 15 июня 2011

Вы задали очень широкий и сложный вопрос.На самом деле, вы задали несколько широких, сложных вопросов.

Программное обеспечение, которое окончательно управляет работой любого оборудования, называется «драйвером» оборудования.Естественно, для графического оборудования это называется «графический драйвер».Как и все драйверы, графический драйвер фактически является устанавливаемой частью ОС;ОС - это то, что позволяет графическому драйверу выполнять свою работу и общаться с оборудованием.Они работают рука об руку.

В действительности существует два типа вызовов D3D или OpenGL (ранее называемых «API»): те, которые общаются с драйвером, и те, которые этого не делают.Каждый вызов, который на самом деле что-то рисует, должен (в конце концов) общаться с драйвером, но вызовы, которые устанавливают более поздние вызовы рисования, могут просто сохранять данные локально.

Когда вы делаете вызов рисования, API выполняет некоторые проверки, чтобы сделатьуверен, что вы, как пользователь, сделали правильный вызов рендеринга.Если это так, у API есть несколько вариантов того, что делать.Оказывается, что разговор напрямую с водителем занимает много времени, независимо от того, сколько команд вы ему дадите, когда начинаете говорить.Поэтому часто происходит то, что API сохраняет ваш вызов рендеринга и сразу же возвращается.Затем, возможно, в другом потоке, он может посмотреть, сколько вызовов рендеринга было сохранено.Если их «достаточно», он отправит их водителю.Это называется «сортировкой».

Задача водителя состоит в том, чтобы принимать переадресованные вызовы и преобразовывать их в то, что будет делать графический процессор.

В той же строкегде определяется графический конвейер?в оборудовании GPU, драйвере или библиотеке программного обеспечения?

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

В старые временаПостроение графического конвейера жестко контролировалось аппаратным обеспечением графического процессора.В наши дни это менее верно, хотя есть некоторый аппаратный контроль.На современном оборудовании (поддерживающем OpenGL 3.0 или Direct3D10 или выше) теоретически было бы возможно, если бы у вас был прямой доступ к графическому драйверу, разработать API, который использовал бы несколько измененную версию графического конвейера.Таким образом, API-интерфейсы в значительной степени определяют внешний вид графического конвейера.

Каждый этап конвейера рендеринга принимает определенные значения из ценных этапов в качестве входных данных и генерирует некоторое количество значений в качестве выходных данных.Стадия является «программируемой», если механизм генерирования выходов из входов включает в себя выполнение предоставленной пользователем программы, называемой «шейдер».Так что не существует такого понятия, как программируемый конвейер (пока);просто программируемые ступени фиксированного трубопровода.

7 голосов
/ 15 июня 2011

Нет такой вещи, как инструкции D3D или OGL.Direct3D или OpenGL будут вызывать графический драйвер и выполнять все, что им нужно, чтобы это произошло.Это не полностью верно для шейдеров, которые имеют одинаковый байт-код на уровне API (D3D / OGL), и в этом случае API предоставляет компилятор, но это, насколько я знаю,все еще преобразуется аппаратно-зависимыми способами перед выполнением.Конечно, Direct3D и OpenGL также включают компоненты пользовательского режима для повышения производительности или обеспечения лучшего интерфейса - например, они будут выполнять пакетные вызовы ядру для уменьшения переключений контекста.

Реальность создания графических процессоров заключается в том, что Microsoftи nVidia / ATi собираются вместе и думают о том, что они хотят и что возможно реализовать, и придумывают групповую спецификацию, поскольку реальность такова, что ничего из этого не будет работать, если крупные поставщики оборудования и программного обеспечения не будут сотрудничать.Никто не купит GPU, который не поддерживает DirectX, и никто не купит Windows, где ни один GPU не реализует DirectX.Конечно, «никто» не относителен, но это будет огромной потерей для всех заинтересованных сторон, и, конечно, если у вас есть игра, которая построена только на API D3D10, то драйвер, поддерживающий D3D10, является обязательным для запуска игры.- эффективно увеличивать стоимость продукта за счет увеличения диапазона программного обеспечения, которое он может запускать, что является преимуществом для продажи.Это означает, что семантическая разница между определением поставщиком оборудования или поставщиком программного обеспечения минимальна, реально, особенно потому, что только два реальных API рендеринга 3D на ПК, OpenGL и Direct3D, следуют очень похожим моделям для графического конвейера, посколькуЯ знаю.

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

В конечном счете, графический процессор защищен сильной абстракцией на уровне драйвера.Он реализует интерфейс в стиле C, и все, что разрешено или необходимо в этой реализации, идет.После этого все полностью определяется реализацией.

Вы можете проверить документацию MSDN для написания графического драйвера.Я видел это, но у меня нет удобной ссылки, и она описывает интерфейсы, которые вы должны придерживаться, и другие вещи.

3 голосов
/ 15 июня 2011

У вас уже есть два очень хороших ответа.Но, пожалуй, самое лучшее, читая актуальную документацию по программированию для графических процессоров AMD / ATI: http://developer.amd.com/documentation/guides/pages/default.aspx#open_gpu

К сожалению, NVidia не публикует их.

...