Udostępnij przez


Interfejsy API zasobów kafelków

Interfejsy API opisane w tej sekcji działają z zasobami kafelkami i pulą kafelków.

Przypisywanie kafelków z puli kafelków do zasobu

ID3D11DeviceContext2::UpdateTileMappings i ID3D11DeviceContext2::CopyTileMappings interfejsy API manipulują mapowaniami kafelków i zapytań. Wywołania aktualizacji wpływają tylko na kafelki zidentyfikowane w wywołaniu, a inne są pozostawione zgodnie z definicją wcześniej.

Dowolny kafelek z puli kafelków można mapować na wiele lokalizacji w zasobie, a nawet wiele zasobów. To mapowanie obejmuje kafelki w zasobie, który ma wybrany układ implementacji (pakowania Mipmap), gdzie wiele map mipmap są pakowane razem w jeden kafelek. Przechwycenie polega na tym, że jeśli dane są zapisywane na kafelku za pomocą jednego mapowania, ale odczytane za pomocą innego skonfigurowanego mapowania, wyniki są niezdefiniowane. Staranne wykorzystanie tej elastyczności może być jednak przydatne w przypadku aplikacji, na przykład udostępnianie kafelka między zasobami, które nie będą używane jednocześnie, gdzie zawartość kafelka jest zawsze inicjowana za pomocą tego samego mapowania zasobów, z którego będą następnie odczytywane. Podobnie kafelek mapowany do przechowywania spakowanych mipmap wielu różnych zasobów o tych samych wymiarach powierzchni będzie działać prawidłowo — dane będą wyświetlane tak samo w obu mapowaniach.

Zmiany przypisań kafelków dla zasobu można wprowadzać w dowolnym momencie w kontekście natychmiastowym lub odroczonym.

Wykonywanie zapytań dotyczących tilingu zasobów i obsługi

Aby odpytować tiling zasobów, użyj ID3D11Device2::GetResourceTiling.

W przypadku innej obsługi tiling zasobów użyj ID3D11Device2::CheckMultisampleQualityLevels1.

Kopiowanie danych kafelków

Wszystkie metody w direct3D do przenoszenia danych wokół pracy z zasobami kafelkami tak, jakby nie były kafelkami, z tą różnicą, że zapisy w niezamapowanych obszarach są porzucane i odczyty z niezamapowanych obszarów generują 0. Jeśli operacja kopiowania obejmuje wielokrotne zapisywanie w tej samej lokalizacji pamięci, ponieważ wiele lokalizacji w zasobie docelowym jest mapowanych na tę samą pamięć kafelka, wynikowe zapisy na kafelkach wielomapowanych są niedeterministyczne i nie powtarzalne. Oznacza to, że dostęp odbywa się w dowolnej kolejności, w jakiej sprzęt wykonuje kopię.

Direct3D 11.2 wprowadza metody dla tych dodatkowych sposobów kopiowania:

  • Kopiowanie kafelków między kafelkami w zasobie kafelków (stopień szczegółowości kafelka 64 KB) i (do/z) buforu w pamięci procesora graficznego (GPU) (lub zasobu przejściowego) — ID3D11DeviceContext2::CopyTiles
  • Kopiowanie z pamięci udostępnionej przez aplikację do kafelków w zasobie kafelków — ID3D11DeviceContext2::UpdateTiles

Te metody swizzle/deswizzle zgodnie z potrzebami i zezwalają na flagę D3D11_TILE_COPY_NO_OVERWRITE, gdy obiekt wywołujący obiecuje pamięć docelową nie jest przywoływał przez pracę procesora GPU, która jest w locie.

Kafelki biorące udział w kopii nie mogą zawierać kafelków zawierających spakowane mipmapy lub zawierające wyniki, które są niezdefiniowane. Aby przenieść dane do/z mipmap, które są pakowane na jeden kafelek, należy użyć standardowego (nieokreślonego kafelka) interfejsów API kopiowania/aktualizowania lub ID3D11DeviceContext::GenerateMips dla całego łańcucha mip.

Uwaga na temat GenerateMips: Using ID3D11DeviceContext::GenerateMips na zasobie z częściowo zamapowanymi kafelkami spowoduje wygenerowanie wyników, które po prostu będą zgodne z regułami odczytu i zapisywania NULL zastosowane do dowolnego algorytmu, którego używa sprzęt i sterownik wyświetlania do GenerateMips. Dlatego nie jest szczególnie przydatne, aby aplikacja przeszkadzała w tym celu, chyba że jakoś obszary z mapowaniami null (i ich wpływ na inne mips w fazie generowania) nie będą miały wpływu na części powierzchni, na których aplikacja nie dba.

Kopiowanie danych kafelków z powierzchni przejściowej lub z pamięci aplikacji byłoby sposobem przekazywania kafelków, które mogły zostać na przykład przesyłane strumieniowo z dysku. Odmiana podczas przesyłania strumieniowego poza dyskiem przekazuje jakieś skompresowane dane do pamięci procesora GPU, a następnie dekoduje na procesorze GPU. Obiekt docelowy dekodowania może być zasobem buforu w pamięci procesora GPU, z którego CopyTiles następnie kopiuje do rzeczywistego zasobu kafelka. Ten krok kopiowania umożliwia wizzle procesora GPU, gdy wzorzecwizłu nie jest znany. Wizzling nie jest wymagany, jeśli sam zasób kafelka jest zasobem buforu (na przykład w przeciwieństwie do tekstury).

Układ pamięci kafelków po stronie zasobu buforu bez kafelków kopii jest po prostu liniowy w pamięci w 64 KB kafelków, które sprzęt i sterownik wyświetlania będziewizzle/deswizzle na kafelek zgodnie z potrzebami podczas przesyłania do/z zasobu kafelka. W przypadku powierzchni wieloprzykładowych antyaliasingowych (MSAA) próbki każdego piksela są przenoszone w kolejności indeksu próbki przed przejściem do następnego piksela. W przypadku kafelków, które są częściowo wypełnione po prawej stronie (w przypadku powierzchni, która ma szerokość nie wielokrotną szerokości kafelka w pikselach), skok/krok do przeniesienia w dół wiersza jest pełnym rozmiarem w bajtach liczby pikseli, które mieszczą się na kafelku, jeśli kafelek był pełny. W związku z tym może istnieć różnica między każdym wierszem pikseli w pamięci. Dla uproszczenia specyfikacji mipmapy mniejsze niż kafelek nie są pakowane razem w układzie liniowym. Wydaje się to być stratą miejsca w pamięci, ale jak wspomniano o kopiowaniu do mips, że pakiety sprzętowe razem nie są dozwolone za pośrednictwem CopyTiles lub UpdateTiles. Aplikacja może po prostu używać ogólnych interfejsów API UpdateSubresource*() lub CopySubresource*() do kopiowania małych mips indywidualnie, jednak w przypadku elementu CopySubresource*(), co oznacza, że pamięć liniowa musi być tym samym wymiarem co zasób kafelkowy — copySubresource*() nie może skopiować z zasobu buforu do tekstury2D na przykład.

Jeśli zdefiniowano standardową wizzle sprzętu, można dodać flagi, aby wskazać, że dane w buforze mają być interpretowane w tym formacie (brakwizle niezbędne do transferu), choć alternatywne podejścia do przekazywania danych mogą również mieć sens w tym przypadku, takie jak zezwolenie aplikacjom na bezpośredni dostęp do pamięci puli kafelków.

Operacje kopiowania można wykonywać w kontekście natychmiastowym lub odroczonym.

Zmiana rozmiaru puli kafelków

Aby zmienić rozmiar puli kafelków, użyj ID3D11DeviceContext2::ResizeTilePool.

Bariera zasobów kafelków

Aby określić ograniczenie kolejności dostępu do danych między wieloma zasobami kafelków, użyj ID3D11DeviceContext2::TiledResourceBarrier.

zasoby kafelkowe