Udostępnij za pośrednictwem


Direct3D 11 na 12

D3D11On12 to mechanizm, za pomocą którego deweloperzy mogą używać interfejsów I obiektów D3D11 do napędzania interfejsu API D3D12. D3D11on12 umożliwia składnikom napisanym przy użyciu D3D11 (na przykład tekstu D2D i interfejsu użytkownika) pracować razem ze składnikami napisanymi dla interfejsu API D3D12. D3D11on12 umożliwia również przyrostowe przenoszenie aplikacji z D3D11 do D3D12, umożliwiając fragmentom aplikacji kontynuowanie kierowania D3D11 dla uproszczenia, podczas gdy inne docelowe D3D12 pod kątem wydajności, podczas gdy zawsze mają pełne i poprawne renderowanie. D3D11On12 ułatwia korzystanie z technik międzyoperacyjnych w celu udostępniania zasobów i synchronizowania pracy między dwoma interfejsami API.

Inicjowanie D3D11On12

Aby rozpocząć korzystanie z D3D11On12, pierwszym krokiem jest utworzenie urządzenia D3D12 i kolejki poleceń. Te obiekty są udostępniane jako dane wejściowe metody inicjowania D3D11On12CreateDevice. Tę metodę można traktować jako tworzenie urządzenia D3D11 z wyimaginowanym typem sterownika D3D_DRIVER_TYPE_11ON12, gdzie sterownik D3D11 jest odpowiedzialny za tworzenie obiektów i przesyłanie list poleceń do interfejsu API D3D12.

Po utworzeniu urządzenia D3D11 i bezpośredniego kontekstu można QueryInterface z urządzenia dla interfejsu ID3D11On12Device. Jest to podstawowy interfejs używany do współdziałania między D3D11 i D3D12. Aby kontekst urządzenia D3D11 i listy poleceń D3D12 działały na tych samych zasobach, należy utworzyć "opakowane zasoby" przy użyciu interfejsu API CreateWrappedResource. Ta metoda "promuje" zasób D3D12, aby był zrozumiały w D3D11. Opakowany zasób zaczyna się w stanie "nabyte", czyli właściwości, która jest manipulowana przez metody AcquireWrappedResources i ReleaseWrappedResource s.

Przykładowe użycie

Typowym użyciem D3D11On12 jest użycie D2D do renderowania tekstu lub obrazów na podstawie buforu wstecznego D3D12. Zobacz przykładowy kod D3D11On12. Poniżej przedstawiono przybliżony opis kroków, które należy wykonać, aby to zrobić:

  • Tworzenie urządzenia D3D12 (D3D12CreateDevice) i łańcuch wymiany D3D12 (CreateSwapChain z ID3D12CommandQueue jako dane wejściowe).
  • Utwórz urządzenie D3D11On12 przy użyciu urządzenia D3D12 i tej samej kolejki poleceń co dane wejściowe.
  • Pobierz z powrotem łańcucha wymiany i utwórz zasoby opakowane D3D11 dla każdego z nich. Użyty stan wejściowy powinien być ostatnim sposobem, w jaki D3D12 go użył (np. RENDER_TARGET), a stan danych wyjściowych powinien być sposobem, w jaki D3D12 będzie używać go po zakończeniu D3D11 (np. PRESENT).
  • Zainicjuj D2D i podaj opakowane zasoby D3D11 do D2D w celu przygotowania do renderowania.

Następnie w każdej ramce wykonaj następujące czynności:

Tło

D3D11On12 działa systematycznie. Każde wywołanie interfejsu API D3D11 przechodzi przez typową walidację środowiska uruchomieniowego i przechodzi do sterownika. W warstwie sterownika specjalny stan 11on12 sterowników i problemy z operacjami renderowania na listach poleceń D3D12. Te listy poleceń są przesyłane w razie potrzeby (na przykład zapytanie GetData lub Map zasobów może wymagać opróżnienia poleceń) lub zgodnie z żądaniem opróżniania. Utworzenie obiektu D3D11 zwykle powoduje utworzenie odpowiedniego obiektu D3D12. Niektóre stałe operacje renderowania funkcji w D3D11, takie jak GenerateMips lub DrawAuto nie są obsługiwane w D3D12, dlatego D3D11On12 emuluje je przy użyciu cieniowania i dodatkowych zasobów.

W przypadku międzyoperacyjności ważne jest zrozumienie sposobu interakcji D3D11On12 z obiektami D3D12 utworzonymi i udostępnionymi przez aplikację. Aby upewnić się, że praca odbywa się w odpowiedniej kolejności, kontekst bezpośredni D3D11 musi zostać opróżniony, zanim do tej kolejki można przesłać dodatkową pracę D3D12. Należy również upewnić się, że kolejka podana D3D11On12 musi być opróżniana przez cały czas. Oznacza to, że wszystkie oczekiwania w kolejce muszą zostać ostatecznie spełnione, nawet jeśli bloki wątku D3D11 są renderowane na czas nieokreślony. Uważaj, aby nie brać zależności od tego, kiedy D3D11On12 wstawia opróżnianie lub czeka, ponieważ może to ulec zmianie w przyszłych wersjach. Ponadto D3D11On12 śledzi i manipuluje stanami zasobów samodzielnie. Jedynym sposobem zapewnienia współistnienia przejść stanu jest użycie interfejsów API pozyskiwania/wydawania w celu manipulowania śledzeniem stanu w celu dopasowania ich do potrzeb aplikacji.

Czyszczenie

Aby zwolnić zasób opakowany D3D11On12, należy wykonać dwie czynności w następującej kolejności:

  • Należy zwolnić wszystkie odwołania do zasobu, w tym wszystkie widoki zasobu.
  • Należy przeprowadzić przetwarzanie odroczonego zniszczenia. Najprostszym sposobem zapewnienia, że tak się stanie, jest wywołanie bezpośredniego kontekstu Flush interfejsu API.

Po wykonaniu obu tych kroków wszystkie odwołania podjęte przez opakowany zasób powinny zostać zwolnione, a zasób D3D12 stanie się wyłącznie własnością składnika D3D12. Należy pamiętać, że D3D12 nadal wymaga oczekiwania na ukończenie procesora GPU przed całkowitym zwolnieniem zasobu, dlatego pamiętaj, aby przechowywać odwołanie do zasobu przed wykonaniem dwóch powyższych kroków, chyba że już potwierdzono, że procesor GPU nie korzysta już z zasobu.

Wszystkie inne zasoby lub obiekty utworzone przez D3D11On12 zostaną wyczyszczone w odpowiednim czasie, gdy procesor GPU zakończy korzystanie z nich, przy użyciu mechanizmu odroczonego zniszczenia D3D11. Jeśli jednak spróbujesz zwolnić urządzenie D3D11On12 podczas wykonywania procesora GPU, zniszczenie może zablokować do czasu zakończenia procesora GPU.

Ograniczenia

Warstwa D3D11On12 implementuje bardzo duży podzestaw interfejsu API D3D11, ale istnieją pewne znane luki (oprócz usterek w implementacji, które mogą powodować niepoprawne renderowanie).

Od systemu Windows 10 w wersji 1809 (10.0; Kompilacja 17763), o ile D3D11On12 jest uruchomiona na sterowniku obsługującym model Shader Model 6.0 lub nowszy, można uruchamiać cieniowania korzystające z interfejsów. We wcześniejszych wersjach systemu Windows funkcja interfejsów cieniowania nie jest zaimplementowana w D3D11On12, a próba użycia tej funkcji spowoduje błędy i komunikaty debugowania.

Od systemu Windows 10 w wersji 1803 (10.0; Kompilacja 17134), łańcuchy wymiany są obsługiwane na urządzeniach D3D11On12. We wcześniejszych wersjach systemu Windows nie są.

D3D11On12 nie została zoptymalizowana pod kątem wydajności. Prawdopodobnie będzie umiarkowane obciążenie procesora CPU w porównaniu ze standardowym sterownikiem D3D11, minimalnym obciążeniem procesora GPU i wiadomo, że obciążenie pamięci jest znaczne. Dlatego nie zaleca się używania D3D11On12 do skomplikowanych scen 3D, a zamiast tego zaleca się używanie prostych scen lub renderowania 2D.

Apis

Interfejsy API tworzące warstwę 11on12 są opisane w 11on12 Reference.

D2D przy użyciu przewodnika D3D11on12

Understanding Direct3D 12

praca z direct3D 11, Direct3D 10 i Direct2D