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


Уровень возможностей Direct3D 12 Core 1.0

Уровень компонентов Core 1.0 — это подмножество полного набора функций Direct3D 12. Уровень возможностей Core 1.0 может предоставляться категорией устройств, известных как устройства только для вычислений. Общая модель драйвера для устройств, доступных только для вычислений, — это модель драйвера вычислений Майкрософт (MCDM). MCDM — это упрощённая версия модели драйвера устройств Windows (WDDM), которая имеет более широкий масштаб.

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

Примечание.

Устройство для вычислений, устройство «MCDM», устройство базового уровня, и основное устройство имеют одно и то же значение. Мы предпочитаем основное устройство для простоты.

Создание основного устройства

Как правило, чтобы создать устройство Direct3D 12, вызовите функцию D3D12CreateDevice и укажите минимальный уровень компонентов.

Если указать уровень функций от 9 до 12, то возвращаемое устройство — это устройство с широкими возможностями, например традиционный GPU (который поддерживает супермножество функций основного устройства). Основное устройство никогда не возвращается для этого диапазона уровней функций.

С другой стороны, если указать уровень возможностей Core (например, D3D_FEATURE_LEVEL::D3D_FEATURE_LEVEL_1_0_CORE), устройство, которое возвращается, может быть насыщенным функциями или основным устройством Core.

// d3dcommon.h
D3D_FEATURE_LEVEL_1_0_CORE = 0x1000

Если указать _CORE уровень функций, то уровень среды выполнения/отладки проверяет, разрешает ли этот _CORE уровень функций использовать те функции, которые задействует ваше приложение. Этот набор функций определяется далее в этом разделе.

Модель шейдера для основных устройств

Основное устройство поддерживает модель шейдера 5.0+.

Среда выполнения выполняет преобразование моделей шейдера 5.x, несовместимых с DXIL, в DXIL 6.0. Поэтому драйверу нужна только поддержка версии 6.x.

Модель управления ресурсами для основных устройств

  • Поддерживаемые типы ресурсов: только необработанные и структурированные буферы (без типизированных буферов, текстур 1d/2D и т. д.)
  • Нет поддержки зарезервированных (плиточных) ресурсов
  • Поддержка пользовательских куч не поддерживается
  • Поддержка любого из этих флагов кучи не поддерживается:
    • D3D12_HEAP_FLAG_HARDWARE_PROTECTED
    • D3D12_HEAP_FLAG_ALLOW_WRITE_WATCH
    • D3D12_HEAP_FLAG_ALLOW_DISPLAY
    • D3D12_HEAP_FLAG_ALLOW_SHADER_ATOMICS (имеется в виду, что атомики для шейдеров необходимы, этот флаг предназначен для другой функции, атомиков, работающих между адаптерами)

Модель привязки ресурсов для основных устройств

  • Поддержка только 1 уровня привязки ресурсов
  • Исключения:
    • Поддержка примеров текстур не поддерживается
    • Поддержка 64 БПЛА, например, уровень функций 11.1+ (в отличие от только 8)
    • Реализации не обязаны выполнять проверку выхода за границы при доступе шейдера к ресурсам через дескрипторы; выход за границы приводит к неопределённому поведению.
      • Как побочный эффект, флаг диапазона дескриптора D3D12_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS в корневых сигнатурах не поддерживается.
  • Дескрипторы UAV/CBV могут быть сделаны только на ресурсах из стандартных куч (поэтому кучи для загрузки и обратного чтения не допускаются). Это заставляет ваше приложение копировать данные между центральным процессором и графическим процессором.
  • Несмотря на то, что это самый низкий уровень привязываемых возможностей, всё ещё существуют некоторые функции, необходимые даже на этом уровне, которые стоит выделить:
    • Дескрипторные кучи можно обновлять после записи списков команд (см. D3D12_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_VOLATILE в спецификации привязки ресурсов)
    • Корневые дескрипторы являются в основном указателями GPUVA
      • Несмотря на отсутствие поддержки MMU /VA, буферные виртуальные адреса, используемые в корневых дескрипторах, можно эмулировать с помощью реализаций путем исправления адресов.

Ограничения структурированного буфера

Структурированные буферы должны иметь базовый адрес, который равен 4 байтам, и шаг должен иметь 2 или несколько из 4. Использование шага 2 встречается в приложениях с 16-разрядными данными, учитывая то, что нет поддержки типизированных буферов в D3D_FEATURE_LEVEL_1_0_CORE.

Шаг, указанный в дескрипторах, должен соответствовать шагу, указанному в HLSL.

Поддержка очереди команд для основных устройств

Только очереди вычислений и копирования (без 3D-очередей, видео и т. д.).

Поддержка шейдера для основных устройств

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

Арифметическая точность

Основные устройства не должны поддерживать денормы для 16-разрядных операций с плавающей запятой.

Поддерживаемые API для основных устройств

В приведенном ниже списке представлено поддерживаемое подмножество полного интерфейса программирования приложений (API, которые не поддерживаются на уровне компонентов Core 1.0, не перечислены).

Методы ID3D12Device

Методы ID3D12Device1

Методы ID3D12Device2

Методы ID3D12Device3

Методы ID3D12Device4

Методы ID3D12Device5

Методы ID3D12CommandQueue

Методы ID3D12CommandList

Методы ID3D12GraphicsCommandList

Методы ID3D12GraphicsCommandList1

Методы ID3D12GraphicsCommandList2

Методы ID3D12GraphicsCommandList4