Udostępnij przez


Wykonywanie i synchronizowanie list poleceń

W usłudze Microsoft Direct3D 12 tryb bezpośredni poprzednich wersji nie jest już obecny. Zamiast tego aplikacje tworzą listy poleceń i pakiety, a następnie rejestrują zestawy poleceń procesora GPU. Kolejki poleceń służą do przesyłania list poleceń w celu ich wykonania. Ten model umożliwia deweloperom większą kontrolę nad wydajnym użyciem zarówno procesora GPU, jak i procesora CPU.

Omówienie kolejki poleceń

Kolejki poleceń Direct3D 12 zastępują niewidoczną wcześniej dla dewelopera synchronizację środowiska uruchomieniowego i sterowników z przesyłaniem pracy w trybie natychmiastowym, oferując interfejsy API do jawnego zarządzania współbieżnością, równoległością i synchronizacją. Kolejki poleceń zapewniają następujące ulepszenia dla deweloperów:

  • Umożliwia deweloperom uniknięcie przypadkowej nieefektywności spowodowanej nieoczekiwaną synchronizacją.
  • Umożliwia deweloperom wprowadzanie synchronizacji na wyższym poziomie, gdzie wymagana synchronizacja może być bardziej wydajna i dokładna. Oznacza to, że środowisko uruchomieniowe i sterownik graficzny będą spędzać mniej czasu na reaktywnym zarządzaniu równoległością.
  • Sprawia, że kosztowne operacje są bardziej jawne.

Te ulepszenia umożliwiają lub rozszerzają następujące scenariusze:

  • Zwiększona równoległość — aplikacje mogą używać głębszych kolejek dla obciążeń w tle, takich jak dekodowanie wideo, gdy mają oddzielne kolejki na potrzeby pracy na pierwszym planie.
  • Praca asynchroniczna o niskim priorytecie dla GPU — model kolejki poleceń umożliwia współbieżne wykonywanie pracy GPU o niskim priorytecie oraz operacji atomowych, które pozwalają jednemu wątkowi GPU korzystać z wyników innego niezsynchronizowanego wątku bez blokowania.
  • Praca obliczeniowa o wysokim priorytcie — ten projekt umożliwia scenariusze, które wymagają przerwania renderowania 3D w celu wykonania niewielkiej ilości pracy obliczeniowej o wysokim priorytcie, dzięki czemu wynik można uzyskać wcześnie na potrzeby dodatkowego przetwarzania procesora CPU.

Inicjowanie kolejki poleceń

Kolejki poleceń można utworzyć, wywołując ID3D12Device::CreateCommandQueue. Ta metoda przyjmuje D3D12_COMMAND_LIST_TYPE wskazującą, jakiego typu kolejkę należy utworzyć, a w związku z tym, jakiego typu polecenia można przesłać do tej kolejki. Należy pamiętać, że pakiety mogą być wywoływane tylko z bezpośrednich list poleceń i nie można ich bezpośrednio przesyłać do kolejki. Obsługiwane typy kolejek to:

Ogólnie rzecz biorąc, kolejki DIRECT i listy poleceń akceptują wszystkie polecenia, kolejki COMPUTE i listy poleceń akceptują polecenia obliczeń i powiązane z kopiowaniem, a kolejki COPY i listy poleceń akceptują tylko polecenia kopiowania.

Wykonywanie list poleceń

Po nagraniu listy poleceń i pobraniu domyślnej kolejki poleceń lub utworzeniu nowej, lista poleceń jest wykonywana przez wywołanie ID3D12CommandQueue::ExecuteCommandLists.

Aplikacje mogą z wielu wątków przesyłać listy poleceń do dowolnej kolejki poleceń. Środowisko uruchomieniowe wykona pracę serializacji tych żądań w kolejności przesyłania.

Środowisko uruchomieniowe zweryfikuje przesłaną listę poleceń i usunie wywołanie polecenia ExecuteCommandLists w przypadku naruszenia któregokolwiek z ograniczeń. Połączenia zostaną przerwane z następujących powodów:

Uzyskiwanie dostępu do zasobów z wielu kolejek poleceń

Istnieje kilka reguł narzuconych przez środowisko uruchomieniowe, które ograniczają dostęp do zasobów z wielu kolejek poleceń. Te reguły są następujące:

  1. Nie można jednocześnie zapisywać zasobu z wielu kolejek poleceń. Gdy zasób przeszedł do stanu zapisywalnego w kolejce, jest uważany za wyłączną własność tej kolejki i musi przejść do stanu do odczytu lub wspólnego (patrz D3D12_RESOURCE_STATES), zanim inna kolejka będzie mogła uzyskać do niego dostęp.

  2. W stanie odczytu zasób może być odczytywany z wielu kolejek poleceń jednocześnie, w tym między procesami, na podstawie jego stanu odczytu.

Aby uzyskać więcej informacji na temat ograniczeń dostępu do zasobów i używania barier zasobów do synchronizowania dostępu do zasobów, zobacz Używanie barier zasobów do synchronizowania stanów zasobów.

Synchronizowanie wykonywania listy poleceń za pomocą barier kolejki poleceń

Obsługa wielu równoległych kolejek poleceń w trybie Direct3D 12 zapewnia większą elastyczność i kontrolę nad priorytetyzacji pracy asynchronicznej na procesorze GPU. Ten projekt oznacza również, że aplikacje muszą jawnie zarządzać synchronizacją pracy, zwłaszcza gdy listy poleceń w jednej kolejce zależą od zasobów obsługiwanych przez inną kolejkę poleceń. Niektóre z nich obejmują oczekiwanie na ukończenie operacji w kolejce obliczeniowej, aby wynik mógł być użyty do operacji renderowania w kolejce 3D, oraz oczekiwanie na ukończenie operacji 3D, aby operacja w kolejce obliczeniowej mogła uzyskać dostęp do zasobu do zapisu. Aby umożliwić synchronizację pracy między kolejkami, direct3D 12 używa koncepcji ogrodzeń, które są reprezentowane w interfejsie API przez interfejs ID3D12Fence.

Ogrodzenie jest liczbą całkowitą, która reprezentuje bieżącą jednostkę pracy, która jest przetwarzana. Gdy aplikacja przechodzi przez ogrodzenie, wywołując ID3D12CommandQueue::Signal, liczba całkowita jest aktualizowana. Aplikacje mogą sprawdzać wartość ogrodzenia i określać, czy jednostka pracy została ukończona, aby zdecydować, czy można uruchomić kolejną operację.

Synchronizowanie zasobów uzyskiwanych przez kolejki poleceń

W wersji Direct3D 12 synchronizowanie stanu niektórych zasobów jest implementowane z barierami zasobów. W każdej barierze zasobów aplikacja deklaruje stany przed i po zasobie. Typowym przykładem jest przejście zasobu między widokiem zasobu cieniowania do widoku docelowego renderowania. W większości przypadków te bariery zasobów są zarządzane na listach poleceń. Gdy warstwy debugowania są włączone, system wymusza, że stany przed i po wszystkich zasobach są zgodne, co gwarantuje, że zasób jest w odpowiednim stanie dla określonej operacji podczas przejścia bariery.

Aby uzyskać więcej informacji na temat synchronizowania stanu zasobu, zobacz Używanie barier zasobów do synchronizowania stanów zasobów.

Obsługa kolejek poleceń dla zasobów kafelkowych

Metody zarządzania zasobami kafelkowymi, które zostały ujawnione za pośrednictwem interfejsu ID3D11DeviceContext2 w Direct3D 11, są udostępniane przez interfejs ID3D12CommandQueue w Direct3D 12. Te metody obejmują:

Metoda Opis
CopyTileMappings Kopiuje mapowania ze źródłowego zasobu kafelka do docelowego zasobu kafelka.
UpdateTileMappings Aktualizuje mapowania lokalizacji kafelków w zasobach do lokalizacji pamięci w stercie zasobów.

Aby uzyskać więcej informacji na temat używania zasobów kafelkowanych w aplikacjach Direct3D 12, zobacz Direct3D11 Tiled Resources.

przesyłanie pracy w Direct3D 12