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


Поддержка потоков, списков команд и трехмерного конвейера

Этот раздел относится только к Windows 7 и более поздних версий, а также Windows Server 2008 R2 и более поздних версий операционной системы Windows.

Драйвер отображения пользовательского режима указывает на новые возможности Direct3D версии 11, которые он поддерживает (например, потоки, списки команд и трехмерный конвейер), когда среда выполнения Direct3D версии 11 вызывает функцию GetCaps(D3D10_2) драйвера. GetCaps(D3D10_2) — это одна из функций адаптера драйвера, которую драйвер предоставляет в структуре D3D10_2DDI_ADAPTERFUNCS , на которую указывает элемент pAdapterFuncs_2структуры D3D10DDIARG_OPENADAPTER . Дополнительные сведения о предоставлении функций для конкретных адаптеров во время инициализации драйвера см. в разделе Инициализация связи с Direct3D версии 11 DDI. При вызове функции GetCaps(D3D10_2) драйвер отображения пользовательского режима предоставляет новые возможности Direct3D версии 11 на основе типа запроса (который указан в элементе Typeструктуры D3D10_2DDIARG_GETCAPS, на которую указывает параметр pData функции GetCaps(D3D10_2).

Потоки и списки команд

API Direct3D версии 11 требует режима работы, в котором он может синхронизировать потоки приложения, чтобы гарантировать, что в DDI одновременно выполняется только один из потоков. Api Direct3D версии 11 также требует режима работы с программной эмуляцией списков команд. Эти режимы работы требуются и используются в более ранних версиях DDI (например, Direct3D версии 10 DDI). Таким образом, в качестве помощи для разработки для средств записи драйверов эти же режимы работы расширяются и существуют в Direct3D версии 11 DDI. Средства записи драйверов могут решать, какие режимы операций должны поддерживаться драйверами для Direct3D версии 11 DDI.

Все драйверы в конечном итоге должны полностью поддерживать все типы операций потоков (то есть все драйверы в конечном итоге должны поддерживать все возможности потоков D3D11DDI_THREADING_CAPS структуры). Однако драйвер может потребовать, чтобы API эмулировал списки команд или применял однопоточный режим работы для драйвера. API должен знать о возможностях потоков драйвера во время создания устройства API, но перед созданием устройства DDI. Таким образом, среда выполнения определяет возможности потоков драйвера при вызове функции драйвера GetCaps(D3D10_2) адаптера с элементом TypeD3D10_2DDIARG_GETCAPS для D3D11DDICAPS_THREADING. Драйвер возвращает указатель на структуру D3D11DDI_THREADING_CAPS в элементе pData D3D10_2DDIARG_GETCAPS, который определяет возможности потока драйвера. Драйвер должен поддерживать режим свободного потока (D3D11DDICAPS_FREETHREADED), если драйвер также поддерживает списки команд (D3D11DDICAPS_COMMANDLISTS_BUILD_2), так как списки команд создаются в режиме свободного потока. Драйвер должен согласиться на поддержку режима свободного потока и списков команд. Приложение может определить поддержку, указанную драйвером, с помощью функции CheckFeatureSupport на уровне приложения и константы D3D11_FEATURE_THREADING; однако некоторые приложения могут не заботиться из-за поддержки, которую предоставляет API.

Уровень трехмерного конвейера

Драйверы, поддерживающие Direct3D версии 11 DDI, не требуются для поддержки всех аппаратных функций Direct3D версии 11 DDI. Драйверы могут поддерживать новую потоковую модель Direct3D версии 11 DDI поверх оборудования, которое поддерживает только Direct3D версии 10 DDI. Среда выполнения Direct3D версии 11 определяет максимальный уровень поддержки оборудования драйвера, когда среда выполнения вызывает функцию GetCaps(D3D10_2) драйвера с элементом TypeD3D10_2DDIARG_GETCAPS задано значение D3D11DDICAPS_3DPIPELINESUPPORT. Драйвер возвращает указатель на структуру D3D11DDI_3DPIPELINESUPPORT_CAPS в элементе pDataD3D10_2DDIARG_GETCAPS , которая определяет максимальный уровень поддержки оборудования.

API не использует только версию DDI в качестве основного индикатора поддержки уровня функций API; API позволяет драйверу выполнять обратную отправку в этот процесс. Среда выполнения выбирает значение D3D11DDI_3DPIPELINELEVEL и передает его драйверу во время создания устройства в вызове функции CreateDevice(D3D10) драйвера как часть элемента Flags структуры D3D10DDIARG_CREATEDEVICE .

Если драйвер поддерживает уровни оборудования ниже, чем Direct3D версии 11 в Direct3D версии 11 DDI, это может иметь незначительные последствия для работы драйвера. Во-первых, среда выполнения Direct3D версии 11 может вообще никогда не вызывать множество новых функций DDI Direct3D версии 11. Например, среда выполнения Direct3D версии 11 не вызывает новые функции DDI этапа шейдера (например , DsSetShader), если драйвер поддерживает аппаратный уровень компонентов, который меньше, чем Direct3D версии 11. Другие функции DDI следуют правилам уровня компонентов и игнорируют тот факт, что Direct3D версии 11 DDI может быть связан с более высокими возможностями. Например, несмотря на то, что IAVertexInputSlots для API Direct3D версии 11 имеет значение 32, уровень компонентов Direct3D версии 10 допускает только 16, и это то, что следует ожидать драйверу.

Нерекомендуемые или преобразованные функции представляют еще один интересный аспект. Прекращение поддержки на уровне Direct3D версии 11 DDI невозможно, так как устаревание должно поддерживать возможность выражения функций DDI более ранней версии. Например, версия API Direct3D 11 PIPELINESTATS всегда является постоянной; однако он запрашивает различные D3D10_DDI_QUERY_DATA_PIPELINE_STATISTICS с уровнями функций Direct3D 10 и D3D11_DDI_QUERY_DATA_PIPELINE_STATISTICS с уровнями компонентов Direct3D 11 и т. д. Несмотря на то, что API попытался нерекомендуемый размер фильтра текста, драйверам проще полностью устареть запись таблицы функций DDI, чем пытаться повторно использовать запись таблицы функций для чего-то другого.

Даже если драйвер, поддерживающий Direct3D версии 11 DDI, не поддерживает полный уровень компонентов Direct3D версии 11, драйвер не может отказаться от поддержки расширенного формата, как описано в разделе Поддержка расширенного информирования о форматировании. Так как драйвер поддерживает Direct3D версии 11 DDI, драйвер должен выполнять следующие задачи:

  • Поддержка форматов BGR

  • Правильно отвечать на вызовы функции CheckFormatSupport, чтобы проверка для поддержки XR_BIAS. Драйвер должен запросить поддержку или отклонить поддержку.

  • Разрешить приведение полностью типизированных буферов назад

API Direct3D версии 11 также сообщает драйверу, использует ли приложение несколько потоков с помощью флага D3D11DDI_CREATEDEVICE_FLAG_SINGLETHREADED. Если этот флаг присутствует в элементе Flags структуры D3D10DDIARG_CREATEDEVICE при создании устройства отображения с помощью вызова функции CreateDevice(D3D10) драйвера, драйвер может определить, что отложенные контексты не создаются и что драйвер не требуется синхронизировать, так как параллельные создания не выполняются.