Podsumowanie funkcji (Direct3D 9 dla systemu Windows Vista)
Ta dokumentacja dotyczy w szczególności rozszerzeń systemu Windows Vista dla grafiki DirectX. Aby opracować możliwości directX dla systemu Windows Vista, należy zainstalować zestaw Sdk systemu Windows Vista oraz zestaw SDK DirectX. Aplikacje korzystające z technologii DirectX dla systemu Windows Vista muszą używać sprzętu korzystającego ze sterownika WDDM (model sterownika urządzenia z systemem Windows) w przeciwieństwie do modelu XPDM (XP Driver Model); sterowniki, które nie implementują narzędzia WDDM, nie mogą tworzyć wystąpień interfejsów graficznych DirectX systemu Windows Vista.
Poznaj nowe funkcje grafiki DirectX w systemie Windows Vista w jednej z następujących sekcji:
- zmiany zachowania urządzenia
- wyłączanie wielowątkowego przetwarzania wierzchołków oprogramowania
- Jednobitowe Powierzchnie
- odczytywanie głębokości/wzornika
- udostępnianie zasobów
- Konwersja sRGB przed łączeniem
- Ulepszenia StretchRect
- Tworzenie tekstury w pamięci systemowej
Zmiany zachowania urządzenia
Urządzenia są teraz tracone tylko w dwóch okolicznościach; gdy sprzęt zostanie zresetowany, ponieważ zawiesza się i gdy sterownik urządzenia zostanie zatrzymany. Gdy sprzęt zawiesza się, urządzenie może zostać zresetowane przez wywołanie ResetEx. Jeśli sprzęt zawiesza się, pamięć tekstury zostanie utracona.
Po zatrzymaniu sterownika należy ponownie utworzyć obiekt IDirect9Ex, aby wznowić renderowanie.
Gdy obszar prezentacji jest zasłaniany przez inne okno w trybie okienkowym lub gdy aplikacja pełnoekranowa jest zminimalizowana, PresentEx zwróci S_D3DPRESENTATIONOCCLUDED. Aplikacje pełnoekranowe mogą wznawiać renderowanie po otrzymaniu komunikatu WM_ACTIVATEAPP.
W poprzednich wersjach directX, gdy aplikacja doświadczyła zmiany trybu, jedynym sposobem odzyskania było zresetowanie urządzenia i ponowne utworzenie wszystkich zasobów pamięci wideo i łańcuchów wymiany. Teraz z DirectX dla Windows Vista, wywołanie Reset po zmianie trybu nie powoduje utraty powierzchni pamięci tekstur, tekstur ani informacji o stanie, a te zasoby nie muszą być ponownie tworzone.
Wyłączanie wielowątkowego przetwarzania wierzchołków oprogramowania
Dodano nowy bit caps (D3DCREATE_DISABLE_PSGP_THREADING), który wyłączy wielowątkowość przetwarzania wierzchołków oprogramowania (swvp). Użyj tego makra, aby wygenerować flagę zachowania dla IDirect3D9::CreateDevice.
#define D3DCREATE_DISABLE_PSGP_THREADING
Powierzchnie jednobitowe
Istnieje nowy typ formatu powierzchni jedno bitowej, który może być szczególnie przydatny do przetwarzania glifów tekstowych. Nowy format nosi nazwę D3DFMT_A1. Powierzchnia jednobitowa została zaprojektowana tak, aby była używana jako tekstura na poziomie piksela lub dane wyjściowe renderowania generowane przez ComposeRects lub ColorFill. Nie ma oddzielnych ograniczeń dla szerokości i wysokości powierzchni; implementacja musi obsługiwać pojedynczą powierzchnię o rozdzielczości 2K texels x 8K texels.
Jedno bitowa powierzchnia ma jeden bit na texel; oznaczałoby to, że wszystkie składniki (r,g,b,a) piksela to 1, a zero oznaczałoby, że wszystkie składniki są równe 0. Można używać powierzchni jednobitowych z następującymi interfejsami API: ColorFill, UpdateSurface i UpdateTexture.
Gdy odczytuje się jedno bitową powierzchnię, środowisko uruchomieniowe może wykonać filtrowanie próbki punktów lub konwolucji. Filtr splotowy jest regulowany (zobacz SetConvolutionMonoKernel).
Istnieją pewne ograniczenia dotyczące powierzchni jedno bitowych:
- Mipmapping nie jest obsługiwane
- Dane sRGB nie mogą być odczytywane ani zapisywane na powierzchni jedno bitowej.
- Nie można użyć powierzchni jednobitowej jako tekstury wierzchołka ani do antyaliasingu.
Odczytywanie głębokości/wzornika
Użyj metody IDirect3DDevice9::UpdateSurface, aby odczytywać lub zapisywać dane głębokości i szablonu z powierzchni uzyskanych za pomocą IDirect3DDevice9::CreateDepthStencilSurface lub IDirect3DDevice9::GetDepthStencilSurface.
Najpierw utwórz powierzchnię, która może być zablokowana, albo jest tylko do głębokości, albo tylko do wzornika, przy użyciu funkcji IDirect3DDevice9::CreateOffscreenPlainSurface. Użyj jednego z następujących formatów:
- D3DFMT_D16_LOCKABLE
- D3DFMT_D32F_LOCKABLE
- D3DFMT_D32_LOCKABLE
- D3DFMT_S8_LOCKABLE
Po drugie, przekaż dane między buforem głębokości/wzornika a nowo utworzoną blokowaną powierzchnią głębokości lub wzornika. Transfer jest wykonywany przy użyciu interfejsu IDirect3DDevice9::UpdateSurface.
Element UpdateSurface zakończy się niepowodzeniem, gdy obie powierzchnie mają format LOCKABLE lub oba te elementy nie są blokowane.
Przenoszenie nieistniejących danych spowoduje błąd (na przykład przenoszenie z powierzchni głębokościowej, która nie jest możliwa do zablokowania, do powierzchni D3DFMT_S8_LOCKABLE).
Pozostałe ograniczenia dotyczące IDirect3DDevice9::UpdateSurface nadal mają zastosowanie.
Udostępnianie zasobów
Zasoby Direct3D można teraz udostępniać między urządzeniami lub procesami. Dotyczy to dowolnego zasobu Direct3D, w tym tekstur, buforów wierzchołków, buforów indeksów lub powierzchni (takich jak cele renderowania, bufory szablonów głębokości lub zwykłe powierzchnie poza ekranem). Aby udostępnić, należy wyznaczyć zasób do udostępniania w momencie tworzenia i zlokalizować zasób w puli domyślnej (D3DPOOL_DEFAULT). Po utworzeniu zasobu do udostępniania można go udostępniać między urządzeniami w ramach procesu lub współużytkować w ramach procesów.
Aby włączyć zasoby udostępnione, interfejsy API tworzenia zasobów mają dodatkowy parametr dojścia. Jest to uchwyt wskazujący zasób udostępniony. W poprzednich poprawkach DirectX ten argument był częścią podpisu interfejsu API, ale nie był używany i musi być ustawiony na NULL. Począwszy od systemu Windows Vista, użyj polecenia pSharedHandle w następujący sposób:
- Ustaw wskaźnik (pSharedHandle) na wartość null, aby nie współużytkować zasobu. Jest to tak samo jak zachowanie DirectX przed Windows Vista.
- Aby utworzyć zasób udostępniony, wywołaj dowolne API tworzenia zasobów (patrz poniżej) z niezainicjowanym uchwytem (sam wskaźnik nie jest NULL (pSharedHandle != NULL), ale wskaźnik wskazuje na wartość NULL (*pSharedHandle == NULL)). Interfejs API wygeneruje zasób udostępniony i zwróci prawidłowy uchwyt.
- Aby otworzyć i uzyskać dostęp do wcześniej utworzonego zasobu udostępnionego przy użyciu dojścia współużytkowanego innego niż NULL, ustaw wartość pSharedHandle na adres tego dojścia. Po otwarciu wcześniej utworzonego zasobu udostępnionego w ten sposób można użyć zwróconego interfejsu w interfejsie API Direct3D 9 lub Direct3D 9Ex tak, jakby interfejs był typowym zasobem tego typu.
Interfejsy API tworzenia zasobów obejmują CreateTexture, CreateVolumeTexture, CreateCubeTexture, CreateRenderTarget, CreateVertexBuffer, CreateIndexBuffer, CreateDepthStencilSurface, CreateOffscreenPlainSurface, CreateDepthStencilSurfaceEx, CreateOffscreenPlainSurfaceExi CreateRenderTargetEx.
Istnieją pewne ograniczenia dotyczące używania zasobów udostępnionych. Należą do nich:
- Interfejs API używany do otwierania zasobu udostępnionego musi być zgodny z interfejsem API użytym do utworzenia zasobu udostępnionego. Jeśli na przykład użyto CreateTexture do utworzenia zasobu udostępnionego, musisz użyć CreateTexture, aby otworzyć ten zasób udostępniony; Jeśli użyto CreateRenderTarget do utworzenia zasobu udostępnionego, musisz użyć CreateRenderTarget, aby otworzyć ten zasób udostępniony; i tak dalej.
- Po otwarciu zasobu udostępnionego należy określić D3DPOOL_DEFAULT.
- Możliwe do zablokowania zasoby (tekstury z D3DUSAGE_DYNAMIC, bufory wierzchołków i indeksów, na przykład) mogą mieć słabą wydajność podczas udostępniania. Zablokowane rendertargety mogą nie być współużytkowane na niektórych urządzeniach.
- Odwołania do zasobu współużytkowanego między procesami muszą mieć takie same wymiary jak oryginalny zasób. Podczas przekazywania uchwytu między procesami dołącz informacje o wymiarze, aby można było utworzyć identyczne odwołanie.
- Udostępnione powierzchnie międzyprocesowe nie mają mechanizmu synchronizacji. Zmiany odczytu/zapisu na udostępnionej powierzchni mogą nie odzwierciedlać widoku procesu odniesienia do tej powierzchni w oczekiwanym momencie. Aby zapewnić synchronizację, użyj zapytań dotyczących zdarzeń lub zablokuj teksturę.
- Tylko proces, który początkowo tworzy zasób udostępniony, może go zablokować (każdy proces, który otwiera odwołanie do tego zasobu udostępnionego, nie może go zablokować).
- Jeśli zasób udostępniony jest zablokowany, nie ma walidacji dla innych procesów, aby wiedzieć, czy zasób jest dostępny.
Konwersja sRGB przed połączeniem
Teraz możesz sprawdzić, czy urządzenie może przekonwertować dane potoku na sRGB przed mieszaniem buforu ramek. Oznacza to, że urządzenie konwertuje wartości render-target z sRGB. Aby sprawdzić, czy konwersja jest obsługiwana przez sprzęt, sprawdź ten limit:
D3DPMISCCAPS_POSTBLENDSRGBCONVERT
Ten limit identyfikuje sprzęt, który obsługuje konwersję na sRGB przed połączeniem. Ta funkcja jest ważna w przypadku wysokiej jakości renderowania z buforów ramkowych fp16 w menedżerze okien pulpitu (DWM).
Ulepszenia funkcji StretchRect
W poprzednich wersjach directX, StretchRect ma wiele ograniczeń, aby pomieścić różne sterowniki (zobacz IDirect3DDevice9::StretchRect). System Windows Vista jest oparty na modelu sterowników urządzeń z systemem Windows (WDDM). Ten nowy model sterowników jest znacznie bardziej niezawodny i umożliwia sterownikom obsługę specjalnych przypadków w sprzęcie.
Ogólnie rzecz biorąc, jedynym pozostałym ograniczeniem jest to, że element docelowy renderowania musi zostać utworzony z użyciem elementu render-target (D3DUSAGE_RENDERTARGET). To ograniczenie zostanie zniesione, jeśli wykonujesz prostą kopię (gdzie źródło i miejsce docelowe są tego samego formatu, takiego samego rozmiaru i nie ma podprostokątów).
Tworzenie tekstury w pamięci systemowej
Aplikacje, które wymagają większej elastyczności w przypadku użycia, alokacji i usuwania pamięci systemowej, mogą teraz tworzyć tekstury na podstawie wskaźnika pamięci systemowej. Na przykład aplikacja może utworzyć teksturę Direct3D na podstawie wskaźnika mapy bitowej pamięci systemu GDI.
Należy wykonać dwie czynności, aby utworzyć taką teksturę:
- Przydziel wystarczającą ilość pamięci systemowej do przechowywania powierzchni tekstury. Minimalna liczba bajtów to szerokość x wysokość x bajty na piksel.
- Przekaż adres wskaźnika do powierzchni pamięci systemowej jako parametr HANDLE* w wywołaniu funkcji IDirect3DDevice9::CreateTexture.
Oto prototyp funkcji IDirect3DDevice9::CreateTexture:
STDMETHOD(CreateTexture)(THIS_ UINT Width, UINT Height, UINT Levels,
DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture9** ppTexture,
HANDLE* pSharedHandle)
Tekstura pamięci systemowej ma następujące ograniczenia:
- Szerokość tekstury musi być równa szerokości tekstury pomnożonej przez liczbę bajtów na piksel.
- W przypadku korzystania z skompresowanych formatów (formatów DXT) aplikacja jest odpowiedzialna za przydzielanie odpowiedniego rozmiaru.
- Obsługiwane są tylko tekstury z pojedynczym poziomem mipmap.
- Wartość przekazana do metody CreateTexture dla argumentu Pool musi być D3DPOOL_SYSTEMMEM.
- Ten interfejs API opakowuje dostarczaną pamięć w teksturę. Nie zwalniaj tej pamięci, dopóki jej nie skończysz używać.