Ограничения управления потоками

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

Заметка

При использовании профилей шейдера *_4_0_level_9_x HLSL вы неявно используете профили шейдера 2.x для поддержки оборудования с поддержкой Direct3D 9. Профили модели 2.x шейдера поддерживают более ограниченное поведение управления потоком, чем шейдер модели 4.x и более поздних версий профилей.

 

Счетчики глубины инструкций шейдера пикселей

ps_2_0 не поддерживает управление потоками. Ниже перечислены ограничения для других версий шейдера пикселей.

Количество глубин инструкций для ps_2_x

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

Инструкция Статическое вложение Динамическое вложение цикл или вложенный фрагмент вложение вызовов
, если bool - ps 1 0 0 0
if_comp — ps 0 1 0 0
, если предварительно — ps 0 1 0 0
else - ps 0 0 0 0
endif — ps -1(if bool - ps) -1(, если предварительно - ps или if_comp - ps) 0 0
rep — ps 0 0 1 0
endrep — ps 0 0 -1 0
перерыв — ps 0 0 0 0
break_comp — ps 0 1, -1 0 0
разрыв — ps 0 0 0 0
вызов — ps 0 0 0 1
callnz bool - ps 0 0 0 1
callnz pred - ps 0 1 0 1
ret — ps 0 -1(callnz pred - ps) 0 -1
setp_comp — ps 0 0 0 0

 

Глубина вложения

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

Тип инструкции Максимум
Статическое вложение 24 if (D3DCAPS9. D3DPSHADERCAPS2_0.StaticFlowControlDepth > 0); 0 в противном случае
Динамическое вложение От 0 до 24 см. D3DCAPS9. D3DPSHADERCAPS2_0.DynamicFlowControlDepth
вложенная реапсия От 0 до 4 см. D3DCAPS9. D3DPSHADERCAPS2_0.StaticFlowControlDepth
вложение вызовов От 0 до 4 см. D3DCAPS9. D3DPSHADERCAPS2_0.StaticFlowControlDepth (независимо от ограничения rep)

 

Количество глубин инструкций для ps_2_sw

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

Инструкция Статическое вложение Динамическое вложение цикл или вложенный фрагмент вложение вызовов
, если bool - ps 1 0 0 0
, если предварительно — ps 0 1 0 0
if_comp — ps 0 1 0 0
else - ps 0 0 0 0
endif — ps -1(if bool - ps) -1(, если предварительно - ps или if_comp - ps) 0 0
rep — ps 0 0 1 0
endrep — ps 0 0 -1 0
цикл — ps n/a n/a n/a n/a
endloop — ps n/a n/a n/a n/a
перерыв — ps 0 0 0 0
break_comp — ps 0 1, -1 0 0
разрыв — ps 0 0 0 0
вызов — ps 0 0 0 1
callnz bool - ps 0 0 0 1
callnz pred - ps 0 1 0 1
ret — ps 0 -1(callnz pred - ps) 0 -1
setp_comp — ps 0 0 0 0

 

Глубина вложения

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

Тип инструкции Максимум
Статическое вложение 24
Динамическое вложение 24
вложенная реапсия 4
вложение вызовов 4

 

Количество глубин инструкций для ps_3_0

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

Инструкция Статическое вложение Динамическое вложение цикл или вложенный фрагмент вложение вызовов
, если bool - ps 1 0 0 0
, если предварительно — ps 0 1 0 0
if_comp — ps 0 1 0 0
else - ps 0 0 0 0
endif — ps -1(if bool - ps) -1(, если предварительно - ps или if_comp - ps) 0 0
rep — ps 0 0 1 0
endrep — ps 0 0 -1 0
цикл — ps 0 0 1 0
endloop — ps 0 0 -1 0
перерыв — ps 0 0 0 0
break_comp — ps 0 1, -1 0 0
разрыв — ps 0 0 0 0
вызов — ps 0 0 0 1
callnz bool - ps 0 0 0 1
callnz pred - ps 0 1 0 1
ret — ps 0 -1(callnz pred - ps) 0 -1
setp_comp — ps 0 0 0 0

 

Глубина вложения

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

Тип инструкции Максимум
Статическое вложение 24
Динамическое вложение 24
цикл или вложенный фрагмент 4
вложение вызовов 4

 

Количество глубин инструкций для ps_3_sw

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

Инструкция Статическое вложение Динамическое вложение цикл или вложенный фрагмент вложение вызовов
, если bool - ps 1 0 0 0
, если предварительно — ps 0 1 0 0
if_comp — ps 0 1 0 0
else - ps 0 0 0 0
endif — ps -1(if bool - ps) -1(, если предварительно - ps или if_comp - ps) 0 0
rep — ps 0 0 1 0
endrep — ps 0 0 -1 0
цикл — ps 0 0 1 0
endloop — ps 0 0 -1 0
перерыв — ps 0 0 0 0
break_comp — ps 0 1, -1 0 0
разрыв — ps 0 0 0 0
вызов — ps 0 0 0 1
callnz bool - ps 0 0 0 1
callnz pred - ps 0 1 0 1
ret — ps 0 -1(callnz pred - ps) 0 -1
setp_comp — ps 0 0 0 0

 

Глубина вложения

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

Тип инструкции Максимум
Статическое вложение 24
Динамическое вложение 24
цикл или вложенный фрагмент 4
вложение вызовов 4

 

Взаимодействие управления потоками Per-Pixel с градиентами экрана

Набор инструкций шейдера пикселей содержит несколько инструкций, которые создают или используют градиенты количества в отношении пространства экрана x и y. Наиболее распространенным способом использования градиентов является вычисление вычислений уровня детализации для выборки текстур, а в случае анизотропной фильтрации выборки по оси анизотропии. Как правило, аппаратные реализации запускают шейдер пикселей одновременно (например, сетку 2x2), чтобы градиенты объемов, вычисляемых в шейдере, могли быть достаточно приблизительными как разностные значения в той же точке выполнения в смежных пикселях.

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

Все инструкции шейдера пикселей секционируются в те операции, которые разрешены, и в те, которые не разрешены внутри элемента управления потоком:

  • Сценарий A. Операции, которые не разрешены внутри элемента управления потоками, которые могут различаться в пикселях в примитиве. К ним относятся операции, перечисленные в следующей таблице.

    Инструкция Разрешено в элементе управления потоками, когда:
    texld - ps_2_0 и вверх, texldb - ps и texldp - ps Временный регистр используется для координат текстуры.
    dsx — ps и dsy — ps Временный регистр используется для операнда.

     

  • Сценарий B. Операции, разрешенные в любом месте. К ним относятся операции, перечисленные в следующей таблице.

    Инструкция Разрешено в любом месте, когда:
    texld - ps_2_0 и вверх, texldb - ps и texldp - ps Доступное только для чтения количество используется для координат текстуры (может отличаться на пиксель, например интерполированные координаты текстуры).
    dsx — ps и dsy — ps Доступное только для чтения количество используется для входного операнда (может отличаться на пиксель, например интерполированные координаты текстуры).
    texldl — ps Пользователь предоставляет уровень детализации в качестве аргумента, поэтому нет градиентов и, следовательно, нет проблем с элементом управления потоком.
    texldd - ps Пользователь предоставляет градиенты в качестве входных аргументов, поэтому нет проблем с элементом управления потоками.

     

Эти ограничения строго применяются в проверке шейдера. Сценарии с условием ветви, которая выглядит так, как она будет последовательно ветвляться по примитиву, несмотря на то, что операнды в выражении условия — это количество вычисляемых пикселей, тем не менее все равно попадает в сценарий A и не допускается. Аналогичным образом, сценарии, когда градиенты запрашиваются для некоторых вычисляемых шейдером количества x изнутри динамического элемента управления потоком, но, как представляется, x не изменяется в любой из ветвей, тем не менее, все равно попадают в сценарий A и не допускаются.

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

Пользователь может использовать инструкции из сценариев A и B вместе. Например, предположим, что пользователю требуется пример анисотропной текстуры с координатой вычисленной текстуры шейдера; однако нагрузка текстуры необходима только для пикселей, удовлетворяющих определенному условию на пиксель. Для удовлетворения этих требований пользователь может вычислить координату текстуры для всех пикселей, вне разных элементов управления потоком на пиксели, немедленно вычисляя градиенты с помощью dsx - ps и dsy - ps инструкции. Затем в пределах пикселя, если bool - ps/endif - ps block, пользователь может использовать texlddd - ps (загрузка текстуры с предоставленными градиентами), передавая предварительно вычисляемые градиенты. Другой способ описать этот шаблон использования заключается в том, что, хотя все пиксели в примитиве должны были вычислять координаты текстуры и участвовать в вычислении градиента, только пиксели, необходимые для выборки текстуры фактически.

Независимо от этих правил, бремя по-прежнему зависит от пользователя, чтобы убедиться, что перед вычислением любого градиента (или выполнения образца текстуры, который неявно вычисляет градиент), регистр, содержащий исходные данные, должен быть инициализирован для всех путей выполнения заранее. Инициализация временных регистров не проверяется или применяется в целом.

инструкции по шейдеру пикселей