Udostępnij za pośrednictwem


Model cieniowania HLSL 6.0

Opisuje funkcje wewnętrzne operacji falowej dodane do modelu cieniowania HLSL 6.0.

Model cieniowania 6.0

W przypadku wcześniejszych modeli cieniowania programowanie HLSL uwidacznia tylko jeden wątek wykonywania. Dostępne są nowe operacje na poziomie fal, począwszy od modelu 6.0, aby jawnie wykorzystać równoległość bieżących procesorów GPU — wiele wątków może być wykonywanych w ramach blokady na tym samym rdzeniu jednocześnie. Na przykład model 6.0 funkcje wewnętrzne umożliwiają eliminację konstrukcji barierowych, gdy zakres synchronizacji mieści się w szerokości procesora SIMD lub jakiś inny zestaw wątków, które są znane jako niepodzielne względem siebie.

Potencjalne przypadki użycia obejmują: kompaktowanie strumienia, redukcje, transponowanie bloków, sortowanie bitowe lub przekształcenia Fast Fourier (FFT), kwantowanie, deduplikowanie strumienia i podobne scenariusze.

Większość funkcji wewnętrznych występuje w cieniowaniach pikseli i cieniowaniach obliczeniowych, chociaż istnieją pewne wyjątki (zanotowane dla każdej funkcji). Funkcje zostały dodane do wymagań dotyczących poziomu funkcji DirectX 12.0 w obszarze Poziom 12 interfejsu API.

Typ <> parametru i wartość zwracana dla tych funkcji oznacza typ wyrażenia, obsługiwane typy to te z poniższej listy, które są również obecne w docelowym modelu cieniowania dla aplikacji:

  • połowa, połowa2, połowa3, połowa4
  • 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

Niektóre operacje (takie jak operatory bitowe) obsługują tylko typy całkowite.

Terminologia

terminów definicji
Alejka Pojedynczy wątek wykonywania. Modele cieniowania przed wersją 6.0 uwidaczniają tylko jeden z nich na poziomie języka, pozostawiając rozszerzenie do równoległego przetwarzania SIMD w całości do implementacji.
Fala Zestaw pasów ruchu (wątków) wykonywanych jednocześnie w procesorze. Nie są wymagane żadne jawne bariery w celu zagwarantowania, że są wykonywane równolegle. Podobne pojęcia obejmują "warp" i "wavefront".
Nieaktywny pas ruchu Pas ruchu, który nie jest wykonywany, na przykład ze względu na przepływ sterowania lub niewystarczającą pracę, aby wypełnić minimalny rozmiar fali.
Aktywny pas ruchu Pas ruchu, dla którego jest wykonywane wykonywanie. W cieniowaniach pikseli może zawierać wszelkie pasy pikseli pomocnika.
Quad Zestaw 4 sąsiednich pasów odpowiadających pikselom rozmieszczonym w powierzchni 2x2 kwadratu. Są one używane do szacowania gradientów przez różnice w x lub y. Fala może składać się z wielu czworokątów. Wszystkie piksele w aktywnym czworokącie są wykonywane (i mogą być "Aktywne pasy ruchu"), ale te, które nie generują widocznych wyników, są określane jako "Pomocnik pasy ruchu".
Pas pomocy Pas pasa, który jest wykonywany wyłącznie w celu gradientów w czworokątach cieniowania pikseli. Dane wyjściowe takiego pasa zostaną odrzucone, a więc nie będą renderowane na powierzchni docelowej.

Funkcje wewnętrzne języka cieniowania

Wszystkie operacje tego modelu cieniowania zostały dodane w wielu funkcjach wewnętrznych.

Kwerenda falowa

Funkcje wewnętrzne służące do wykonywania zapytań o jedną falę.

wewnętrzna opis cieniowania pikseli cieniowania zasobów obliczeniowych
WaveGetLaneCount Zwraca liczbę pasów ruchu w bieżącej fali. * *
WaveGetLaneIndex Zwraca indeks bieżącego pasa ruchu w bieżącej fali. * *
WaveIsFirstLane Zwraca wartość true tylko dla aktywnego pasa ruchu w bieżącej fali z najmniejszym indeksem * *

Głosowanie falowe

Ten zestaw funkcji wewnętrznych porównuje wartości między wątkami aktualnie aktywnymi z bieżącej fali.

wewnętrzna opis cieniowania pikseli cieniowania zasobów obliczeniowych
WaveActiveAnyTrue Zwraca wartość true, jeśli wyrażenie ma wartość true w dowolnym aktywnym pasie ruchu w bieżącej fali. * *
WaveActiveAllTrue Zwraca wartość true, jeśli wyrażenie ma wartość true we wszystkich aktywnych pasach ruchu w bieżącej fali. * *
WaveActiveBallot Zwraca 64-bitową niepodpisaną maskę bitów całkowitą oceny wyrażenia logicznego dla wszystkich aktywnych pasów ruchu w określonej fali. * *

Emisja falowa

Te funkcje wewnętrzne umożliwiają wszystkie aktywne pasy ruchu w bieżącej fali, aby odbierać wartość z określonego pasa ruchu, skutecznie rozgłaszać go. Wartość zwracana z nieprawidłowego pasa ruchu jest niezdefiniowana.

wewnętrzna opis cieniowania pikseli cieniowania zasobów obliczeniowych
WaveReadLaneAt Zwraca wartość wyrażenia dla danego indeksu pasa ruchu w określonej fali. * *
WaveReadLaneFirst Zwraca wartość wyrażenia dla aktywnego pasa bieżącej fali z najmniejszym indeksem. * *

Redukcja fali

Te funkcje wewnętrzne obliczają określoną operację we wszystkich aktywnych pasach ruchu w fali i emitować wynik końcowy do wszystkich aktywnych pasów ruchu. W związku z tym ostateczne dane wyjściowe są gwarantowane równomiernie na całej fali.

wewnętrzna opis cieniowania pikseli cieniowania zasobów obliczeniowych
WaveActiveAllEqual Zwraca wartość true, jeśli wyrażenie jest takie samo dla każdego aktywnego pasa ruchu w bieżącej fali (a tym samym jednolite w poprzek). * *
WaveActiveBitAnd Zwraca bitową wartość AND wszystkich wartości wyrażenia we wszystkich aktywnych pasach ruchu w bieżącej fali i replikuje wynik do wszystkich pasów ruchu w fali. * *
WaveActiveBitOr Zwraca bitowy or wszystkich wartości wyrażenia we wszystkich aktywnych pasach ruchu w bieżącej fali i replikuje wynik do wszystkich pasów ruchu w fali. * *
WaveActiveBitXor Zwraca bitowy wyłączny OR wszystkich wartości wyrażenia we wszystkich aktywnych pasach ruchu w bieżącej fali i replikuje wynik do wszystkich pasów ruchu w fali. * *
WaveActiveCountBits Zlicza zmienne logiczne, które mają wartość true we wszystkich aktywnych pasach ruchu w bieżącej fali, i replikuje wynik do wszystkich pasów ruchu w fali. * *
WaveActiveMax Oblicza maksymalną wartość wyrażenia we wszystkich aktywnych pasach ruchu w bieżącej fali i replikuje wynik do wszystkich pasów ruchu w fali. * *
WaveActiveMin Oblicza minimalną wartość wyrażenia we wszystkich aktywnych pasach ruchu w bieżącej fali i replikuje wynik do wszystkich pasów ruchu w fali. * *
WaveActiveProduct Mnoży wartości wyrażenia razem we wszystkich aktywnych pasach ruchu w bieżącej fali i replikuje wynik do wszystkich pasów ruchu w fali. * *
WaveActiveSum Sumuje wartość wyrażenia dla wszystkich aktywnych pasów ruchu w bieżącej fali i replikuje ją do wszystkich pasów w bieżącej fali i replikuje wynik do wszystkich pasów ruchu w fali. * *

Skanowanie falowe i prefiks

Te funkcje wewnętrzne stosują operację do każdego pasa ruchu i pozostawiają każdy częściowy wynik obliczeń w odpowiednim pasie ruchu.

wewnętrzna opis cieniowania pikseli cieniowania zasobów obliczeniowych
WavePrefixCountBits Zwraca sumę wszystkich określonych zmiennych logicznych ustawionych na wartość true we wszystkich aktywnych pasach ruchu z indeksami mniejszymi niż bieżący pas ruchu. * *
WavePrefixSum Zwraca sumę wszystkich wartości w aktywnych pasach ruchu z mniejszymi indeksami niż ten. * *
WavePrefixProduct Zwraca iloczyn wszystkich wartości w pasach ruchu przed tą jedną z określonej fali. * *

Czterowymiarowe operacje shuffle

Te funkcje wewnętrzne wykonują operacje zamiany na wartościach na fali znanej, że zawierają czworokąta cieniowania pikseli zgodnie z definicją w tym miejscu. Indeksy pikseli w czworokącie są definiowane w kolejności skanowania lub odczytu — gdzie współrzędne w czworokącie to:

+---------> X

| [0] [1]

| [2] [3]

v

Y

Te procedury działają w cieniowaniach obliczeniowych lub cieniowania pikseli. W cieniowaniach obliczeniowych działają w czworokątach zdefiniowanych jako równomiernie podzielone grupy 4 w ramach fali SIMD. W cieniowaniach pikseli powinny być używane na falach przechwytywanych przez WaveQuadLanes, w przeciwnym razie wyniki są niezdefiniowane.

wewnętrzna opis cieniowania pikseli cieniowania zasobów obliczeniowych
QuadReadLaneAt Zwraca określoną wartość źródłową odczytaną z pasa bieżącego czworokąta zidentyfikowanego przez quadLaneID [0..3], który musi być jednolity na czworokącie. *
QuadReadAcrossDiagonal Zwraca określoną wartość lokalną odczytaną z ukośnego pasa ruchu w tym czworokącie. *
QuadReadAcrossX Zwraca określoną wartość źródłową odczytaną z drugiego pasa ruchu w tym czworokącie w kierunku X. *
QuadReadAcrossY Zwraca określoną wartość źródłową odczytaną z innego pasa ruchu w tym czworokącie w kierunku Y. *

Możliwości sprzętowe

Aby sprawdzić, czy funkcje operacji falowych są dostępne na dowolnym konkretnym sprzęcie, wywołaj metodę ID3D12Device::CheckFeatureSupport, zwracając uwagi na opis i użycie struktury D3D12_FEATURE_DATA_D3D12_OPTIONS1.