Aracılığıyla paylaş


Özellik Özeti (Windows Vista için Direct3D 9)

Bu belge özellikle DirectX grafikleri için Windows Vista uzantılarına yöneliktir. Windows Vista için DirectX'in gücünü geliştirmek için Windows Vista SDK'sının yanı sıra DirectX SDK'sını da yüklemeniz gerekir. Windows Vista için DirectX kullanan uygulamalar, XPDM (XP Sürücü Modeli) yerine WDDM sürücüsünü (Windows Cihaz Sürücü Modeli) kullanan donanımlar kullanıyor olmalıdır; WDDM'yi uygulamayan sürücüler Windows Vista DirectX grafik arabirimlerini başlatamaz.

Windows Vista'daki yeni DirectX grafik özelliklerini şu bölümlerden birinde keşfedin:

Cihaz Davranışı Değişiklikleri

Cihazlar artık yalnızca iki durumda kaybolur: donanım bir sorun nedeniyle sıfırlandığında ve cihaz sürücüsü durdurulduğunda. Donanım askıda olduğunda, ResetExçağrılarak cihaz sıfırlanabilir. Donanım askıda kalırsa doku belleği kaybolur.

Bir sürücü durdurulduktan sonra, işlemeye devam etmek için IDirect9Ex nesnesinin yeniden oluşturulması gerekir.

Sunu alanı pencere modunda başka bir pencere tarafından gizlendiğinde veya tam ekran bir uygulama simge durumuna küçültüldüğünde, PresentEx S_D3DPRESENTATIONOCCLUDED döndürür. Tam ekran uygulamalar, bir WM_ACTIVATEAPP geri dönüş iletisi aldığında işlemeye yeniden başlayabilir.

DirectX'in önceki sürümlerinde, bir uygulama mod değişikliğiyle karşılaştığında kurtarmanın tek yolu cihazı sıfırlamak ve tüm video bellek kaynaklarını yeniden oluşturmak ve zincirleri değiştirmekti. Şimdi Windows Vista için DirectX ile, mod değişikliğinden sonra Sıfırla çağrısı doku belleği yüzeylerinin, dokuların ve durum bilgilerinin kaybolmasına neden olmaz ve bu kaynakların yeniden oluşturulması gerekmez.

Çok İş Parçacıklı Yazılım Verteks İşlemeyi Devre Dışı Bırakma

Yazılım köşesi işleme (swvp) için çoklu iş parçacığı oluşturmayı devre dışı bırakacak yeni bir caps bit (D3DCREATE_DISABLE_PSGP_THREADING) eklendi. IDirect3D9::CreateDevice için bir davranış bayrağı oluşturmak için bu makroyı kullanın.

#define D3DCREATE_DISABLE_PSGP_THREADING

Tek Bit Yüzeyler

Metin karakterlerini işlemek için özellikle yararlı olabilecek yeni bir bit yüzey biçimi türü vardır. Yeni biçim D3DFMT_A1 olarak adlandırılır. Tek bit yüzey, piksel başına doku olarak veya ComposeRects veya ColorFill tarafından oluşturulan işleme hedef çıkışı olarak kullanılacak şekilde tasarlanmıştır. Yüzey genişliği ve yüksekliği için ayrı kapaklar yoktur; bir uygulama, 2K texels x 8K texels olan tek boyutlu bir yüzeyi desteklemelidir.

Bir bit yüzey, her texel için bir bit'e sahiptir; bu nedenle, bir, bir pikselin tüm bileşenlerinin (r,g,b,a) 1 olduğu, sıfır ise tüm bileşenlerin 0'a eşit olduğu anlamına gelir. Tek bit yüzeyleri şu API'lerle kullanabilirsiniz: ColorFill, UpdateSurface ve UpdateTexture.

Tek bitlik bir yüzey okunduğunda çalışma zamanı nokta örneği veya convolution filtrelemesi gerçekleştirebilir. Kıvrım filtresi ayarlanabilir (bkz. SetConvolutionMonoKernel).

Tek bit yüzeyler için bazı kısıtlamalar vardır:

  • Mip eşlemesi desteklenmiyor
  • sRGB verileri tek bitlik bir yüzeye okunamaz veya yazılamaz.
  • Tek bit yüzey köşe dokusu olarak veya çok örnekli örnekleme için kullanılamaz.

Okuma Derinliği/Kalıp Arabellekleri

IDirect3DDevice9::UpdateSurface kullanarak IDirect3DDevice9::CreateDepthStencilSurface veya IDirect3DDevice9::GetDepthStencilSurface'den alınan yüzeylerden derinlik/kalıp verilerini okuyun veya yazın.

İlk olarak, yalnızca kilitlenebilir, yalnızca derinlik veya yalnızca kalıp özelliklerine sahip bir yüzey oluşturmak için IDirect3DDevice9::CreateOffscreenPlainSurface kullanın. Aşağıdaki biçimlerden birini kullanın:

  • D3DFMT_D16_LOCKABLE
  • D3DFMT_D32F_LOCKABLE
  • D3DFMT_D32_LOCKABLE
  • D3DFMT_S8_LOCKABLE

İkincisi, derinlik/kalıp arabelleği ile yeni oluşturulan kilitlenebilir derinlik veya kalıp yüzeyi arasında veri aktarın. Aktarım, IDirect3DDevice9::UpdateSurface kullanılarak gerçekleştirilir.

Her iki yüzey de KILITLENEBILIR bir biçim olduğunda veya her ikisi de kilitlenemez olduğunda UpdateSurface başarısız olur.

Mevcut olmayan verilerin aktarılması hataya neden olur (örneğin, kilitlenmeyen yalnızca derinlikli bir yüzeyden D3DFMT_S8_LOCKABLE bir yüzeye aktarma).

IDirect3DDevice9::UpdateSurface kısıtlamalarının geri kalanı geçerli olmaya devam eder.

Kaynakları Paylaşma

Direct3D kaynakları artık cihazlar veya işlemler arasında paylaşılabilir. Bu, dokular, köşe arabellekleri, dizin arabellekleri veya yüzeyler (işleme hedefleri, derinlik kalıbı arabellekleri veya ekran dışı düz yüzeyler gibi) dahil tüm Direct3D kaynakları için geçerlidir. Paylaşılabilmesi için, oluşturma sırasında paylaşım için bir kaynak belirlemeniz ve kaynağı varsayılan havuzda (D3DPOOL_DEFAULT) bulmanız gerekir. Paylaşım için bir kaynak oluşturulduktan sonra, bir işlem içinde cihazlar arasında paylaşılabilir veya işlemler arasında paylaşılabilir.

Paylaşılan kaynakları etkinleştirmek için, kaynak oluşturma API'leri ek bir tanıtıcı parametresi içerir. Bu, paylaşılan kaynağa işaret eden bir TANıTıCıdır. DirectX'in önceki düzeltmelerinde bu bağımsız değişken API imzasının bir parçası olmuştur, ancak kullanılmamıştır ve NULLolarak ayarlanmalıdır. Windows Vista'dan başlayarak pSharedHandle'ı aşağıdaki yollarla kullanın:

  • Kaynağı paylaşmamak için işaretçiyi (pSharedHandle) NULL olarak ayarlayın. Bu, Windows Vista'nın öncesinde DirectX'in davranışı gibidir.
  • Paylaşılan bir kaynak oluşturmak için bir kaynak oluşturma API'sini (aşağıya bakın) başlatılmamış bir tanıtıcıyla çağırın. İşaretçinin kendisi NULL değil (pSharedHandle != NULL), ancak işaretçi NULL değerine işaret eder (*pSharedHandle == NULL). API paylaşılan bir kaynak oluşturur ve geçerli bir tanıtıcı döndürür.
  • Daha önce oluşturulmuş paylaşılan bir kaynağı açmak ve bu kaynağa erişmek için nonNULL paylaşılan kaynak tanıtıcısını kullanarak pSharedHandle'ı bu tanıtıcının adresine ayarlayın. Önceden oluşturulmuş paylaşılan kaynağı bu şekilde açtıktan sonra, Direct3D 9 veya Direct3D 9Ex API'sinde döndürülen arabirimi, arabirim bu tür tipik bir kaynakmış gibi kullanabilirsiniz.

Kaynak oluşturma API'ler şunlardır: CreateTexture, CreateVolumeTexture, CreateCubeTexture, CreateRenderTarget, CreateVertexBuffer, CreateIndexBuffer, CreateDepthStencilSurface, CreateOffscreenPlainSurface, CreateDepthStencilSurfaceEx, CreateOffscreenPlainSurfaceExve CreateRenderTargetEx.

Paylaşılan kaynakları kullanmak için bazı kısıtlamalar vardır. Bunlar şunlardır:

  • Paylaşılan bir kaynağı açmak için kullandığınız API, paylaşılan kaynağı oluştururken kullandığınız API ile eşleşmelidir. Örneğin, paylaşılan kaynak oluşturmak için CreateTexture kullandıysanız, paylaşılan kaynağı açmak için CreateTexture kullanmanız gerekir; Paylaşılan kaynak oluşturmak için CreateRenderTarget kullandıysanız, paylaşılan kaynağı açmak için createRenderTarget kullanmanız gerekir; ve benzeri.
  • Paylaşılan bir kaynağı açtığınızda D3DPOOL_DEFAULT belirtmeniz gerekir.
  • Kilitlenebilir kaynaklar (D3DUSAGE_DYNAMIC dokuları, köşe arabellekleri ve dizin arabellekleri gibi) paylaşıldığında performans sorunları yaşayabilir. Kilitlenebilir rendertarget'ler bazı donanımlarda paylaşılamaz.
  • Çapraz işlem paylaşılan kaynağına yapılan başvurular, özgün kaynakla aynı boyutlara sahip olmalıdır. Bir işlemden diğerine bir tutucu geçirirken, referansın aynı şekilde oluşturulabilmesi için boyut bilgilerini ekleyin.
  • Paylaşılan çapraz işlem yüzeyleri eşitleme mekanizması sağlamaz. Paylaşılan bir yüzeydeki okuma/yazma değişiklikleri, beklenen durumlarda başvuruda bulunan bir işlemin yüzey görünümünü yansıtmayabilir. Eşitleme sağlamak için olay sorgularını kullanın veya dokuyu kilitleyin.
  • Yalnızca başlangıçta paylaşılan kaynak oluşturan işlem bu kaynağı kilitleyebilir (bu paylaşılan kaynağa başvuru açan tüm işlemler bunu kilitleyemez).
  • Paylaşılan bir kaynak kilitliyse, diğer işlemlerin kaynağın kullanılabilir olup olmadığını bilmesi için doğrulama yoktur.

Karıştırmadan Önce sRGB Dönüştürme

Artık, cihazın çerçeve arabelleği karıştırmadan önce pipeline verilerini sRGB'ye dönüştürebilip dönüştüremediğini kontrol edebilirsiniz. Bu, cihazın işleme hedefi değerlerini sRGB'den dönüştürdüğü anlamına gelir. Dönüştürmenin donanım tarafından desteklenip desteklenmediğini görmek için şu üst sınırı denetleyin:

D3DPMISCCAPS_POSTBLENDSRGBCONVERT

Bu üst sınır, karıştırmadan önce sRGB'ye dönüştürmeyi destekleyen donanımı tanımlar. Bu özellik, masaüstü pencere yöneticisindeki (DWM) fp16 çerçeve arabelleklerinden yüksek kaliteli işleme için önemlidir.

StretchRect Geliştirmeleri

Önceki DirectX sürümlerinde StretchRect farklı sürücüleri barındırmak için birçok kısıtlamaya sahiptir (bkz. IDirect3DDevice9::StretchRect). Windows Vista, Windows Cihaz Sürücü Modeli (WDDM) üzerinde oluşturulmuştır. Bu yeni sürücü modeli çok daha sağlamdır ve sürücülerin donanımdaki özel durumları işlemesine olanak tanır.

Genel olarak, geriye kalan tek kısıtlama, işleme hedefinin işleme hedefi kullanımı (D3DUSAGE_RENDERTARGET) ile oluşturulmuş olması gerektiğidir. Basit bir kopya yapıyorsanız (kaynak ve dest aynı biçimde, aynı boyuttaysa ve alt dikdörtgenler yoksa) bu kısıtlama kaldırılır.

Sistem Belleğinde Doku Oluşturma

Sistem belleğinin kullanımı, ayrılması ve silinmesi üzerinde daha fazla esneklik gerektiren uygulamalar artık bir sistem bellek işaretçisinden dokular oluşturabilir. Örneğin, bir uygulama GDI sistem belleği bit eşlem işaretçisinden Direct3D dokusu oluşturabilir.

Böyle bir doku oluşturmak için iki şey yapmanız gerekir:

  • Doku yüzeyini tutmak için yeterli sistem belleği ayırın. En az bayt sayısı, piksel başına genişlik x yükseklik x bayttır.
  • HANDLE* parametresi için bir işaretçinin adresini, IDirect3DDevice9::CreateTexture yöntemi ile sistem bellek yüzeyine geçirin.

IDirect3DDevice9::CreateTexture için işlev prototipi aşağıdadır:

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

Sistem belleği dokusu aşağıdaki kısıtlamalara sahiptir:

  • Doku adımı, doku genişliğiyle piksel başına bayt sayısının çarpımına eşittir.
  • Sıkıştırılmış biçimleri (DXT biçimleri) kullanırken, uygulama doğru boyutu ayırmaktan sorumludur.
  • Yalnızca tek bir mipmap düzeyine sahip dokular desteklenir.
  • Pool bağımsız değişkeni için CreateTexture'a geçirilen değer D3DPOOL_SYSTEMMEM olmalıdır.
  • Bu API, sağlanan belleği bir dokuya sarmalar. Bu belleği kullanmayı bitirene kadar serbest bırakma.