Sdílet prostřednictvím


Souhrn funkcí (Direct3D 9 pro Windows Vista)

Tato dokumentace se konkrétně týká rozšíření systému Windows Vista pro grafiku DirectX. Pokud chcete vyvíjet výkon Rozhraní DirectX pro Windows Vista, musíte nainstalovat sadu Windows Vista SDK i sadu DirectX SDK. Aplikace používající DirectX pro Systém Windows Vista musí používat hardware, který používá ovladač WDDM (model ovladače zařízení systému Windows) na rozdíl od XPDM (XP Driver Model); ovladače, které neimplementují WDDM, nemohou vytvořit instanci grafických rozhraní Windows Vista DirectX.

Objevte nové grafické funkce DirectX v systému Windows Vista v jedné z těchto částí:

Změny chování zařízení

Zařízení jsou nyní ztracena pouze za dvou okolností; když se hardware resetuje, protože se zablokuje a když je ovladač zařízení zastavený. Když hardware přestane reagovat, zařízení lze resetovat voláním ResetEx. Pokud hardware přestane reagovat, dojde ke ztrátě paměti textury.

Po zastavení ovladače musí být objekt IDirect9Ex znovu vytvořen, aby bylo možné pokračovat ve vykreslování.

Pokud je oblast prezentace zakrytá jiným oknem v režimu okna nebo když je minimalizovaná aplikace na celé obrazovce, PresentEx vrátí S_D3DPRESENTATIONOCCLUDED. Aplikace na celé obrazovce můžou pokračovat ve vykreslování, když obdrží zprávu o zpětném volání WM_ACTIVATEAPP.

V předchozích verzích DirectX, když aplikace zaznamenala změnu režimu, jediným způsobem obnovení bylo resetování zařízení a opětovné vytvoření všech prostředků paměti videa a výměny řetězců. Nyní s DirectX pro Windows Vista volání Reset po změně režimu nezpůsobí ztrátu povrchů texturové paměti, textur a informací o stavu a tyto prostředky není nutné znovu vytvářet.

Zakázání vícevláknového zpracování vrcholů softwaru

Byl přidán nový bit caps (D3DCREATE_DISABLE_PSGP_THREADING), který zakáže multithreading pro zpracování vrcholů softwaru (swvp). Toto makro použijte k vygenerování příznaku chování pro IDirect3D9::CreateDevice.

#define D3DCREATE_DISABLE_PSGP_THREADING

Jednobitové povrchy

Existuje nový typ jednoho bitového formátu povrchu, který může být zvlášť užitečný pro zpracování textových glyfů. Nový formát se nazývá D3DFMT_A1. 1bitový povrch je navržen tak, aby byl buď použit jako textura na jeden pixel, nebo jako cílový výstup vykreslení vygenerovaný ComposeRects nebo ColorFill. Pro šířku a výšku povrchu neexistují žádné samostatné limity; implementace musí podporovat plochu o jednotné velikosti 2K texelů x 8K texelů.

Jednobitový povrch má jeden bit na texel; proto by jeden znamenal, že všechny komponenty (r,g,b,a) pixelu jsou 1 a nula by znamenala, že všechny komponenty jsou rovny 0. Jednobitové povrchy můžete používat s následujícími rozhraními API: ColorFill, UpdateSurface a UpdateTexture.

Při čtení jednobitové plochy může modul runtime provádět buď bodový vzorek, nebo filtrování konvoluce. Konvoluční filtr je upravitelný (viz SetConvolutionMonoKernel).

Pro jednobitové povrchy platí určitá omezení:

  • Mip-mapping není podporováno.
  • Data sRGB nelze číst ani zapisovat na jednobitový povrch.
  • Jednobitový povrch nelze použít jako texturu vrcholu nebo pro vícevzorkování.

Čtení hloubkových a šablonových vyrovnávacích pamětí

Použijte IDirect3DDevice9::UpdateSurface ke čtení nebo zápisu dat hloubky/stencilu z povrchů získaných z IDirect3DDevice9::CreateDepthStencilSurface nebo IDirect3DDevice9::GetDepthStencilSurface.

Nejprve vytvořte zamykatelný povrch, který je buď pouze hloubkový, nebo pouze vzorníkový, pomocí IDirect3DDevice9::CreateOffscreenPlainSurface. Použijte jeden z následujících formátů:

  • D3DFMT_D16_LOCKABLE
  • D3DFMT_D32F_LOCKABLE
  • D3DFMT_D32_LOCKABLE
  • D3DFMT_S8_LOCKABLE

Za druhé proveďte přenos dat mezi vyrovnávací pamětí hloubky/vzorníku a nově vytvořenou zamykatelnou hloubkovou nebo vzorníkovou plochou. Přenos se provádí pomocí IDirect3DDevice9::UpdateSurface.

UpdateSurface selže, pokud jsou oba povrchy ve formátu LOCKABLE nebo oba nejsou zamknutelné.

Přenos neexistujících dat způsobí chybu (například přenos z hloubkové plochy, která nelze uzamykat, na povrch D3DFMT_S8_LOCKABLE).

Zbývající omezení pro IDirect3DDevice9::UpdateSurface stále platí.

Sdílení prostředků

Prostředky Direct3D se teď dají sdílet mezi zařízeními nebo procesy. To platí pro jakýkoli prostředek Direct3D, včetně textur, vyrovnávacích pamětí vrcholů, vyrovnávacích pamětí indexu nebo povrchů (například cíle vykreslování, vyrovnávací paměti vzorníku hloubky nebo prostých ploch mimo obrazovku). Aby bylo možné zdroj sdílet, je třeba při vytvoření vybrat zdroj určený ke sdílení a umístit ho do výchozího fondu (D3DPOOL_DEFAULT). Jakmile se prostředek vytvoří ke sdílení, může se sdílet napříč zařízeními v rámci procesu nebo ho sdílet napříč procesy.

Pokud chcete povolit sdílené prostředky, rozhraní API pro vytváření zdrojů mají další popisující parametr. Jedná se o popisovač ukazující na sdílený prostředek. V předchozích revizích rozhraní DirectX byl tento argument součástí podpisu rozhraní API, ale byl nepoužitý a musí být nastaven na NULL. Počínaje systémem Windows Vista použijte pSharedHandle následujícími způsoby:

  • Nastavte ukazatel (pSharedHandle) na NULL, aby se prostředek nesdílel. To je stejně jako chování DirectX před Windows Vista.
  • Pokud chcete vytvořit sdílený prostředek, zavolejte jakékoli rozhraní API pro vytvoření prostředku (viz níže) s neinicializovaným popisovačem (samotný ukazatel není NULL (pSharedHandle != NULL), ale ukazatel odkazuje na hodnotu NULL (*pSharedHandle == NULL)). Rozhraní API vygeneruje sdílený prostředek a vrátí platný popisovač.
  • Pokud chcete otevřít a získat přístup k dříve vytvořenému sdílenému prostředku pomocí nenulového popisovače sdíleného prostředku, nastavte pSharedHandle na adresu tohoto popisovače. Po otevření dříve vytvořeného sdíleného prostředku tímto způsobem můžete použít vrácené rozhraní v rozhraní API Direct3D 9 nebo Direct3D 9Ex, jako by rozhraní bylo typickým prostředkem tohoto typu.

Rozhraní API pro vytváření prostředků zahrnují – CreateTexture, CreateVolumeTexture, CreateCubeTexture, CreateRenderTarget, CreateVertexBuffer, CreateIndexBufferCreateDepthStencilSurface, CreateOffscreenPlainSurface, CreateDepthStencilSurfaceEx, CreateOffscreenPlainSurfaceExa CreateRenderTargetEx.

Používání sdílených prostředků má určitá omezení. Patří mezi ně:

  • Rozhraní API, které používáte k otevření sdíleného prostředku, musí odpovídat rozhraní API, které jste použili k vytvoření sdíleného prostředku. Pokud jste například k vytvoření sdíleného prostředku použili CreateTexture, musíte k otevření sdíleného prostředku použít CreateTexture; Pokud jste k vytvoření sdíleného prostředku použili CreateRenderTarget, musíte k otevření sdíleného prostředku použít CreateRenderTarget; a tak dále.
  • Při otevření sdíleného prostředku je nutné zadat D3DPOOL_DEFAULT.
  • Zamknutelné prostředky (například textury s D3DUSAGE_DYNAMIC, vyrovnávací paměti vrcholů a vyrovnávací paměti indexu) mohou při sdílení zaznamenat nízký výkon. Uzamykatelné rendertargety se na některém hardwaru nesdílí.
  • Odkazy na sdílený prostředek napříč procesy musí mít stejné dimenze jako původní prostředek. Při předávání popisovače mezi procesy připojte informace o dimenzi, aby se odkaz mohl vytvořit identicky.
  • Sdílené plochy mezi procesy neposkytují žádný synchronizační mechanismus. Změny při čtení a zápisu na sdíleném povrchu nemusí odrážet pohled procesu, který se odkazuje na povrch, když je očekáváno. Pokud chcete zajistit synchronizaci, použijte dotazy událostí nebo uzamkněte texturu.
  • Pouze proces, který původně vytvoří sdílený prostředek, ho může uzamknout (jakýkoli proces, který otevře odkaz na tento sdílený prostředek, jej nemůže uzamknout).
  • Pokud je sdílený prostředek uzamčený, není k dispozici ověření jiných procesů, které by věděly, jestli je prostředek k dispozici.

Převod sRGB před prolnutím

Teď můžete zkontrolovat, jestli zařízení dokáže převést data kanálu na sRGB předtím, než se kombinují ve vyrovnávací paměti rámce. To znamená, že zařízení převede hodnoty cíle vykreslování z sRGB. Pokud chcete zjistit, jestli hardware podporuje převod, zkontrolujte tento limit:

D3DPMISCCAPS_POSTBLENDSRGBCONVERT

Tento limit identifikuje hardware, který podporuje převod na sRGB před prolnutím. Tato funkce je důležitá pro vysoce kvalitní vykreslování z vyrovnávací paměti snímků fp16 ve Správci okna plochy (DWM).

Vylepšení funkce StretchRect

V předchozích verzích DirectX má StretchRect mnoho omezení pro přizpůsobení různých ovladačů (viz IDirect3DDevice9::StretchRect). Systém Windows Vista je postaven na modelu ovladače zařízení systému Windows (WDDM). Tento nový model ovladačů je mnohem robustnější a umožňuje ovladačům zpracovávat speciální případy v hardwaru.

Obecně platí, že jediné zbývající omezení je, že cíl vykreslení musí být vytvořen s využitím vykreslení cíle (D3DUSAGE_RENDERTARGET). Toto omezení se zvedne, pokud provádíte jednoduchou kopii (kde zdroj a dest mají stejný formát, stejnou velikost a neexistují žádné dílčí obdélníky).

Vytvoření textury v systémové paměti

Aplikace, které potřebují větší flexibilitu při použití, přidělování a odstraňování systémové paměti, teď můžou vytvářet textury z ukazatele systémové paměti. Aplikace může například vytvořit texturu Direct3D z rastrového ukazatele systémové paměti GDI.

Pokud chcete vytvořit takovou texturu, musíte udělat dvě věci:

  • Přidělte dostatečnou systémovou paměť k uložení povrchu textury. Minimální počet bajtů je šířka x výška x bajtů na pixel.
  • Předejte adresu ukazatele na plochu systémové paměti pro parametr HANDLE* do IDirect3DDevice9::CreateTexture.

Tady je prototyp funkce pro IDirect3DDevice9::CreateTexture:

STDMETHOD(CreateTexture)(THIS_ UINT Width, UINT Height, UINT Levels, 
    DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture9** ppTexture, 
    HANDLE* pSharedHandle)

Textura systémové paměti má následující omezení:

  • Rozteč textury musí být rovna šířce textury vynásobené počtem bajtů na pixel.
  • Při použití komprimovaných formátů (DXT) zodpovídá aplikace za přidělení správné velikosti.
  • Podporovány jsou pouze textury s jednou úrovní mipmap.
  • Hodnota předaná CreateTexture pro argument Pool musí být D3DPOOL_SYSTEMMEM.
  • Toto rozhraní API zabalí zadanou paměť do textury. Neuvolňujte tuto paměť, dokud ji nepotřebujete.