Уровни API (Direct3D 10)

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

Базовый уровень

Основной слой существует по умолчанию; обеспечивает очень тонкое сопоставление между API и драйвером устройства, минимизируя затраты на высокочастотные вызовы. Так как базовый уровень имеет важное значение для производительности, он выполняет только критическую проверку.

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

Создавайте слои при создании устройства путем вызова D3D10CreateDevice и предоставления одного или нескольких D3D10_CREATE_DEVICE_FLAG значений .

Уровень отладки

Уровень отладки обеспечивает расширенную дополнительную проверку параметров и согласованности (например, проверку компоновки шейдера и привязки ресурсов, проверку согласованности параметров и описание ошибок отчетов). Выходные данные, создаваемые уровнем отладки, состоят из очереди строк, доступных с помощью интерфейса ID3D10InfoQueue (см . раздел Настройка выходных данных отладки с помощью ID3D10InfoQueue (Direct3D 10)). Ошибки, созданные основным уровнем, выделяются отладочным уровнем предупреждениями.

Чтобы создать устройство, поддерживающее уровень отладки, необходимо установить пакет SDK Для DirectX (чтобы получить D3D10SDKLayers.DLL), а затем указать флаг D3D10_CREATE_DEVICE_DEBUG при вызове D3D10CreateDevice. Конечно, запуск приложения с уровнем отладки будет значительно медленнее. Чтобы включить или отключить сообщения отладки для API D3DX10, вызовите D3DX10DebugMute.

Когда уровень отладки выводит список утечек памяти, он выводит список указателей интерфейса объекта вместе с понятными именами. Понятное имя по умолчанию — unnamed<>. Понятное имя можно задать с помощью метода ID3D10DeviceChild::SetPrivateData и WKPDID_D3DDebugObjectName GUID, который находится в D3Dcommon.h. Например, чтобы присвоить pTexture имя пакета SDKLayer mytexture.jpg, используйте следующий код:

const char c_szName[] = "mytexture.jpg";
pTexture->SetPrivateData( WKPDID_D3DDebugObjectName, sizeof( c_szName ) - 1, c_szName );

Как правило, эти вызовы следует компилировать из рабочей версии.

Переключение на ссылочный уровень

Этот уровень позволяет приложению переходить между аппаратным устройством (HAL) и эталонным или программным устройством (REF). Чтобы переключить устройство, необходимо сначала создать устройство, поддерживающее уровень переключения к ссылке (см. раздел D3D10CreateDevice), а затем вызвать ID3D10SwitchToRef::SetUseRef.

Все состояния устройства, ресурсы и объекты поддерживаются при этом переходе устройства. Однако иногда невозможно точно сопоставить данные ресурсов. Это связано с тем, что некоторые сведения доступны аппаратному устройству, недоступному для эталонного устройства.

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

Примечание

Эта функция переключения на ссылочный уровень поддерживается только в Direct3D 10 и Direct3D 10.1 и больше не поддерживается в Direct3D 11 и более поздних версиях.

 

слой Thread-Safe

Этот уровень предназначен для предоставления многопоточных приложений доступа к устройству из нескольких потоков.

Приложение Direct3D 10 может управлять синхронизацией устройств с помощью функций устройства. Это позволяет приложению включать или отключать критические разделы (временно включать или отключать многопототочную защиту), а также принимать и освобождать блокировку критического раздела для нескольких точек входа API Direct3D 10. Потокобезопасный слой включен по умолчанию. Для однопоточных приложений потокобезопасный уровень не влияет на производительность.

Различия между Direct3D 9 и Direct3D 10:

  • В отличие от Direct3D 9, API Direct3D 10 по умолчанию полностью потокобезопасный.

 

Функции API (Direct3D 10)