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.
W trybie Direct3D 12 zapytania są grupowane w tablice zapytań nazywanych stertą zapytań. Sterta zapytania ma typ, który definiuje prawidłowe typy zapytań, które mogą być używane z tym stertą.
- różnice w zapytaniach z Direct3D 11 do Direct3D 12
- stert zapytań
- tworzenie stert zapytań
- wyodrębnianie danych z zapytania
- Tematy pokrewne
Różnice w zapytaniach z Direct3D 11 do Direct3D 12
Następujące typy zapytań nie są już obecne w trybie Direct3D 12, a ich funkcje są włączone do innych procesów:
- zapytania dotyczące zdarzeń — zdarzenie funkcjonalne jest teraz obsługiwane przez ogrodzenia.
- rozłączne zapytania sygnatury czasowej — zegary procesora GPU można ustawić na stabilny stan w trybie Direct3D 12 (zobacz sekcję chronometrażu). Porównania zegarów gpu nie są istotne, jeśli procesor GPU bezczynny w ogóle między znacznikami czasu (znanym jako rozłączne zapytanie). Dzięki stabilnej mocy dwa zapytania sygnatury czasowej wydane z różnych list poleceń są niezawodnie porównywalne. Dwa znaczniki czasu na tej samej liście poleceń są zawsze niezawodnie porównywalne.
- zapytania statystyk wyjściowych usługi Stream — w trybie Direct3D 12 nie ma zapytania o przepełnienie pojedynczego strumienia dla wszystkich strumieni wyjściowych. Aplikacje muszą wysyłać wiele zapytań pojedynczego strumienia, a następnie korelować wyniki.
- predykat statystyk wyjściowych usługi Stream i zapytania predykatu okluzji — zapytania (które zapisują się w pamięci) i predykacji (które odczyty z pamięci) nie są już powiązane, a więc te typy zapytań nie są potrzebne.
Dodano nowy binarny typ zapytania okluzji do wersji Direct3D 12. Pozwala to na strategie predykacji, które dbają tylko o to, czy obiekt był w pełni occluded, czy nie (zamiast liczby pikseli zostały okludnione), aby wskazać to urządzeniu, co może być w stanie wydajniej wykonywać zapytania.
Stertę zapytań
Zapytania mogą być jednym z wielu typów (D3D12_QUERY_HEAP_TYPE) i są pogrupowane w stertę zapytań przed przesłaniem do procesora GPU.
Dostępny jest nowy typ zapytania D3D12_QUERY_TYPE_BINARY_OCCLUSION i działa jak D3D12_QUERY_TYPE_OCCLUSION z tą różnicą, że zwraca wynik binarny 0/1: 0 wskazuje, że żadne próbki nie przeszły testów głębokości i wzornika, 1 wskazuje, że co najmniej jedna próbka przeszła głębię i testowanie wzornika. Dzięki temu zapytania okluzji nie zakłócają żadnej optymalizacji wydajności procesora GPU skojarzonej z testowaniem głębokości/wzornika.
Tworzenie stert zapytań
Interfejsy API związane z tworzeniem sterty zapytań to wyliczenie D3D12_QUERY_HEAP_TYPE, struktura D3D12_QUERY_HEAP_DESCi metoda CreateQueryHeap.
Podstawowe środowisko uruchomieniowe zweryfikuje, że typ stertu zapytania jest prawidłowym elementem członkowskim wyliczenia D3D12_HEAP_TYPE i że liczba jest większa niż 0.
Każdy pojedynczy element zapytania w stercie zapytania można uruchomić i zatrzymać oddzielnie.
Interfejsy API do używania sterty zapytań to wyliczenie D3D12_QUERY_TYPE, a metody BeginQuery i EndQuery.
D3D12_QUERY_TYPE_TIMESTAMP jest jedynym zapytaniem obsługującym tylko EndQuery. Wszystkie inne typy zapytań wymagają BeginQuery i EndQuery.
Warstwa debugowania zweryfikuje następujące elementy:
- Nie można rozpocząć kwerendy sygnatury czasowej — można ją zakończyć tylko
- Nie można dwukrotnie rozpocząć zapytania bez jego zakończenia (dla danego elementu). W przypadku zapytań, które wymagają rozpoczęcia i zakończenia, jest nielegalne zakończenie zapytania przed odpowiednim rozpoczęciem (dla danego elementu).
- Typ zapytania przekazany do BeginQuery musi być zgodny z typem zapytania przekazanym do EndQuery.
Podstawowe środowisko uruchomieniowe zweryfikuje następujące elementy:
W przypadku typów zapytań, które obsługują BeginQuery i EndQuery (z wyjątkiem znacznika czasu), zapytanie dla danego elementu nie może obejmować granic listy poleceń.
ElementIndex musi należeć do zakresu.
Typ zapytania jest prawidłowym elementem członkowskim wyliczenia D3D12_QUERY_TYPE.
Typ zapytania musi być zgodny ze stertą zapytania. W poniższej tabeli przedstawiono typ sterta zapytania wymagany dla każdego typu zapytania:
Typ zapytania Typ sterta kwerendy D3D12_QUERY_TYPE_OCCLUSION D3D12_QUERY_HEAP_TYPE_OCCLUSION D3D12_QUERY_TYPE_BINARY_OCCLUSION D3D12_QUERY_HEAP_TYPE_OCCLUSION D3D12_QUERY_TYPE_TIMESTAMP D3D12_QUERY_HEAP_TYPE_TIMESTAMP D3D12_QUERY_TYPE_PIPELINE_STATISTICS D3D12_QUERY_HEAP_TYPE_PIPELINE_STATISTICS D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS D3D12_QUERY_TYPE_SO_STATISTICS_STREAM1 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS D3D12_QUERY_TYPE_SO_STATISTICS_STREAM2 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS D3D12_QUERY_TYPE_SO_STATISTICS_STREAM3 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS Typ zapytania jest obsługiwany przez typ listy poleceń. W poniższej tabeli przedstawiono, które zapytania są obsługiwane dla typów list poleceń.
Typ zapytania Obsługiwane typy list poleceń D3D12_QUERY_TYPE_OCCLUSION Bezpośredni D3D12_QUERY_TYPE_BINARY_OCCLUSION Bezpośredni D3D12_QUERY_TYPE_TIMESTAMP Bezpośrednie, obliczeniowe i opcjonalne kopiowanie D3D12_QUERY_TYPE_PIPELINE_STATISTICS Bezpośredni D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0 Bezpośredni D3D12_QUERY_TYPE_SO_STATISTICS_STREAM1 Bezpośredni D3D12_QUERY_TYPE_SO_STATISTICS_STREAM2 Bezpośredni D3D12_QUERY_TYPE_SO_STATISTICS_STREAM3 Bezpośredni
Wyodrębnianie danych z zapytania
Sposobem wyodrębniania danych z zapytania jest użycie metody ResolveQueryData. ResolveQueryData współdziała ze wszystkimi typami pamięci (niezależnie od tego, czy są to pamięć systemowa czy pamięć lokalna urządzenia), ale wymaga, aby zasób docelowy był w D3D12_RESOURCE_STATE_COPY_DEST.