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


dcl_interface_dynamicindexed (sm5 - asm)

Объявите указатели таблицы функций (интерфейсы).

dcl_interface_dynamicindexed fp#[arraySize][numCallSites] = {ft#, ft#, ...}
Элемент Описание
Fp #
[in] Указатели таблицы функций.

Комментарии

Каждый интерфейс должен быть привязан из API, прежде чем шейдер станет пригодным для использования. Привязка дает ссылку на одну из таблиц функций, чтобы можно было заполнить слоты методов. Компилятор не будет создавать указатели для объектов без ссылки.

Указатель таблицы функций имеет полный набор слотов методов, чтобы избежать дополнительного уровня косвенного обращения, необходимого для представления указателя на vtable C++. Это также потребует, чтобы эти указатели были 5 кортежей. В модели виртуальной встраивание HLSL всегда известно, какие глобальные переменные или входные данные используются для вызова, чтобы можно было настроить таблицы для каждого корневого объекта.

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

Первым [] объявления интерфейса является размер массива. Если используется динамическое индексирование, объявление будет указывать на это, как показано ниже. Массив указателей интерфейса также можно индексировать статически. Не обязательно, чтобы массивы указателей интерфейса означают динамическое индексирование.

Нумерация указателей интерфейса начинается с 0 для первого объявления и впоследствии учитывает размер массива, поэтому первый указатель после четырех массивов элементов fp0[4][1] будет fp4[][].

Второе [] объявления интерфейса — это количество сайтов вызовов, которое должно соответствовать количеству тел в каждой таблице, на которую ссылается объявление.

Количество вариантов таблицы функций (ft#) не ограничивается в объявлении интерфейса.

Данная таблица функций (ft#) может отображаться несколько раз в одном или нескольких объявлениях интерфейса.

Ограничения

  • Количество объектов в шейдере, которое является суммой во всех объявлениях fp# их объявлений [arraySize], должно быть не более 253. Это число соответствует количеству этих указателей. Среда выполнения применяет это ограничение в 253, чтобы сохранить привязку к размеру DDI для передачи данных указателя.

  • Количество сайтов вызовов в шейдере, которое является суммой по всем операторам fcall количества потенциальных целевых объектов ветвей, должно быть не более 4096.

    Например, fcall , использующий статический индекс для первого измерения fp[][][], считается одним:

    fcall fp0[0][0] // +1

    Fcall, использующий динамический индекс, учитывает количество элементов в массиве (первый [] dcl_interface):

    dcl_interface_dynamicindexed fp1[2][1] = {ft2, ft3, ft4} ...

    fcall fp1[r0.z + 0][1] // +2

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

Эта инструкция применяется к следующим этапам шейдера:

Вершина Корпуса Домен Geometry Пиксель Вычисления
X X X X X X

Минимальная модель шейдера

Эта инструкция поддерживается в следующих моделях шейдеров:

Модель шейдера Поддерживается
Модель шейдера 5 да
Модель шейдера 4.1 нет
Модель шейдера 4 нет
Модель шейдера 3 (DirectX HLSL) нет
Модель шейдера 2 (DirectX HLSL) нет
Модель шейдера 1 (DirectX HLSL) нет

cs_4_0 и cs_4_1 поддерживают эту инструкцию для UAV и SRV.

Сборка шейдера модели 5 (DirectX HLSL)