Udostępnij przez


Domyślne mapowanie tekstur

Użycie domyślnego mapowania tekstur zmniejsza użycie kopii i pamięci podczas udostępniania danych obrazu między procesorem GPU a procesorem CPU. Jednak należy go używać tylko w określonych sytuacjach. Standardowy układ "swizzle" pozwala uniknąć kopiowania lub przekształcania danych w wielu układach.

Przegląd

Mapowanie domyślnych tekstur nie powinno być pierwszym wyborem dla deweloperów. Deweloperzy powinni najpierw kodować w sposób przyjazny dla dyskretnych kart graficznych GPU (czyli unikać dostępu do procesora CPU dla większości tekstur i przekazywać je za pomocą CopySubresourceRegion1). Jednak w niektórych przypadkach CPU i GPU mogą komunikować się tak często z tymi samymi danymi, że mapowanie domyślnych tekstur staje się pomocne w oszczędzaniu energii lub przyspieszenia konkretnych projektów na określonych kartach graficznych lub architekturach. Aplikacje powinny wykrywać te przypadki i optymalizować niepotrzebne kopie.

W D3D11.3 tekstury utworzone przy użyciu D3D11_TEXTURE_LAYOUT_UNDEFINED (jednego z elementów wyliczenia D3D11_TEXTURE_LAYOUT) i bez dostępu CPU są najbardziej wydajne przy częstym renderowaniu i próbkowaniu przez GPU. Podczas testowania wydajności te tekstury powinny być porównywane z D3D11_TEXTURE_LAYOUT_UNDEFINED z dostępem do CPU, D3D11_TEXTURE_LAYOUT_64K_STANDARD_SWIZZLE z dostępem do CPU oraz D3D11_TEXTURE_LAYOUT_ROW_MAJOR na potrzeby obsługi międzyadapterowej.

Użycie D3D11_TEXTURE_LAYOUT_UNDEFINED z dostępem do procesora CPU umożliwia metody WriteToSubresource, ReadFromSubresource, Map (uniemożliwiając dostęp aplikacji do wskaźnika) i Unmap; ale może poświęcić wydajność dostępu do GPU. Użycie D3D11_TEXTURE_LAYOUT_64K_STANDARD_SWIZZLE z dostępem do procesora CPU umożliwia WriteToSubresource, ReadFromSubresource, Map (która zwraca prawidłowy wskaźnik do aplikacji) i Unmap. Może również poświęcić wydajność dostępu do GPU bardziej niż w przypadku D3D11_TEXTURE_LAYOUT_UNDEFINED, gdy korzysta się z dostępu do CPU.

Ogólnie, aplikacje powinny tworzyć większość tekstur jako dostępne tylko dla GPU, przy D3D11_TEXTURE_LAYOUT_UNDEFINED.

Wcześniej niż funkcja mapowania tekstur domyślnych istniała tylko jeden standardowy układ dla danych wielowymiarowych: "liniowy", znany również jako "wiersz-major". Aplikacje powinny unikać tekstur USAGE_STAGING i USAGE_DYNAMIC, gdy dostępna jest domyślna mapa. Tekstury USAGE_STAGING i USAGE_DYNAMIC używają układu liniowego.

D3D11.3 (i D3D12) wprowadza standardowy wielowymiarowy układ danych. Jest to możliwe, aby umożliwić wielu jednostkom przetwarzania działanie na tych samych danych bez kopiowania danych lubwizzowania danych między wieloma układami. Ustandaryzowany układ umożliwia zwiększenie wydajności dzięki efektom sieciowym i umożliwia algorytmom wykonywanie krótkich cięć przy założeniu określonego wzorca.

Należy jednak pamiętać, że ten standardowy swizzle jest funkcją sprzętową i może nie być obsługiwany przez wszystkie procesory GPU.

Interfejsy API D3D11.3

W przeciwieństwie do D3D12, D3D11.3 nie obsługuje domyślnie mapowania tekstur, więc należy wykonać zapytanie D3D11_FEATURE_DATA_D3D11_OPTIONS2. W przypadku wywołania ID3D11Device::CheckFeatureSupport i sprawdzania pola StandardSwizzle64KBSupportedD3D11_FEATURE_DATA_D3D11_OPTIONS2należy również wykonać zapytanie o element swizdle w warstwie Standardowa.

Następujące interfejsy API odwołują się do mapowania tekstur:

Wyliczenia

Struktur

Metody

funkcje Direct3D 11.3