Sdílet prostřednictvím


Omezení řízení toku

Pokyny pro řízení toku shaderu pixelu mají omezení ovlivňující počet úrovní vnoření, které lze zahrnout do pokynů. Kromě toho existují určitá omezení pro implementaci řízení toku na pixel s pokyny pro přechod.

Poznámka

Pokud používáte profily shaderu *_4_0_level_9_x HLSL, implicitně používáte profily Shader Model 2.x pro podporu hardwaru podporujícího Direct3D 9. Profily Shader Model 2.x podporují omezenější chování řízení toku než profily Shader Model 4.x a novější.

 

Pixel Shader instrukční hloubky počty

ps_2_0 nepodporuje řízení toku. Omezení ostatních verzí shaderu pixelů jsou uvedená níže.

Počet hloubky instrukcí pro ps_2_x

Každá instrukce počítá do jednoho nebo více limitů hloubky vnoření. Následující tabulka uvádí počet podrobností, které jednotlivé instrukce přičtou nebo odečtou od stávající hloubky.

Instrukce Statické vnoření Dynamické vnoření smyčka nebo opakování vnoření volání vnoření
pokud bool - ps 1 0 0 0
if_comp – ps 0 1 0 0
, pokud je pred - ps 0 1 0 0
else – ps 0 0 0 0
endif – ps -1(pokud bool - ps) -1(, pokud je předd - ps nebo if_comp - ps) 0 0
rep - ps 0 0 1 0
endrep – ps 0 0 -1 0
break - ps 0 0 0 0
break_comp – ps 0 1, -1 0 0
breakp – ps 0 0 0 0
hovor – ps 0 0 0 1
callnz bool - ps 0 0 0 1
pred callnz - ps 0 1 0 1
ret – ps 0 -1(pred callnz - ps) 0 -1
setp_comp – ps 0 0 0 0

 

Hloubka vnoření

Hloubka vnoření definuje počet instrukcí, které lze volat mezi sebou. Každý typ instrukce má jedno nebo více limitů vnoření, jak je uvedeno v následující tabulce.

Typ instrukce Maximum
Statické vnoření 24 if (D3DCAPS9. D3DPSHADERCAPS2_0.StaticFlowControlDepth > 0); 0 jinak
Dynamické vnoření 0 až 24, viz D3DCAPS9. D3DPSHADERCAPS2_0.DynamicFlowControlDepth
rep vnořování 0 až 4, viz D3DCAPS9. D3DPSHADERCAPS2_0.StaticFlowControlDepth
volání vnoření 0 až 4, viz D3DCAPS9. D3DPSHADERCAPS2_0.StaticFlowControlDepth (nezávisle na limitu opakování)

 

Počet hloubky instrukcí pro ps_2_sw

Každá instrukce počítá do jednoho nebo více limitů hloubky vnoření. Tato tabulka ukazuje počet podrobností, které jednotlivé instrukce přičtou nebo odečtou od stávající hloubky.

Instrukce Statické vnoření Dynamické vnoření smyčka nebo opakování vnoření volání vnoření
pokud bool - ps 1 0 0 0
, pokud je pred - ps 0 1 0 0
if_comp – ps 0 1 0 0
else – ps 0 0 0 0
endif – ps -1(pokud bool - ps) -1(, pokud je předd - ps nebo if_comp - ps) 0 0
rep - ps 0 0 1 0
endrep – ps 0 0 -1 0
smyčka – ps není k dispozici není k dispozici není k dispozici není k dispozici
endloop – ps není k dispozici není k dispozici není k dispozici není k dispozici
break - ps 0 0 0 0
break_comp – ps 0 1, -1 0 0
breakp – ps 0 0 0 0
hovor – ps 0 0 0 1
callnz bool - ps 0 0 0 1
pred callnz - ps 0 1 0 1
ret – ps 0 -1(pred callnz - ps) 0 -1
setp_comp – ps 0 0 0 0

 

Hloubka vnoření

Hloubka vnoření definuje počet instrukcí, které lze volat mezi sebou. Každý typ instrukce má jedno nebo více limitů vnoření, jak je uvedeno v následující tabulce.

Typ instrukce Maximum
Statické vnoření 24
Dynamické vnoření 24
rep vnořování 4
volání vnoření 4

 

Počet hloubky instrukcí pro ps_3_0

Každá instrukce počítá do jednoho nebo více limitů hloubky vnoření. Tato tabulka ukazuje počet podrobností, které jednotlivé instrukce přičtou nebo odečtou od stávající hloubky.

Instrukce Statické vnoření Dynamické vnoření smyčka nebo opakování vnoření volání vnoření
pokud bool - ps 1 0 0 0
, pokud je pred - ps 0 1 0 0
if_comp – ps 0 1 0 0
else – ps 0 0 0 0
endif – ps -1(pokud bool - ps) -1(, pokud je předd - ps nebo if_comp - ps) 0 0
rep - ps 0 0 1 0
endrep – ps 0 0 -1 0
smyčka – ps 0 0 1 0
endloop – ps 0 0 -1 0
break - ps 0 0 0 0
break_comp – ps 0 1, -1 0 0
breakp – ps 0 0 0 0
hovor – ps 0 0 0 1
callnz bool - ps 0 0 0 1
pred callnz - ps 0 1 0 1
ret – ps 0 -1(pred callnz - ps) 0 -1
setp_comp – ps 0 0 0 0

 

Hloubka vnoření

Hloubka vnoření definuje počet instrukcí, které lze volat mezi sebou. Každý typ instrukce má jedno nebo více limitů vnoření, jak je uvedeno v následující tabulce.

Typ instrukce Maximum
Statické vnoření 24
Dynamické vnoření 24
smyčka nebo opakování vnoření 4
volání vnoření 4

 

Počet hloubky instrukcí pro ps_3_sw

Každá instrukce počítá do jednoho nebo více limitů hloubky vnoření. Tato tabulka ukazuje počet podrobností, které jednotlivé instrukce přičtou nebo odečtou od stávající hloubky.

Instrukce Statické vnoření Dynamické vnoření smyčka nebo opakování vnoření volání vnoření
pokud bool - ps 1 0 0 0
, pokud je pred - ps 0 1 0 0
if_comp – ps 0 1 0 0
else – ps 0 0 0 0
endif – ps -1(pokud bool - ps) -1(, pokud je předd - ps nebo if_comp - ps) 0 0
rep - ps 0 0 1 0
endrep – ps 0 0 -1 0
smyčka – ps 0 0 1 0
endloop – ps 0 0 -1 0
break - ps 0 0 0 0
break_comp – ps 0 1, -1 0 0
breakp – ps 0 0 0 0
hovor – ps 0 0 0 1
callnz bool - ps 0 0 0 1
pred callnz - ps 0 1 0 1
ret – ps 0 -1(pred callnz - ps) 0 -1
setp_comp – ps 0 0 0 0

 

Hloubka vnoření

Hloubka vnoření definuje počet instrukcí, které lze volat mezi sebou. Každý typ instrukce má jedno nebo více limitů vnoření, jak je uvedeno v následující tabulce.

Typ instrukce Maximum
Statické vnoření 24
Dynamické vnoření 24
smyčka nebo opakování vnoření 4
volání vnoření 4

 

Interakce řízení toku Per-Pixel s přechody obrazovky

Instrukční sada shaderu pixelů obsahuje několik instrukcí, které produkují nebo používají přechody množství s ohledem na prostor obrazovky x a y. Nejběžnějším použitím přechodů je výpočet podrobných výpočtů pro vzorkování textury a v případě anisotropního filtrování výběr vzorků podél osy anisotropie. Hardwarové implementace obvykle spouští shader pixelů na více pixelech současně (například mřížku 2x2), aby přechody množství vypočítané ve shaderu mohly být přiměřeně přibližné jako rozdíly hodnot v sousedních pixelech.

Pokud se řízení toku nachází ve shaderu, výsledek výpočtu přechodu požadovaného uvnitř dané cesty větve je nejednoznačný, když sousední pixely mohou spouštět samostatné cesty řízení toku. Proto je považováno za nezákonné použít jakoukoli operaci shaderu pixelů, která požaduje přechodový výpočet na místě, které je uvnitř konstruktoru řízení toku, který se může lišit v pixelech pro danou primitivní rasterizaci.

Všechny instrukce shaderu pixelů jsou rozděleny do operací, které jsou povoleny a do těch, které nejsou povoleny uvnitř řízení toku:

  • Scénář A: Operace, které nejsou povoleny uvnitř řízení toku, které by se mohly lišit v pixelech v primitivu. Patří sem operace uvedené v následující tabulce.

    Instrukce Je povolen v řízení toku v případech, kdy:
    texld - ps_2_0 a, texldb - ps a texldp - ps Dočasný registr se používá pro souřadnici textury.
    dsx - ps a dsy - ps Pro operand se používá dočasný registr.

     

  • Scénář B: Operace, které jsou povoleny kdekoli Patří sem operace uvedené v následující tabulce.

    Instrukce Je povolený kdekoli, když:
    texld - ps_2_0 a, texldb - ps a texldp - ps Množství jen pro čtení se používá pro souřadnici textury (může se lišit podle pixelů, například interpolované souřadnice textury).
    dsx - ps a dsy - ps Pro vstupní operand se používá množství jen pro čtení (může se lišit podle pixelů, například interpolované souřadnice textury).
    texldl - ps Uživatel poskytuje jako argument úroveň podrobností, takže neexistují žádné přechody, a proto žádný problém s řízením toku.
    texldd – ps Uživatel poskytuje přechody jako vstupní argumenty, takže neexistuje žádný problém s řízením toku.

     

Tato omezení se vynucují výhradně při ověřování shaderu. Scénáře s podmínkou větve, která vypadá, že by se konzistentně rozvětvovala napříč primitivním, i když operand ve výrazu podmínky je množství vypočítané v pixelech, přesto stále spadají do scénáře A a nejsou povoleny. Podobně scénáře, ve kterých jsou přechody požadovány u některého shaderu vypočítaného množství x uvnitř dynamického řízení toku, ale tam, kde se zdá, že x není upraveno v žádné z větví, přesto stále spadají do scénáře A a nejsou povoleny.

Predikace je zahrnuta v těchto omezeních řízení toku, takže implementace zůstávají zdarma triviálně zaměňovat implementaci instrukcí větví s predikovanými instrukcemi.

Uživatel může používat pokyny ze scénářů A a B společně. Předpokládejme například, že uživatel potřebuje anisotropní texturový vzorek vzhledem ke souřadnici textury vypočítané shaderem; Zatížení textury je však nutné pouze pro pixely, které vyhovují určité podmínce na pixel. Aby mohl uživatel tyto požadavky splnit, může vypočítat souřadnici textury pro všechny pixely, mimo řízení toku na pixely, okamžitě výpočetní přechody pomocí dsx - ps a dsy - ps pokyny. Pak v rámci na pixel, pokud bool - ps/endif - ps blok, může uživatel použít texldd - ps (zatížení textury s přechody poskytnuté uživatelem) a předat předpočíané přechody. Dalším způsobem, jak tento vzor použití popsat, je, že zatímco všechny pixely v primitivu musely vypočítat souřadnice textury a být zapojeny do výpočtu přechodu, pouze pixely, které potřebovaly k vzorkování textury skutečně udělaly.

Bez ohledu na tato pravidla je zátěž stále na uživateli, aby se zajistilo, že před výpočtem jakéhokoli přechodu (nebo provedením vzorku textury, který implicitně vypočítá přechod), musí být registr obsahující zdrojová data inicializován pro všechny cesty provádění předem. Inicializace dočasných registrů se obecně neověřuje ani nevynucuje.

Pokyny shaderu pixelů