Udostępnij przez


Kwerendy

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

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:

  • BeginQuery nie można wywołać zapytania sygnatury czasowej.

  • 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.