Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Beskriver den inbyggda vågåtgärden i HLSL Shader Model 6.0.
Skuggningsmodell 6.0
För tidigare skuggningsmodeller exponerar HLSL-programmering endast en enda körningstråd. Nya åtgärder på vågnivå tillhandahålls, från och med modell 6.0, för att uttryckligen dra nytta av parallelliteten hos aktuella GPU:er – många trådar kan köras i låssteg på samma kärna samtidigt. Modell 6.0 gör det till exempel möjligt att eliminera barriärkonstruktioner när synkroniseringsomfånget ligger inom SIMD-processorns bredd eller någon annan uppsättning trådar som är kända för att vara atomiska i förhållande till varandra.
Potentiella användningsfall är: strömkomprimering, minskningar, blocktransponering, bitonic sort eller Fast Fourier Transforms (FFT), binning, stream de-duplication och liknande scenarier.
De flesta inbyggda objekt visas i pixelskuggare och beräkningsskuggor, även om det finns vissa undantag (antecknade för varje funktion). Funktionerna har lagts till i kraven för DirectX-funktionsnivå 12.0 under API-nivå 12.
Den <typen> parametern och returvärdet för dessa funktioner innebär typen av uttryck, de typer som stöds är de från följande lista som också finns i målskuggningsmodellen för din app:
- halv, halv2, halv3, halv4
- float, float2, float3, float4
- double, double2, double3, double4
- int, int2, int3, int4
- uint, uint2, uint3, uint4
- short, short2, short3, short4
- ushort, ushort2, ushort3, ushort4
- uint64_t, uint64_t2, uint64_t3, uint64_t4
Vissa åtgärder (till exempel bitvisoperatorer) stöder bara heltalstyperna.
Terminologi
Term | Definition |
---|---|
Körfält | En enda körningstråd. Skuggningsmodellerna före version 6.0 exponerar bara en av dessa på språknivå, vilket gör att expansionen till parallell SIMD-bearbetning helt och hållet är upp till implementeringen. |
Våg | En uppsättning körfält (trådar) körs samtidigt i processorn. Inga uttryckliga hinder krävs för att garantera att de körs parallellt. Liknande begrepp är "warp" och "wavefront". |
Inaktivt körfält | Ett körfält som inte körs, till exempel på grund av kontrollflödet, eller otillräckligt arbete för att fylla vågens minsta storlek. |
Active Lane | Ett körfält för vilket körningen utförs. I pixelskuggare kan det innehålla eventuella pixelfält för hjälpen. |
Quad | En uppsättning med 4 intilliggande körfält som motsvarar bildpunkter ordnade på en 2x2 kvadrat. De används för att uppskatta toningar genom differentiering i antingen x eller y. En våg kan bestå av flera fyrhjulingar. Alla bildpunkter i en aktiv quad körs (och kan vara "Active Lanes"), men de som inte ger synliga resultat kallas "Helper Lanes". |
Hjälpfil | Ett körfält som körs enbart för toningar i pixelskuggningskvadlar. Utdata från ett sådant körfält tas bort och återges därför inte till målytan. |
Inbyggda skuggningsspråk
Alla åtgärder i den här skuggningsmodellen har lagts till i en rad inbyggda funktioner.
Vågfråga
De inbyggda funktionerna för att köra frågor mot en enda våg.
inbyggda | Beskrivning | Pixel shader | Compute Shader |
---|---|---|---|
WaveGetLaneCount | Returnerar antalet körfält i den aktuella vågen. | * | * |
WaveGetLaneIndex | Returnerar indexet för det aktuella körfältet i den aktuella vågen. | * | * |
WaveIsFirstLane | Returnerar endast sant för det aktiva körfältet i den aktuella vågen med det minsta indexet | * | * |
Vågröstning
Den här uppsättningen inbyggda värden jämför värden mellan trådar som för närvarande är aktiva från den aktuella vågen.
inbyggda | Beskrivning | Pixel shader | Compute Shader |
---|---|---|---|
WaveActiveAnyTrue | Returnerar sant om uttrycket är sant i ett aktivt körfält i den aktuella vågen. | * | * |
WaveActiveAllTrue | Returnerar sant om uttrycket är sant i alla aktiva körfält i den aktuella vågen. | * | * |
WaveActiveBallot | Returnerar en 64-bitars osignerad heltalsbitmask av utvärderingen av det booleska uttrycket för alla aktiva banor i den angivna vågen. | * | * |
Wave Broadcast
Dessa inbyggda gör det möjligt för alla aktiva körfält i den aktuella vågen att ta emot värdet från det angivna körfältet, vilket effektivt sänder det. Returvärdet från ett ogiltigt körfält är odefinierat.
inbyggda | Beskrivning | Pixel shader | Compute Shader |
---|---|---|---|
WaveReadLaneAt | Returnerar värdet för uttrycket för det angivna filindexet inom den angivna vågen. | * | * |
WaveReadLaneFirst | Returnerar värdet för uttrycket för det aktiva körfältet för den aktuella vågen med det minsta indexet. | * | * |
Vågreduktion
Dessa inbyggda faktorer beräknar den angivna åtgärden över alla aktiva körfält i vågen och sänder slutresultatet till alla aktiva körfält. Därför garanteras de slutliga utdata som är enhetliga över vågen.
inbyggda | Beskrivning | Pixel shader | Compute Shader |
---|---|---|---|
WaveActiveAllEqual | Returnerar sant om uttrycket är detsamma för varje aktivt körfält i den aktuella vågen (och därmed enhetligt över den). | * | * |
WaveActiveBitAnd | Returnerar bitvis OCH för alla värden i uttrycket över alla aktiva körfält i den aktuella vågen och replikerar resultatet till alla banor i vågen. | * | * |
WaveActiveBitOr | Returnerar bitvis ELLER för alla värden i uttrycket över alla aktiva körfält i den aktuella vågen och replikerar resultatet till alla körfält i vågen. | * | * |
WaveActiveBitXor | Returnerar bitvis exklusivt ELLER för alla värden i uttrycket över alla aktiva körfält i den aktuella vågen och replikerar resultatet till alla körfält i vågen. | * | * |
WaveActiveCountBits | Räknar antalet booleska variabler som utvärderas till sant över alla aktiva körfält i den aktuella vågen och replikerar resultatet till alla körfält i vågen. | * | * |
WaveActiveMax | Beräknar det maximala värdet för uttrycket över alla aktiva körfält i den aktuella vågen och replikerar resultatet till alla körfält i vågen. | * | * |
WaveActiveMin | Beräknar det minsta värdet för uttrycket över alla aktiva körfält i den aktuella vågen och replikerar resultatet till alla banor i vågen. | * | * |
WaveActiveProduct | Multiplicerar uttryckets värden tillsammans över alla aktiva körfält i den aktuella vågen och replikerar resultatet till alla banor i vågen. | * | * |
WaveActiveSum | Summerar uttryckets värde över alla aktiva körfält i den aktuella vågen och replikerar det till alla körfält i den aktuella vågen och replikerar resultatet till alla körfält i vågen. | * | * |
Våggenomsökning och prefix
Dessa inbyggda egenskaper tillämpar åtgärden på varje körfält och lämnar varje partiellt resultat av beräkningen i motsvarande körfält.
inbyggda | Beskrivning | Pixel shader | Compute Shader |
---|---|---|---|
WavePrefixCountBits | Returnerar summan av alla angivna booleska variabler som angetts till true för alla aktiva körfält med index som är mindre än det aktuella körfältet. | * | * |
WavePrefixSum | Returnerar summan av alla värden i de aktiva körfälten med mindre index än den här. | * | * |
WavePrefixProduct | Returnerar produkten av alla värden i körfälten före den angivna vågen. | * | * |
Quad-wide Shuffle-åtgärder
Dessa inbyggda funktioner utför växlingsåtgärder på värdena över en våg som är känd för att innehålla pixelskuggningskvadlar enligt definitionen här. Indexen för bildpunkterna i quad definieras i genomsökningsraden eller läsordningen – där koordinaterna inom en quad är:
+---------> X
| [0] [1]
| [2] [3]
v
Y
Dessa rutiner fungerar antingen i beräkningsskuggare eller pixelskuggare. I beräkningsskuggor fungerar de i quads som definieras som jämnt fördelade grupper på 4 i en SIMD-våg. I pixelskuggor bör de användas på vågor som fångas av WaveQuadLanes, annars är resultaten odefinierade.
inbyggda | Beskrivning | Pixel shader | Compute Shader |
---|---|---|---|
QuadReadLaneAt | Returnerar det angivna källvärdet som lästs från körfältet för den aktuella fyrhjulingen som identifieras av quadLaneID [0..3] som måste vara enhetligt över fyrhjulingen. | * | |
QuadReadAcrossDiagonal | Returnerar det angivna lokala värdet som läss från det diagonalt motsatta körfältet i den här fyrhjulingen. | * | |
QuadReadAcrossX | Returnerar det angivna källvärdet som lästs från det andra körfältet i den här fyrhjulingen i X-riktningen. | * | |
QuadReadAcrossY | Returnerar det angivna källvärdet som lästs från det andra körfältet i den här fyrhjulingen i Y-riktningen. | * |
Maskinvarukapacitet
För att kontrollera att vågåtgärdsfunktionerna är tillgängliga på någon specifik maskinvara anropar du ID3D12Enhet::CheckFeatureSupportoch anger beskrivningen och användningen av D3D12_FEATURE_DATA_D3D12_OPTIONS1 struktur.