Limitazioni del controllo di flusso
Le istruzioni di controllo del flusso dello shader pixel hanno limiti che influiscono sul numero di livelli di annidamento che possono essere inclusi nelle istruzioni. Esistono inoltre alcune limitazioni per l'implementazione del controllo del flusso per pixel con istruzioni sulla sfumatura.
Nota
Quando si usano i profili shader *_4_0_level_9_x HLSL, si usano in modo implicito i profili shader Model 2.x per supportare l'hardware compatibile con Direct3D 9. I profili del modello di shader 2.x supportano un comportamento di controllo del flusso più limitato rispetto ai profili Modello shader 4. x 4.x e versioni successive.
- pixel shader Depth Counts
- 'interazione del controllo del flusso di Per-Pixel con sfumature dello schermo
Pixel Shader Instruction Depth Counts
ps_2_0 non supporta il controllo del flusso. Di seguito sono elencate le limitazioni per le altre versioni del pixel shader.
Conteggio profondità istruzioni per ps_2_x
Ogni istruzione viene conteggiato rispetto a uno o più limiti di profondità annidamento. La tabella seguente elenca il numero di profondità che ogni istruzione aggiunge o sottrae dalla profondità esistente.
Istruzione | Annidamento statico | Annidamento dinamico | annidamento di cicli/rep | annidamento delle chiamate |
---|---|---|---|---|
se bool - ps | 1 | 0 | 0 | 0 |
if_comp - ps | 0 | 1 | 0 | 0 |
se pred - ps | 0 | 1 | 0 | 0 |
else - ps | 0 | 0 | 0 | 0 |
endif - ps | -1(se bool - ps) | -1(se pred - ps o 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 |
chiamata - 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 |
Profondità annidamento
La profondità di annidamento definisce il numero di istruzioni che è possibile chiamare tra loro. Ogni tipo di istruzione presenta uno o più limiti di annidamento, come indicato nella tabella seguente.
Tipo di istruzione | Massimo |
---|---|
Annidamento statico | 24 se (D3DCAPS9. D3DPSHADERCAPS2_0.StaticFlowControlDepth > 0); 0 in caso contrario |
Annidamento dinamico | Da 0 a 24, vedere D3DCAPS9. D3DPSHADERCAPS2_0.DynamicFlowControlDepth |
annidamento rep | Da 0 a 4, vedere D3DCAPS9. D3DPSHADERCAPS2_0.StaticFlowControlDepth |
annidamento delle chiamate | Da 0 a 4, vedere D3DCAPS9. D3DPSHADERCAPS2_0.StaticFlowControlDepth (indipendente dal limite di rep) |
Conteggio profondità istruzioni per ps_2_sw
Ogni istruzione viene conteggiato rispetto a uno o più limiti di profondità annidamento. Questa tabella mostra il numero di profondità che ogni istruzione aggiunge o sottrae dalla profondità esistente.
Istruzione | Annidamento statico | Annidamento dinamico | annidamento di cicli/rep | annidamento delle chiamate |
---|---|---|---|---|
se bool - ps | 1 | 0 | 0 | 0 |
se pred - ps | 0 | 1 | 0 | 0 |
if_comp - ps | 0 | 1 | 0 | 0 |
else - ps | 0 | 0 | 0 | 0 |
endif - ps | -1(se bool - ps) | -1(se pred - ps o if_comp - ps) | 0 | 0 |
rep - ps | 0 | 0 | 1 | 0 |
endrep - ps | 0 | 0 | -1 | 0 |
ciclo - ps | n/a | n/a | n/a | n/a |
endloop - ps | n/a | n/a | n/a | n/a |
break - ps | 0 | 0 | 0 | 0 |
break_comp - ps | 0 | 1, -1 | 0 | 0 |
breakp - ps | 0 | 0 | 0 | 0 |
chiamata - 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 |
Profondità annidamento
La profondità di annidamento definisce il numero di istruzioni che possono essere chiamate tra loro. Ogni tipo di istruzione presenta uno o più limiti di annidamento, come indicato nella tabella seguente.
Tipo di istruzione | Massimo |
---|---|
Annidamento statico | 24 |
Annidamento dinamico | 24 |
annidamento rep | 4 |
annidamento delle chiamate | 4 |
Conteggio profondità istruzioni per ps_3_0
Ogni istruzione viene conteggiato rispetto a uno o più limiti di profondità annidamento. Questa tabella mostra il numero di profondità che ogni istruzione aggiunge o sottrae dalla profondità esistente.
Istruzione | Annidamento statico | Annidamento dinamico | annidamento di cicli/rep | annidamento delle chiamate |
---|---|---|---|---|
se bool - ps | 1 | 0 | 0 | 0 |
se pred - ps | 0 | 1 | 0 | 0 |
if_comp - ps | 0 | 1 | 0 | 0 |
else - ps | 0 | 0 | 0 | 0 |
endif - ps | -1(se bool - ps) | -1(se pred - ps o if_comp - ps) | 0 | 0 |
rep - ps | 0 | 0 | 1 | 0 |
endrep - ps | 0 | 0 | -1 | 0 |
ciclo - 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 |
chiamata - 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 |
Profondità annidamento
La profondità di annidamento definisce il numero di istruzioni che possono essere chiamate tra loro. Ogni tipo di istruzione presenta uno o più limiti di annidamento, come indicato nella tabella seguente.
Tipo di istruzione | Massimo |
---|---|
Annidamento statico | 24 |
Annidamento dinamico | 24 |
annidamento di cicli/rep | 4 |
annidamento delle chiamate | 4 |
Conteggio profondità istruzioni per ps_3_sw
Ogni istruzione viene conteggiato rispetto a uno o più limiti di profondità annidamento. Questa tabella mostra il numero di profondità che ogni istruzione aggiunge o sottrae dalla profondità esistente.
Istruzione | Annidamento statico | Annidamento dinamico | annidamento di cicli/rep | annidamento delle chiamate |
---|---|---|---|---|
se bool - ps | 1 | 0 | 0 | 0 |
se pred - ps | 0 | 1 | 0 | 0 |
if_comp - ps | 0 | 1 | 0 | 0 |
else - ps | 0 | 0 | 0 | 0 |
endif - ps | -1(se bool - ps) | -1(se pred - ps o if_comp - ps) | 0 | 0 |
rep - ps | 0 | 0 | 1 | 0 |
endrep - ps | 0 | 0 | -1 | 0 |
ciclo - 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 |
chiamata - 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 |
Profondità annidamento
La profondità di annidamento definisce il numero di istruzioni che possono essere chiamate tra loro. Ogni tipo di istruzione presenta uno o più limiti di annidamento, come indicato nella tabella seguente.
Tipo di istruzione | Massimo |
---|---|
Annidamento statico | 24 |
Annidamento dinamico | 24 |
annidamento di cicli/rep | 4 |
annidamento delle chiamate | 4 |
Interazione del controllo del flusso di Per-Pixel con sfumature dello schermo
Il set di istruzioni pixel shader include diverse istruzioni che producono o usano sfumature di quantità rispetto allo spazio dello schermo x e y. L'uso più comune per le sfumature consiste nel calcolare calcoli di livello di dettaglio per il campionamento delle trame e, nel caso del filtro anisotropico, selezionando campioni lungo l'asse dell'anisotropia. In genere, le implementazioni hardware eseguono il pixel shader su più pixel simultaneamente (ad esempio una griglia 2x2), in modo che le sfumature di quantità calcolate nello shader possano essere ragionevolmente approssimative come delta dei valori allo stesso punto di esecuzione in pixel adiacenti.
Quando il controllo del flusso è presente in uno shader, il risultato di un calcolo sfumato richiesto all'interno di un determinato percorso di ramo è ambiguo quando i pixel adiacenti possono eseguire percorsi di controllo del flusso separati. Pertanto, è considerato illegale usare qualsiasi operazione di pixel shader che richiede un calcolo sfumato in una posizione che si trova all'interno di un costrutto di controllo del flusso che può variare tra i pixel per una determinata primitiva da rasterizzare.
Tutte le istruzioni del pixel shader vengono partizionate in tali operazioni consentite e in quelle non consentite all'interno del controllo del flusso:
Scenario A: operazioni non consentite all'interno del controllo del flusso che possono variare in base ai pixel di una primitiva. Queste includono le operazioni elencate nella tabella seguente.
Istruzione È consentito nel controllo del flusso quando: texld - ps_2_0 e up, texldb - ps e texldp - ps Per la coordinata della trama viene usato un registro temporaneo. dsx - ps e dsy - ps Per l'operando viene utilizzato un registro temporaneo. Scenario B: operazioni consentite ovunque. Queste includono le operazioni elencate nella tabella seguente.
Istruzione È consentito ovunque: texld - ps_2_0 e up, texldb - ps e texldp - ps Una quantità di sola lettura viene usata per la coordinata della trama (può variare per pixel, ad esempio coordinate di trama interpolate). dsx - ps e dsy - ps Viene usata una quantità di sola lettura per l'operando di input (può variare per pixel, ad esempio coordinate di trama interpolate). texldl - ps L'utente fornisce un livello di dettaglio come argomento, quindi non ci sono sfumature e quindi nessun problema con il controllo del flusso. texldd - ps L'utente fornisce sfumature come argomenti di input, quindi non esiste alcun problema con il controllo del flusso.
Queste restrizioni vengono applicate rigorosamente nella convalida dello shader. Gli scenari con una condizione di ramo simile a questa si diramano in modo coerente in una primitiva, anche se un operando nell'espressione della condizione è una quantità calcolata da pixel shader, tuttavia non rientrano nello scenario A e non sono consentiti. Analogamente, gli scenari in cui vengono richieste sfumature su una quantità calcolata di shader x dall'interno del controllo del flusso dinamico, ma in cui sembra che x non venga modificato in nessuno dei rami, tuttavia rientrano nello scenario A e non sono consentiti.
Il predicato è incluso in queste restrizioni sul controllo del flusso, in modo che le implementazioni rimangano libere di interscambiare facilmente l'implementazione delle istruzioni di ramo con istruzioni predicate.
L'utente può usare le istruzioni degli scenari A e B insieme. Si supponga, ad esempio, che l'utente abbia bisogno di un campione di trama anisotropica in base a una coordinata di trama calcolata dello shader; Tuttavia, il caricamento della trama è necessario solo per i pixel che soddisfano alcune condizioni per pixel. Per soddisfare questi requisiti, l'utente può calcolare la coordinata della trama per tutti i pixel, al di fuori del controllo del flusso variabile per pixel, calcolando immediatamente i gradienti usando dsx - ps e dsy - istruzioni ps. Quindi, all'interno di un per pixel se bool - ps/endif - ps blocco, l'utente può usare texldd - ps (caricamento trama con sfumature fornite dall'utente), passando le sfumature precalcolate. Un altro modo per descrivere questo modello di utilizzo è che, mentre tutti i pixel nella primitiva hanno dovuto calcolare le coordinate della trama ed essere coinvolti nel calcolo della sfumatura, solo i pixel necessari per campionare una trama in realtà lo hanno fatto.
Indipendentemente da queste regole, l'onere è ancora sull'utente per assicurarsi che prima di calcolare qualsiasi sfumatura (o di eseguire un campione di trama che calcola in modo implicito una sfumatura), il registro contenente i dati di origine deve essere stato inizializzato in anticipo per tutti i percorsi di esecuzione. L'inizializzazione dei registri temporanei non viene convalidata o applicata in generale.
Argomenti correlati
-
istruzioni pixel shader