Beperkingen voor stroombeheer
Instructies voor pixel-shaderstroom hebben limieten die van invloed zijn op het aantal nestniveaus dat in de instructies kan worden opgenomen. Daarnaast zijn er enkele beperkingen voor het implementeren van stroombeheer per pixel met kleurovergangsinstructies.
Notitie
Wanneer u de *_4_0_level_9_x HLSL-arceringsprofielen gebruikt, gebruikt u impliciet het Shader Model 2.x-profielen ter ondersteuning van hardware die geschikt is voor Direct3D 9. Shader Model 2.x-profielen ondersteunen beperkter gedrag van stroombeheer dan de profielen Shader Model 4.x en hoger.
Aantal pixel-shader-instructies
ps_2_0 biedt geen ondersteuning voor stroombeheer. De beperkingen voor de andere pixel-shader-versies worden hieronder vermeld.
Aantal instructies voor ps_2_x
Elke instructie telt mee tegen een of meer dieptelimieten voor nesten. De volgende tabel bevat het diepteaantal dat elke instructie toevoegt aan of afgetrokken van de bestaande diepte.
Instructie | Statische nesting | Dynamisch nesten | lus/rep nesten | nesten aanroepen |
---|---|---|---|---|
als bool - ps | 1 | 0 | 0 | 0 |
if_comp - ps | 0 | 1 | 0 | 0 |
indien pred - ps | 0 | 1 | 0 | 0 |
else - ps | 0 | 0 | 0 | 0 |
endif - ps | -1(if bool - ps) | -1(indien pred - ps of 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 |
gesprek - 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 |
Diepte nesten
De diepte van nesten definieert het aantal instructies dat vanuit elkaar kan worden aangeroepen. Elk type instructie heeft een of meer nestlimieten, zoals aangegeven in de volgende tabel.
Instructietype | Maximum |
---|---|
Statische nesting | 24 indien (D3DCAPS9. D3DPSHADERCAPS2_0.StaticFlowControlDepth > 0); Anders 0 |
Dynamisch nesten | 0 tot 24, zie D3DCAPS9. D3DPSHADERCAPS2_0.DynamicFlowControlDepth |
rep nesten | 0 tot 4, zie D3DCAPS9. D3DPSHADERCAPS2_0.StaticFlowControlDepth |
nesten aanroepen | 0 tot 4, zie D3DCAPS9. D3DPSHADERCAPS2_0.StaticFlowControlDepth (onafhankelijk van de limiet voor rep) |
Aantal instructies voor ps_2_sw
Elke instructie telt mee tegen een of meer dieptelimieten voor nesten. In deze tabel ziet u het diepteaantal dat door elke instructie wordt toegevoegd aan of afgetrokken van de bestaande diepte.
Instructie | Statische nesting | Dynamisch nesten | lus/rep nesten | nesten aanroepen |
---|---|---|---|---|
als bool - ps | 1 | 0 | 0 | 0 |
indien pred - 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(indien pred - ps of if_comp - ps) | 0 | 0 |
rep - ps | 0 | 0 | 1 | 0 |
endrep - ps | 0 | 0 | -1 | 0 |
lus - ps | n.v.t | n.v.t | n.v.t | n.v.t |
endloop - ps | n.v.t | n.v.t | n.v.t | n.v.t |
break - ps | 0 | 0 | 0 | 0 |
break_comp - ps | 0 | 1, -1 | 0 | 0 |
breakp - ps | 0 | 0 | 0 | 0 |
gesprek - 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 |
Diepte nesten
De diepte van nesten definieert het aantal instructies dat vanuit elkaar kan worden aangeroepen. Elk type instructie heeft een of meer nestlimieten, zoals aangegeven in de volgende tabel.
Instructietype | Maximum |
---|---|
Statische nesting | 24 |
Dynamisch nesten | 24 |
rep nesten | 4 |
nesten aanroepen | 4 |
Aantal instructies voor ps_3_0
Elke instructie telt mee tegen een of meer dieptelimieten voor nesten. In deze tabel ziet u het diepteaantal dat door elke instructie wordt toegevoegd aan of afgetrokken van de bestaande diepte.
Instructie | Statische nesting | Dynamisch nesten | lus/rep nesten | nesten aanroepen |
---|---|---|---|---|
als bool - ps | 1 | 0 | 0 | 0 |
indien pred - 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(indien pred - ps of if_comp - ps) | 0 | 0 |
rep - ps | 0 | 0 | 1 | 0 |
endrep - ps | 0 | 0 | -1 | 0 |
lus - 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 |
gesprek - 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 |
Diepte nesten
De diepte van nesten definieert het aantal instructies dat vanuit elkaar kan worden aangeroepen. Elk type instructie heeft een of meer nestlimieten, zoals aangegeven in de volgende tabel.
Instructietype | Maximum |
---|---|
Statische nesting | 24 |
Dynamisch nesten | 24 |
lus/rep nesten | 4 |
nesten aanroepen | 4 |
Aantal instructies voor ps_3_sw
Elke instructie telt mee tegen een of meer dieptelimieten voor nesten. In deze tabel ziet u het diepteaantal dat door elke instructie wordt toegevoegd aan of afgetrokken van de bestaande diepte.
Instructie | Statische nesting | Dynamisch nesten | lus/rep nesten | nesten aanroepen |
---|---|---|---|---|
als bool - ps | 1 | 0 | 0 | 0 |
indien pred - 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(indien pred - ps of if_comp - ps) | 0 | 0 |
rep - ps | 0 | 0 | 1 | 0 |
endrep - ps | 0 | 0 | -1 | 0 |
lus - 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 |
gesprek - 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 |
Diepte nesten
De diepte van nesten definieert het aantal instructies dat vanuit elkaar kan worden aangeroepen. Elk type instructie heeft een of meer nestlimieten, zoals aangegeven in de volgende tabel.
Instructietype | Maximum |
---|---|
Statische nesting | 24 |
Dynamisch nesten | 24 |
lus/rep nesten | 4 |
nesten aanroepen | 4 |
Interactie van Per-Pixel stroombesturing met schermovergangen
De instructieset pixel-shader bevat verschillende instructies die kleurovergangen van hoeveelheden produceren of gebruiken met betrekking tot schermruimte x en y. Het meest voorkomende gebruik voor kleurovergangen is het berekenen van detailberekeningen op het niveau van detail voor patronenampling, en in het geval van anisotropische filtering, het selecteren van monsters langs de as van anisotropie. Hardware-implementaties voeren de pixel-shader doorgaans tegelijkertijd uit op meerdere pixels (zoals een 2x2-raster), zodat kleurovergangen van hoeveelheden die in de shader worden berekend, redelijk worden geschat als verschillen van de waarden op hetzelfde uitvoeringspunt in aangrenzende pixels.
Wanneer stroombeheer aanwezig is in een shader, is het resultaat van een aangevraagde kleurovergangsberekening binnen een bepaald vertakkingspad niet eenduidig wanneer aangrenzende pixels afzonderlijke stroombeheerpaden kunnen uitvoeren. Daarom wordt het beschouwd als illegaal om een pixel-shader-bewerking te gebruiken die een kleurovergangsberekening aanvraagt op een locatie die zich in een stroombeheerconstructie bevindt die kan variëren tussen pixels voor een bepaalde primitieve die wordt gerasterd.
Alle instructies voor pixel-shader worden gepartitioneerd in bewerkingen die zijn toegestaan en in bewerkingen die niet zijn toegestaan binnen het stroombeheer:
Scenario A: Bewerkingen die niet zijn toegestaan binnen stroombeheer die kunnen variëren tussen de pixels in een primitieve. Dit zijn de bewerkingen die worden vermeld in de volgende tabel.
Instructie Is toegestaan in stroombeheer wanneer: texld - ps_2_0 en omhoog, texldb - ps en texldp - ps Er wordt een tijdelijk register gebruikt voor de patrooncoördinaat. dsx - ps en dsy - ps Er wordt een tijdelijk register gebruikt voor de operand. Scenario B: Bewerkingen die overal zijn toegestaan. Dit zijn de bewerkingen die worden vermeld in de volgende tabel.
Instructie Is overal toegestaan wanneer: texld - ps_2_0 en omhoog, texldb - ps en texldp - ps Er wordt een alleen-lezenhoeveelheid gebruikt voor de patrooncoördinaat (kan per pixel variëren, zoals geïnterpoleerde patrooncoördinaten). dsx - ps en dsy - ps Er wordt een alleen-lezenhoeveelheid gebruikt voor de invoeroperand (kan per pixel variëren, zoals geïnterpoleerde patrooncoördinaten). texldl - ps De gebruiker biedt detailniveau als argument, dus er zijn geen kleurovergangen en dus geen probleem met stroombeheer. texldd - ps De gebruiker biedt kleurovergangen als invoerargumenten, dus er is geen probleem met stroombeheer.
Deze beperkingen worden strikt afgedwongen in shader-validatie. Scenario's met een vertakkingsvoorwaarde die er als volgt uitziet dat deze consistent zou vertakken in een primitieve, ook al is een operand in de voorwaardeexpressie een pixel-shader-berekende hoeveelheid, maar toch nog steeds in scenario A valt en niet is toegestaan. Op dezelfde manier worden scenario's waarbij kleurovergangen worden aangevraagd voor een aantal gearceerde hoeveelheid x vanuit dynamisch stroombeheer, maar waar het lijkt dat x niet wordt gewijzigd in een van de vertakkingen, toch nog steeds in scenario A vallen en niet zijn toegestaan.
Predicatie is opgenomen in deze beperkingen voor stroombeheer, zodat implementaties vrij blijven om de implementatie van vertakkingsinstructies met predicated instructies te vervangen.
De gebruiker kan instructies uit scenario's A en B samen gebruiken. Stel dat de gebruiker een anisotropisch patroonvoorbeeld nodig heeft op basis van een gearceerde patrooncoördinaat met arcering; de textuurbelasting is echter alleen nodig voor pixels die voldoen aan een bepaalde voorwaarde per pixel. Om aan deze vereisten te voldoen, kan de gebruiker de patrooncoördinaat berekenen voor alle pixels, buiten het wisselende stroombeheer per pixel, onmiddellijk kleurovergangen berekenen met behulp van dsx - ps en dsy - ps instructies. Vervolgens, binnen een per pixel als bool - ps/endif - ps blok, de gebruiker kan texldd - ps (textuurbelasting met door de gebruiker verstrekte kleurovergangen) gebruiken, waarbij de vooraf berekende kleurovergangen worden doorgegeven. Een andere manier om dit gebruikspatroon te beschrijven, is dat, terwijl alle pixels in de primitieven de patrooncoördinaten moest berekenen en betrokken moesten zijn bij het berekenen van kleurovergangen, alleen de pixels die nodig waren om een patroon te samplen.
Ongeacht deze regels is de last nog steeds van toepassing op de gebruiker om ervoor te zorgen dat vóór het berekenen van een kleurovergang (of het uitvoeren van een patroonvoorbeeld dat impliciet een kleurovergang berekent), het register met de brongegevens vooraf is geïnitialiseerd voor alle uitvoeringspaden. Initialisatie van tijdelijke registers wordt in het algemeen niet gevalideerd of afgedwongen.
Verwante onderwerpen
-
instructies voor pixel-shader