Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Rysowanie pośrednie umożliwia przeniesienie niektórych operacji przeszukiwania sceny i odrzucania z CPU do GPU, co może poprawić wydajność. Bufor poleceń może być generowany przez procesor CPU lub procesor GPU.
Podpisy poleceń
Obiekt sygnatury polecenia (ID3D12CommandSignature) umożliwia aplikacjom określanie rysunku pośredniego, w szczególności ustawienie następujących ustawień:
- Format buforu argumentu pośredniego.
- Typ polecenia, który będzie używany (z ID3D12GraphicsCommandList metod DrawInstanced, DrawIndexedInstancedlub Dispatch).
- Zestaw powiązań zasobów, które będą zmieniać się wraz z każdym wywołaniem polecenia, w porównaniu z zestawem, który będzie dziedziczony.
Podczas uruchamiania aplikacja tworzy niewielki zestaw podpisów poleceń . W czasie wykonywania aplikacja wypełnia bufor poleceniami (za pośrednictwem dowolnego sposobu, w jaki wybiera deweloper aplikacji). Polecenia opcjonalnie zawierające stan ustawiany dla widoków buforu wierzchołka, widoków buforu indeksu, stałych głównych i deskryptorów głównych (nieprzetworzonych lub ustrukturyzowanych SRV/UAV/CBVs). Te układy argumentów nie są specyficzne dla sprzętu, więc aplikacje mogą generować bufery bezpośrednio. Podpis polecenia dziedziczy pozostały stan z listy poleceń. Następnie aplikacja wywołuje ExecuteIndirect, aby poinstruować procesor GPU, aby interpretował zawartość pośredniego buforu argumentów zgodnie z formatem zdefiniowanym przez określony podpis polecenia.
Jeśli podpis polecenia zmieni jakiekolwiek argumenty główne, to jest przechowywane w podpisie polecenia jako część podpisu głównego.
Po zakończeniu wykonywania żaden stan sygnatury polecenia nie przenika z powrotem do listy poleceń. Jednak po ExecuteIndirectwszystkie powiązania są resetowane do znanych wartości. W szczególności:
- Jeśli podpis polecenia wiąże bufor wierzchołka z określonym miejscem, po wywołaniu ExecuteIndirect bufor wierzchołka NULL jest powiązany z tym miejscem.
- Jeśli podpis polecenia wiąże bufor indeksu, to po wykonaniu ExecuteIndirectzostaje powiązany bufor indeksu NULL.
- Jeśli podpis polecenia ustawia stałą główną, po wywołaniu ExecuteIndirect wartość stałej głównej jest ustawiona na 0.
- Jeśli podpis polecenia ustawia widok główny (CBV/SRV/UAV), po wywołaniu ExecuteIndirect zostanie ustawiony widok główny na widok NULL.
Jako przykład używania podpisów poleceń: załóżmy, że deweloper aplikacji chce, aby w buforze argumentów pośrednich określono unikatową stałą główną dla każdego wywołania rysowania. Aplikacja utworzy sygnaturę polecenia, która umożliwia buforowi argumentów pośredniego zdefiniowanie następujących parametrów na wywołanie rysowania.
- Wartość jednej stałej głównej.
- Argumenty rysowania (liczba wierzchołków, liczba instancji itp.).
Bufor argumentu pośredniego wygenerowany przez aplikację zawiera tablicę rekordów o stałym rozmiarze. Każda struktura odpowiada jednemu wywołaniu rysowania. Każda struktura zawiera argumenty rysowania i wartość stałej bazowej. Liczba wywołań rysowania jest określona w oddzielnym buforze widocznym dla GPU.
Przykładowy bufor polecenia wygenerowany przez aplikację jest następujący:
Struktury bufora argumentów pośrednich
Poniższe struktury definiują sposób wyświetlania określonych argumentów w buforze argumentów pośrednich. Te struktury nie są wyświetlane w żadnym interfejsie API D3D12. Aplikacje używają tych definicji podczas zapisywania w buforze argumentów pośrednich (CPU lub GPU):
- D3D12_DRAW_ARGUMENTS
- D3D12_DRAW_INDEXED_ARGUMENTS
- D3D12_DISPATCH_ARGUMENTS
- D3D12_VERTEX_BUFFER_VIEW
- D3D12_INDEX_BUFFER_VIEW
- D3D12_GPU_VIRTUAL_ADDRESS (synonim typu UINT64).
- D3D12_CONSTANT_BUFFER_VIEW
Tworzenie podpisu polecenia
Aby utworzyć podpis polecenia, użyj następujących elementów interfejsu API:
- ID3D12Device::CreateCommandSignature (generuje ID3D12CommandSignature)
- D3D12_INDIRECT_ARGUMENT_TYPE
- D3D12_INDIRECT_ARGUMENT_DESC
- D3D12_COMMAND_SIGNATURE_DESC
Kolejność argumentów w buforze argumentów pośrednich jest definiowana tak, aby dokładnie odpowiadała kolejności argumentów określonych w parametrze pArgumentsD3D12_COMMAND_SIGNATURE_DESC. Wszystkie argumenty dla jednego wywołania renderowania/uruchamiania obliczeń w buforze argumentów pośrednich są ściśle pakowane. Jednak aplikacje mogą określać dowolny krok bajtowy między poleceniami draw/dispatch w buforze argumentów pośrednich.
Podpis bazowy musi być określony wtedy i tylko wtedy, gdy podpis polecenia zmienia jeden z argumentów bazowych.
Dla root SRV/UAV/CBV, określona przez aplikację wielkość jest wyrażona w bajtach. Warstwa debugowania zweryfikuje następujące ograniczenia dotyczące adresu:
- CBV — adres musi zawierać wielokrotność 256 bajtów.
- Nieprzetworzone SRV/UAV — adres musi mieć wielokrotność 4 bajtów.
- Ustrukturyzowane SRV/UAV — adres musi być wielokrotnością odstępu bajtowego struktury (zadeklarowanego w shaderze).
Dany podpis polecenia jest rysowaniem lub podpisem polecenia obliczeniowego. Jeśli podpis polecenia zawiera operację rysunku, jest to podpis polecenia grafiki. W przeciwnym razie podpis polecenia musi zawierać operację wysyłania i jest to podpis polecenia obliczeniowego.
W poniższych sekcjach przedstawiono przykładowe podpisy poleceń.
Brak zmian argumentów
W tym przykładzie bufor argumentu pośredniego wygenerowany przez aplikację zawiera tablicę struktur 36-bajtowych. Każda struktura zawiera tylko pięć parametrów przekazanych do DrawIndexedInstanced (plus dopełnienie).
Kod do utworzenia opisu podpisu polecenia jest następujący:
D3D12_INDIRECT_ARGUMENT_DESC Args[1];
Args[0].Type = D3D12_INDIRECT_ARGUMENT_TYPE_DRAW_INDEXED;
D3D12_COMMAND_SIGNATURE_DESC ProgramDesc;
ProgramDesc.ByteStride = 36;
ProgramDesc.NumArgumentDescs = 1;
ProgramDesc.pArguments = Args;
Układ pojedynczej struktury w buforze argumentu pośredniego to:
| Bajty | Opis |
|---|---|
| 0:3 | IndexCountPerInstance |
| 4:7 | LiczbaInstancji |
| 8:11 | StartIndexLocation |
| 12:15 | BaseVertexLocation |
| 16:19 | StartInstanceLocation |
| 20:35 | Dopełnienie |
Stałe bazowe i bufory wierzchołków
W tym przykładzie każda struktura w buforze argumentów pośrednich zmienia dwie stałe główne, zmienia jedno powiązanie bufora wierzchołka i wykonuje jedną operację nieindeksowaną. Nie ma przestrzeni między strukturami.
Kod umożliwiający utworzenie opisu podpisu polecenia to:
D3D12_INDIRECT_ARGUMENT_DESC Args[4];
Args[0].Type = D3D12_INDIRECT_ARGUMENT_TYPE_CONSTANT;
Args[0].Constant.RootParameterIndex = 2;
Args[0].Constant.DestOffsetIn32BitValues = 0;
Args[0].Constant.Num32BitValuesToSet = 1;
Args[1].Type = D3D12_INDIRECT_ARGUMENT_TYPE_CONSTANT;
Args[1].Constant.RootParameterIndex = 6;
Args[1].Constant.DestOffsetIn32BitValues = 0;
Args[1].Constant.Num32BitValuesToSet = 1;
Args[2].Type = D3D12_INDIRECT_ARGUMENT_TYPE_VERTEX_BUFFER_VIEW;
Args[2].VertexBuffer.Slot = 3;
Args[3].Type = D3D12_INDIRECT_ARGUMENT_TYPE_DRAW;
D3D12_COMMAND_SIGNATURE_DESC ProgramDesc;
ProgramDesc.ByteStride = 40;
ProgramDesc.NumArgumentDescs = 4;
ProgramDesc.pArguments = Args;
Układ pojedynczej struktury w buforze argumentów pośrednich jest następujący:
| Bajty | Opis |
|---|---|
| 0:3 | Dane dla indeksu parametrów głównych 2 |
| 4:7 | Dane dla indeksu parametrów głównych 6 |
| 8:15 | Wirtualny adres VB w gnieździe 3 (64-bitowy) |
| 16:19 | Rozmiar VB |
| 20:23 | Krok VB |
| 24:27 | VertexCountPerInstance |
| 28:31 | LiczbaInstancji |
| 32:35 | StartVertexLocation |
| 36:39 | StartInstanceLocation |
Tematy pokrewne
-
Zaawansowane samouczki wideo DirectX: realizacja pośredniego i asynchronicznego odcinania GPU
-
Rysowanie pośrednie i odrzucanie z użyciem GPU: przewodnik po kodzie