Szolgáltatás összefoglalása (Direct3D 9 Windows Vista esetén)
Ez a dokumentáció kifejezetten a DirectX-ábrákHoz készült Windows Vista-bővítményekre vonatkozik. A Windows Vista DirectX hatóerejének fejlesztéséhez telepítenie kell a Windows Vista SDK-t és a DirectX SDK-t. A Windows Vista DirectX-et használó alkalmazásoknak WDDM-illesztőprogramot (Windows-eszközillesztő-modellt) használó hardvert kell használniuk, szemben az XPDM-sel (XP-illesztőprogram-modellel); A WDDM-et nem megvalósító illesztőprogramok nem tudják példányosítani a Windows Vista DirectX grafikus adaptereket.
Az alábbi szakaszokban megismerheti a Windows Vista új DirectX grafikus funkcióit:
- eszköz viselkedésének változásai
- A többszálú szoftveres csúcsfeldolgozás letiltása
- egybites felületek
- olvasási mélység/rajzsablon pufferei
- Erőforrások megosztása
- sRGB-átalakítás a keverése előtt
- StretchRect javítások
- Textúra Létrehozása a Rendszermemóriában
Eszköz viselkedésének változásai
Az eszközök jelenleg csak két körülmény között vesznek el: ha a hardver újraindul, mert lefagyott, és amikor az eszközillesztő leáll. Ha a hardver lefagy, az eszköz alaphelyzetbe állítható ResetExhívásával. Ha a hardver lefagy, a textúra memóriája elveszik.
Az illesztőprogram leállítása után az IDirect9Ex objektumot újra létre kell hozni a renderelés folytatásához.
Ha a bemutatóterületet egy másik ablak eltakarja ablakos módban, vagy ha egy teljes képernyős alkalmazás kisebbre van állítva, a PresentEx S_D3DPRESENTATIONOCCLUDED értéket fog visszaadni. A teljes képernyős alkalmazások folytathatják a renderelést, amikor WM_ACTIVATEAPP visszahívási üzenetet kapnak.
A DirectX korábbi verzióiban, amikor egy alkalmazás módváltást tapasztalt, az egyetlen módja a helyreállításnak az volt, hogy alaphelyzetbe állítja az eszközt, és újra létrehozza az összes videomemória-erőforrást és felcseréli a láncokat. Most, hogy a Windows Vista DirectX-et használja, a visszaállítás módváltás után történő meghívása nem okozza a textúra memóriafelületeinek, anyagmintáinak és állapotadatainak elvesztését, és ezeket az erőforrásokat nem kell újra létrehozni.
Többszálú szoftveres csúcsfeldolgozás letiltása
Hozzáadtak egy új kapcsoló bitet (D3DCREATE_DISABLE_PSGP_THREADING), amely letiltja a többszálú feldolgozást a szoftveres csúcsfeldolgozáshoz (swvp). Ezzel a makróval létrehozhat egy viselkedésjelzőt az IDirect3D9::CreateDevice számára.
#define D3DCREATE_DISABLE_PSGP_THREADING
Egybites felületek
Létezik egy új, egybites felületformátumtípus, amely különösen hasznos lehet a szövegjelek feldolgozásához. Az új formátum neve D3DFMT_A1. Az egybites felületet úgy tervezték, hogy képpontonkénti textúraként, vagy a ComposeRects vagy a ColorFill által generált renderelési célkimenetként használják. Nincsenek külön kupakok a felület szélességéhez és magasságához; az implementációnak egy 2K texels x 8K texels méretű felületet kell támogatnia.
Egy egybites felület texelenként egy bittel rendelkezik; Ezért az egyik azt jelenti, hogy egy képpont összes összetevője (r,g,b,a) 1, a nulla pedig azt jelenti, hogy az összes összetevő egyenlő 0-tal. Az egybites felületeket a következő API-kkal használhatja: ColorFill, UpdateSurface és UpdateTexture.
Egybites felület beolvasása esetén a futtatókörnyezet pontmintát vagy konvolúciós szűrést hajthat végre. A konvolúciós szűrő állítható (lásd SetConvolutionMonoKernel).
Az egybites felületekre bizonyos korlátozások vonatkoznak:
- A mip-leképezés nem támogatott
- Az sRGB-adatok nem olvashatók és nem írhatók egybites felületre.
- Az egybites felület nem használható csúcsmintázatként vagy többszörös mintavételezéshez.
Mélység- és sztencilpufferek olvasása
Használja az IDirect3DDevice9::UpdateSurface parancsot az IDirect3DDevice9::CreateDepthStencilSurface vagy IDirect3DDevice9::GetDepthStencilSurface felületről származó mélységi/rajzsablon-adatok olvasásához vagy írásához.
Először hozzon létre egy zárolható, csak mélységi vagy csak sablonfelületet az IDirect3DDevice9::CreateOffscreenPlainSurface segítségével. Használja az alábbi formátumok egyikét:
- D3DFMT_D16_LOCKABLE
- D3DFMT_D32F_LOCKABLE
- D3DFMT_D32_LOCKABLE
- D3DFMT_S8_LOCKABLE
Másodszor, továbbítsa az adatokat a mélységi vagy rajzsablon pufferből az újonnan létrehozott zárolható mélységi vagy rajzsablon felületre. Az átvitel az IDirect3DDevice9::UpdateSurface használatával történik.
Az UpdateSurface sikertelen lesz, ha mindkét felület ZÁROLHATÓ formátumú, vagy mindkettő nem zárolható.
A nem létező adat átvitele hibát fog eredményezni (például, amikor zárolhatatlan, csak mélységi felületről D3DFMT_S8_LOCKABLE felületre történik az átvitel).
Az IDirect3DDevice9::UpdateSurface további korlátozásai továbbra is érvényesek.
Erőforrások megosztása
A Direct3D-erőforrások mostantól megoszthatóak az eszközök vagy folyamatok között. Ez minden Direct3D-erőforrásra vonatkozik, beleértve a textúrákat, csúcspuffereket, indexpuffereket vagy felületeket (például renderelési célokat, mélységi rajzsablonpuffereket vagy képernyőn kívüli egyszerű felületeket). A megosztáshoz ki kell jelölnie egy erőforrást a megosztáshoz a létrehozáskor, és meg kell keresnie az erőforrást az alapértelmezett készletben (D3DPOOL_DEFAULT). Miután létrehozott egy erőforrást a megosztáshoz, azt megoszthatja egy folyamat eszközei között, vagy megoszthatja a folyamatok között.
A megosztott erőforrások engedélyezéséhez az erőforrás-létrehozási API-k további leíróparaméterekkel rendelkeznek. Ez egy HANDLE, amely a megosztott erőforrásra mutat. A DirectX korábbi változataiban ez az argumentum az API-aláírás része volt, de nem volt használatban, és a NULL
- Állítsa a mutatót (pSharedHandle) a NULL értékre, hogy ne ossza meg az erőforrást. Ez ugyanúgy működik, mint a DirectX a Windows Vista előtt.
- Megosztott erőforrás létrehozásához hívjon meg minden erőforrás-létrehozási API-t (lásd alább) egy nem inicializált leíróval (maga a mutató nem NULL (pSharedHandle != NULL), de a mutató egy NULL értékre mutat (*pSharedHandle == NULL)). Az API létrehoz egy megosztott erőforrást, és érvényes leírót ad vissza.
- Ha egy korábban létrehozott megosztott erőforrást nemNULL megosztott erőforrás-leíróval szeretne megnyitni és elérni, állítsa a pSharedHandle értéket a leíró címére. Miután ilyen módon megnyitotta a korábban létrehozott megosztott erőforrást, használhatja a visszaadott felületet a Direct3D 9 vagy a Direct3D 9Ex API-ban, mintha az interfész egy ilyen típusú tipikus erőforrás volna.
Erőforrás-létrehozási API-k: - CreateTexture, CreateVolumeTexture, CreateCubeTexture, CreateRenderTarget, CreateVertexBuffer, CreateIndexBuffer, CreateDepthStencilSurface, CreateOffscreenPlainSurface, CreateDepthStencilSurfaceEx, CreateOffscreenPlainSurfaceExés CreateRenderTargetEx.
A megosztott erőforrások használatára bizonyos korlátozások vonatkoznak. Ezek a következők:
- A megosztott erőforrás megnyitásához használt API-nak meg kell egyeznie a megosztott erőforrás létrehozásához használt API-val. Ha például CreateTexture használt megosztott erőforrás létrehozásához, a megosztott erőforrás megnyitásához CreateTexture kell használnia; ha CreateRenderTarget használt megosztott erőforrás létrehozásához, a megosztott erőforrás megnyitásához CreateRenderTarget kell használnia; és így tovább.
- Megosztott erőforrás megnyitásakor meg kell adnia D3DPOOL_DEFAULT.
- A zárolható erőforrások (például D3DUSAGE_DYNAMIC textúrák, csúcspontpufferek és indexpufferek) teljesítménye csekély lehet, ha megosztásra kerülnek. A zárolható rendertargetek nem lesznek megosztva bizonyos hardvereken.
- A többfolyamatos megosztott erőforrásra mutató hivatkozásoknak azonos dimenziókkal kell rendelkezniük, mint az eredeti erőforrásnak. Ha egy fogantyút átad folyamatokon keresztül, tartalmazza a dimenzióadatokat, hogy a hivatkozás azonos módon hozható létre.
- A megosztott folyamatközi felületek nem biztosítanak szinkronizálási mechanizmust. Előfordulhat, hogy a megosztott felületen végzett olvasási/írási módosítások nem tükrözik a hivatkozási folyamatnak a felületre vonatkozó nézetét, amikor az várható. A szinkronizáció biztosításához használjon eseménylekérdezéseket, vagy zárolja a textúrát.
- Csak a megosztott erőforrást eredetileg létrehozó folyamat zárolhatja azt (a megosztott erőforrásra mutató hivatkozást megnyitó bármely folyamat nem tudja zárolni).
- Ha egy megosztott erőforrás zárolva van, más folyamatok nem ellenőrzik, hogy elérhető-e az erőforrás.
sRGB-átalakítás keverés előtt
Most ellenőrizheti, hogy az eszköz képes-e a folyamatadatokat sRGB-ra konvertálni a keretpufferek keverése előtt. Ez azt jelenti, hogy az eszköz átalakítja a renderelési célértékeket sRGB-ről. Ha ellenőrizni szeretné, hogy a hardver támogatja-e az átalakítást, ellenőrizze ezt a korlátot:
D3DPMISCCAPS_POSTBLENDSRGBCONVERT
Ez a korlát azonosítja azokat a hardvereket, amelyek támogatják az sRGB-ra való átalakítást a keverés előtt. Ez a képesség fontos az asztali ablakkezelőben (DWM) található fp16-os keretpufferek kiváló minőségű renderelése szempontjából.
A StretchRect fejlesztései
A DirectX korábbi verzióiban a StretchRect számos korlátozással rendelkezik a különböző illesztőprogramok elhelyezésére (lásd: IDirect3DDevice9::StretchRect). A Windows Vista a Windows-eszközillesztő-modellre (WDDM) épül. Ez az új illesztőprogram-modell sokkal robusztusabb, és lehetővé teszi, hogy az illesztőprogramok speciális eseteket kezeljenek a hardverben.
Általában az egyetlen fennmaradó korlátozás az, hogy a renderelési célnak render-cél használatával kell létrejönnie (D3DUSAGE_RENDERTARGET). Ez a korlátozás megszűnik, ha egyszerű másolatot készít (ahol a forrás és a dest formátuma azonos, azonos méretű, és nincsenek al téglalapok).
Textúra létrehozása a rendszermemóriában
Azok az alkalmazások, amelyek nagyobb rugalmasságot igényelnek a rendszermemória használata, lefoglalása és törlése során, mostantól a rendszermemória mutatóiból is létrehozhatnak textúrákat. Egy alkalmazás például létrehozhat egy Direct3D-textúrát egy GDI rendszermemória bitképmutatójából.
Két dolgot kell tennie egy ilyen textúra létrehozásához:
- Foglaljon le elegendő rendszermemóriát a textúra felületének tárolásához. A bájtok minimális száma a szélesség szorozva a magassággal szorozva a bájt/képpont értékkel.
- Adja át egy mutató címét a HANDLE* paraméter rendszermemória-felületére az IDirect3DDevice9::CreateTexture paraméternek.
Itt található az IDirect3DDevice9 függvény prototípusa::CreateTexture:
STDMETHOD(CreateTexture)(THIS_ UINT Width, UINT Height, UINT Levels,
DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture9** ppTexture,
HANDLE* pSharedHandle)
A rendszermemória-textúrákra a következő korlátozások vonatkoznak:
- A textúra pitchnek meg kell egyeznie a textúra szélessége és a képpontonkénti bájtok száma szorzatával.
- Tömörített formátumok (DXT-formátumok) használatakor az alkalmazás felelős a megfelelő méret kiosztásáért.
- Csak az egyetlen mipmap-szintű textúrák támogatottak.
- A Pool argumentum értékének a CreateTexture számára D3DPOOL_SYSTEMMEM-nek kell lennie.
- Ez az API egy anyagmintában burkolja a megadott memóriát. Ne szabadítsa fel ezt a memóriát, amíg nem végzett vele.