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.
Nakładka sprzętowa to dedykowany obszar pamięci wideo, który można nakładać na powierzchni podstawowej. Podczas wyświetlania nakładki nie jest wykonywana żadna kopia. Operacja nakładki jest wykonywana na sprzęcie bez modyfikowania danych na powierzchni podstawowej.
Użycie nakładek sprzętowych do odtwarzania wideo było powszechne we wcześniejszych wersjach systemu Windows, ponieważ nakładki są wydajne w przypadku zawartości wideo o wysokiej szybkości klatek. Począwszy od systemu Windows 7, Direct3D 9 obsługuje nakładki sprzętowe. Ta obsługa jest przeznaczona głównie do odtwarzania wideo i różni się pod pewnymi względami od wcześniejszych interfejsów API DirectDraw:
- Nakładka nie może być rozkręcona, dublowana ani odsłaniana.
- Klucze kolorów źródła i łączenie alfa nie są obsługiwane.
- Nakładki można rozciągnąć, jeśli sprzęt nakładki go obsługuje. W przeciwnym razie rozciąganie nie jest obsługiwane. W praktyce nie wszystkie sterowniki graficzne obsługują rozciąganie.
- Każde urządzenie obsługuje co najwyżej jedną nakładkę.
- Nakładka jest wykonywana przy użyciu klucza koloru docelowego, ale środowisko uruchomieniowe Direct3D automatycznie wybiera kolor i rysuje prostokąt docelowy. Funkcja Direct3D automatycznie śledzi położenie okna i aktualizuje położenie nakładki przy każdym wywołaniu PresentEx.
Tworzenie powierzchni nakładki sprzętowej
Aby wysłać zapytanie o pomoc techniczną nakładki, wywołaj IDirect3D9::GetDeviceCaps. Jeśli sterownik obsługuje nakładkę sprzętu, flaga D3DCAPS_OVERLAY jest ustawiona w D3DCAPS9. Limity składowej.
Aby dowiedzieć się, czy określony format nakładki jest obsługiwany dla danego trybu wyświetlania, wywołaj metodę IDirect3D9ExOverlayExtension::CheckDeviceOverlayType.
Aby utworzyć nakładkę, wywołaj IDirect3D9Ex::CreateDeviceEx i określ efekt zamiany D3DSWAPEFFECT_OVERLAY. Bufor wsteczny może używać formatu innego niż RGB, jeśli sprzęt go obsługuje.
Powierzchnie nakładki mają następujące ograniczenia:
- Aplikacja nie może utworzyć więcej niż jednego łańcucha wymiany nakładki.
- Nakładka musi być używana w trybie okna. Nie można go używać w trybie pełnoekranowym.
- Efekt zamiany nakładki musi być używany z interfejsem IDirect3DDevice9Ex. Nie jest obsługiwany w przypadku IDirect3DDevice9.
- Nie można używać wieloprzykładowych próbek.
- Flagi D3DPRESENT_DONOTFLIP i D3DPRESENT_FLIPRESTART nie są obsługiwane.
- Statystyki prezentacji nie są dostępne dla powierzchni nakładki.
Jeśli sprzęt nie obsługuje rozciągania, zaleca się utworzenie łańcucha wymiany tak dużego jak tryb wyświetlania, aby można było zmienić rozmiar okna na dowolne wymiary. Ponowne utworzenie łańcucha wymiany nie jest optymalnym sposobem obsługi zmiany rozmiaru okna, ponieważ może to spowodować poważne artefakty renderowania. Ponadto ze względu na sposób, w jaki procesor GPU zarządza pamięcią nakładki, ponowne utworzenie łańcucha wymiany może potencjalnie spowodować, że aplikacja zabraknie pamięci wideo.
Nowe flagi D3DPRESENT_PARAMETERS
Następujące flagi D3DPRESENT_PARAMETERS są definiowane do tworzenia nakładek.
| Flaga | Opis |
|---|---|
| D3DPRESENTFLAG_OVERLAY_LIMITEDRGB | Zakres RGB wynosi 16–235. Wartość domyślna to 0–255. Wymaga możliwości D3DOVERLAYCAPS_LIMITEDRANGERGB. |
| D3DPRESENTFLAG_OVERLAY_YCbCr_BT709 | Kolory YUV używają definicji BT.709. Wartość domyślna to BT.601. Wymaga możliwości D3DOVERLAYCAPS_YCbCr_BT709. |
| D3DPRESENTFLAG_OVERLAY_YCbCr_xvYCC | Wyprowadź dane przy użyciu rozszerzonego identyfikatora YCbCr (xvYCC). Wymaga możliwości D3DOVERLAYCAPS_YCbCr_BT601_xvYCC lub D3DOVERLAYCAPS_YCbCr_BT709_xvYCC. |
Korzystanie z nakładek sprzętowych
Aby wyświetlić powierzchnię nakładki, aplikacja wywołuje IDirect3DDevice9Ex::P resentEx. Środowisko uruchomieniowe Direct3D automatycznie rysuje docelowy klucz koloru.
Następujące flagi PresentEx są zdefiniowane dla nakładek.
| Flaga | Opis |
|---|---|
| D3DPRESENT_UPDATECOLORKEY | Ustaw tę flagę, jeśli kompozycja menedżera okien pulpitu (DWM) jest wyłączona. Ta flaga powoduje ponowne rysowanie klucza koloru w trybie Direct3D. Jeśli funkcja DWM jest włączona, ta flaga nie jest wymagana, ponieważ funkcja Direct3D pobiera klucz koloru raz na powierzchni używanej przez usługę DWM do przekierowania. |
| D3DPRESENT_HIDEOVERLAY | Ukrywa nakładkę. |
| D3DPRESENT_UPDATEOVERLAYONLY | Aktualizuje nakładkę bez zmieniania zawartości. Ta flaga jest przydatna, jeśli okno zostanie przeniesione podczas wstrzymania wideo. |
Aplikacja powinna być przygotowana do obsługi następujących przypadków:
- Jeśli inna aplikacja używa nakładki, PresentEx zwraca D3DERR_NOTAVAILABLE.
- Jeśli okno zostanie przeniesione do innego monitora, aplikacja musi ponownie utworzyć łańcuch wymiany. W przeciwnym razie jeśli aplikacja wywołuje PresentEx, aby wyświetlić nakładkę na innym monitorze, PresentEx zwraca D3DERR_INVALIDDEVICE.
- Jeśli tryb wyświetlania ulegnie zmianie, funkcja Direct3D próbuje przywrócić nakładkę. Jeśli nowy tryb nie obsługuje nakładki, PresentEx zwraca wartość D3DERR_UNSUPPORTEDOVERLAY.
Przykładowy kod
W poniższym przykładzie pokazano, jak utworzyć powierzchnię nakładki.
const UINT VIDEO_WIDTH = 256;
const UINT VIDEO_HEIGHT = 256;
HRESULT CreateHWOverlay(
HWND hwnd,
IDirect3D9Ex *pD3D,
IDirect3DDevice9Ex **ppDevice
)
{
*ppDevice = NULL;
D3DCAPS9 caps;
ZeroMemory(&caps, sizeof(caps));
HRESULT hr = pD3D->GetDeviceCaps(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
&caps
);
if (FAILED(hr))
{
return hr;
}
// Check if overlay is supported.
if (!(caps.Caps & D3DCAPS_OVERLAY))
{
return D3DERR_UNSUPPORTEDOVERLAY;
}
D3DOVERLAYCAPS overlayCaps = { 0 };
IDirect3DDevice9Ex *pDevice = NULL;
IDirect3D9ExOverlayExtension *pOverlay = NULL;
// Check specific overlay capabilities.
hr = pD3D->QueryInterface(IID_PPV_ARGS(&pOverlay));
if (SUCCEEDED(hr))
{
hr = pOverlay->CheckDeviceOverlayType(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
VIDEO_WIDTH,
VIDEO_HEIGHT,
D3DFMT_X8R8G8B8,
NULL,
D3DDISPLAYROTATION_IDENTITY,
&overlayCaps
);
}
// Create the overlay.
if (SUCCEEDED(hr))
{
DWORD flags = D3DCREATE_FPU_PRESERVE |
D3DCREATE_MULTITHREADED |
D3DCREATE_SOFTWARE_VERTEXPROCESSING;
D3DPRESENT_PARAMETERS pp = { 0 };
pp.BackBufferWidth = overlayCaps.MaxOverlayDisplayWidth;
pp.BackBufferHeight = overlayCaps.MaxOverlayDisplayHeight;
pp.BackBufferFormat = D3DFMT_X8R8G8B8;
pp.SwapEffect = D3DSWAPEFFECT_OVERLAY;
pp.hDeviceWindow = hwnd;
pp.Windowed = TRUE;
pp.Flags = D3DPRESENTFLAG_VIDEO;
pp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
pp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
hr = pD3D->CreateDeviceEx(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
NULL, flags, &pp, NULL, &pDevice);
}
if (SUCCEEDED(hr))
{
(*ppDevice) = pDevice;
(*ppDevice)->AddRef();
}
SafeRelease(&pD3D);
SafeRelease(&pDevice);
SafeRelease(&pOverlay);
return hr;
}
Tematy pokrewne
-
interfejsy API wideo Direct3D