Поделиться через


Поддержка нескольких процессоров

Драйверы отображения в пользовательском режиме на компьютерах с несколькими процессорами могут позволить среде выполнения Microsoft Direct3D выполнять оптимизации с несколькими процессорами, или драйверы могут выполнять собственные многопроцессорные оптимизации.

Оптимизация Multiple-Processor, обрабатываемая средой выполнения

Многопроцессорные оптимизации, обрабатываемые средой выполнения Direct3D, включены только для драйверов, поддерживающих функции LockAsync, UnlockAsync и Rename . Эти функции позволяют многопроцессорной оптимизации хорошо работать с приложениями, которые часто блокируют динамические ресурсы. Функции LockAsync и UnlockAsync вместе с функцией GetQueryData должны повторно использоваться в драйверах, которые предоставляют версию DDI 0x0000000B или более поздней версии. Драйвер возвращает значение версии DDI в элементе DriverVersion структуры D3D10DDIARG_OPENADAPTER при вызове функции OpenAdapter драйвера. Когда среда выполнения вызывает функцию драйвера повторно, один поток может выполняться внутри этой функции, а другой поток, ссылающийся на то же устройство отображения, выполняется внутри другой функции драйвера.

В некоторых ситуациях среда выполнения Direct3D использует многопроцессорную оптимизацию для разгрузки работы на отдельный процессор и повышения производительности компьютера. Если включены многопроцессорные оптимизации, между средой выполнения Direct3D и драйвером отображения в пользовательском режиме добавляется дополнительный программный уровень. Этот уровень программного обеспечения перехватывает все вызовы, которые среда выполнения Direct3D в противном случае будет выполнять к функциям драйвера отображения пользовательского режима.

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

Оптимизация Multiple-Processor с использованием драйвера

Если драйвер будет выполнять собственные оптимизации с несколькими процессорами, он не должен реализовывать функции LockAsync, UnlockAsync и Rename . В этом случае драйвер должен вызвать функцию pfnSetAsyncCallbacksCb , чтобы уведомить среду выполнения о том, будет ли среда выполнения запускать или прекращать прием вызовов функций обратного вызова среды выполнения из рабочего потока.

Если драйвер выполняет собственные оптимизации с несколькими процессорами, он должен следовать той же политике, что и среда выполнения Direct3D, когда она определяет, чтобы включить многопроцессорную оптимизацию. Эта политика обеспечивает справедливое совместное использование системных ресурсов во всех процессах. В частности, драйвер должен отключить многопроцессорную оптимизацию в следующих ситуациях:

  • Приложение работает в оконном режиме.

  • Компьютер содержит только один процессор (или ядро процессора); драйвер должен отключить оптимизацию на однопроцессорных компьютерах с гиперпотоками.

  • Приложение запрашивает, чтобы не были включены многопроцессорные оптимизации, или приложение использует программную обработку вершин; эти сведения передаются в функцию CreateDevice драйвера.

Если поставщики хотят включить оптимизацию с несколькими процессорами в одной из этих ситуаций, сначала обратитесь в корпорацию Майкрософт.