Aracılığıyla paylaş


Direct3D 11 on 12

D3D11On12, geliştiricilerin D3D12 API'sini yönlendirmek için D3D11 arabirimlerini ve nesnelerini kullanabileceği bir mekanizmadır. D3D11on12, D3D11 kullanılarak yazılan bileşenlerin (örneğin, D2D metni ve kullanıcı arabirimi) D3D12 API'sini hedefleyen yazılmış bileşenlerle birlikte çalışmasını sağlar. D3D11on12, bir uygulamanın D3D11'den D3D12'ye artımlı olarak taşımasını da sağlar ve uygulamanın bazı bölümlerinin basitlik için D3D11'i hedeflemeye devam etmesini sağlarken, diğerleri performans için D3D12'yi hedeflerken her zaman eksiksiz ve doğru işlemeye sahip olur. D3D11On12, kaynakları paylaşmak ve iki API arasındaki işi eşitlemek için birlikte çalışma tekniklerini kullanmaktan daha basit hale getirir.

D3D11On12 Başlat

D3D11On12 kullanmaya başlamak için ilk adım bir D3D12 cihazı ve komut kuyruğu oluşturmaktır. Bu nesneler D3D11On12CreateDevicebaşlatma yöntemine giriş olarak sağlanır. Bu yöntemi, D3D11 sürücüsünün nesneleri oluşturmak ve D3D12 API'sine komut listeleri göndermekle sorumlu olduğu hayali sürücü türü D3D_DRIVER_TYPE_11ON12 bir D3D11 cihazı oluşturmak olarak düşünebilirsiniz.

Bir D3D11 cihazınız ve hemen bağlamı olduktan sonra ID3D11On12Device arabirimi için cihazın QueryInterface. Bu, D3D11 ile D3D12 arasında birlikte çalışma için kullanılan birincil arabirimdir. Hem D3D11 cihaz bağlamının hem de D3D12 komut listelerinin aynı kaynaklarda çalışması için CreateWrappedResourceAPI'sinikullanarak "sarmalanmış kaynaklar" oluşturmak gerekir. Bu yöntem, D3D12 kaynağını D3D11'de anlaşılabilir olacak şekilde "yükseltir". Sarmalanan kaynak, AcquireWrappedResources ve ReleaseWrappedResources yöntemleri tarafından yönetilen bir özellik olan "alındı" durumunda başlar.

Örnek Kullanım

D3D11On12'nin tipik kullanımı, D3D12 arka arabelleğinde metin veya görüntüleri işlemek için D2D kullanmaktır. Kod örneği için D3D11On12 örneğine bakın. Bunu yapmak için atılması gereken adımların kaba bir ana hattı aşağıdadır:

  • D3D12 cihazı (D3D12CreateDevice) ve D3D12 takas zinciri (ID3D12CommandQueue ile CreateSwapChain) oluşturun.
  • D3D12 cihazını ve girişle aynı komut kuyruğunun kullanıldığı bir D3D11On12 cihazı oluşturun.
  • Değiştirme zinciri geri arabelleklerini alın ve her biri için D3D11 sarmalanmış kaynakları oluşturun. Kullanılan giriş durumu, D3D12'nin bunu kullandığı son yol olmalıdır (örneğin, RENDER_TARGET) ve çıkış durumu D3D11 bittikten sonra (örneğin, MEVCUT) D3D12'nin bunu kullanacağı şekilde olmalıdır.
  • D2D'yi başlatın ve işlemeye hazırlanmak için D3D11 sarmalanmış kaynaklarını D2D'ye sağlayın.

Ardından, her çerçevede aşağıdakileri yapın:

  • D3D12 komut listesini kullanarak geçerli takas zinciri arka arabelleğinde işleyin ve yürütür.
  • Geçerli geri arabelleğinin sarmalanmış kaynağını ( AcquireWrappedResources) alın.
  • D2D işleme komutları verme.
  • Sarmalanmış kaynağı ( releaseWrappedResources)bırakın.
  • D3D11 anında bağlamını boşaltın.
  • Present (IDXGISwapChain1::P resent1).

Arka plan

D3D11On12 sistematik olarak çalışır. Her D3D11 API çağrısı tipik çalışma zamanı doğrulamasından geçer ve sürücüye gider. Sürücü katmanında, özel 11on12 sürücü durumu kaydeder ve D3D12 komut listelerine işleme işlemlerini kaydeder. Bu komut listeleri gerektiğinde (örneğin, sorgu GetData veya kaynak Map komutların boşaltılması gerekebilir) veya Flush tarafından istendiği şekilde gönderilir. Bir D3D11 nesnesi oluşturmak genellikle ilgili D3D12 nesnesinin oluşturulmasına neden olur. D3D11'de GenerateMips veya DrawAuto gibi bazı sabit işlev işleme işlemleri D3D12'de desteklenmez ve bu nedenle D3D11On12 bunları gölgelendiriciler ve ek kaynaklar kullanarak öykünmektedir.

Birlikte çalışma için D3D11On12 uygulamasının oluşturduğu ve sağladığı D3D12 nesneleriyle nasıl etkileşime geçtiğini anlamak önemlidir. İşin doğru sırada gerçekleşmesini sağlamak için, ek D3D12 çalışmalarının bu kuyruğa gönderilebilmesi için önce D3D11 anlık bağlamı boşaltılmalıdır. D3D11On12'ye verilen kuyruğun her zaman boşaltılabilir olmasını sağlamak da önemlidir. Bu, D3D11 iş parçacığı bloklarını süresiz olarak işlese bile kuyruktaki tüm beklemelerin sonunda karşılanması gerektiği anlamına gelir. D3D11On12 eklerken temizlemeler veya beklemeler olduğunda bağımlılık almamaya dikkat edin, bu durum gelecek sürümlerde değişebilir. Ayrıca, D3D11On12 kaynak durumlarını kendi başına izler ve işler. Durum geçişlerinin tutarlılığını sağlamanın tek yolu, durum izlemeyi uygulamanın gereksinimlerine uyacak şekilde işlemek için alma/sürüm API'lerinden yararlanmaktır.

Temizleme

D3D11On12 sarmalanmış bir kaynağı serbest bırakmak için şu sırayla iki şeyin gerçekleşmesi gerekir:

  • Kaynağın tüm görünümleri de dahil olmak üzere kaynağa yapılan tüm başvuruların yayımlanması gerekir.
  • Ertelenmiş imha işlemi gerçekleşmelidir. Bunun gerçekleşmesini sağlamanın en basit yolu, api'Flush hemen bağlamı çağırmaktır.

Bu adımların her ikisi de tamamlandıktan sonra sarmalanan kaynak tarafından yapılan tüm başvurular serbest bırakılmalıdır ve D3D12 kaynağı yalnızca D3D12 bileşenine aittir. D3D12'nin bir kaynağı tamamen yayınlamadan önce GPU tamamlanmasını beklemeye devam ettiğini unutmayın. Bu nedenle, GPU'nun artık kaynağı kullanmadığını onaylamadığınız sürece yukarıdaki iki adımı gerçekleştirmeden önce kaynakta bir başvuru tutmayı unutmayın.

D3D11On12 tarafından oluşturulan diğer tüm kaynaklar veya nesneler, GPU bunları kullanmayı bitirdiğinde, D3D11'in ertelenen yok etme mekanizması kullanılarak uygun zamanda temizlenir. Ancak GPU yürütülürken D3D11On12 cihazının kendisini serbest bırakmaya çalışırsanız, GPU tamamlanana kadar yok etme işlemi engellenebilir.

Sınırlama

D3D11On12 katmanı, D3D11 API'sinin çok büyük bir alt kümesini uygular, ancak bazı bilinen boşluklar vardır (uygulamada yanlış işlemeye neden olabilecek hatalara ek olarak).

Windows 10, sürüm 1809 (10.0; Derleme 17763), D3D11On12, Shader Model 6.0 veya üzerini destekleyen bir sürücüde çalıştığı sürece, arabirimleri kullanan gölgelendiricileri çalıştırabilir. Windows'un önceki sürümlerinde gölgelendirici arabirimleri özelliği D3D11On12'de uygulanmaz ve özelliği kullanmaya çalışmak hatalara ve hata ayıklama iletilerine neden olur.

Windows 10, sürüm 1803 (10.0; Derleme 17134), takas zincirleri D3D11On12 cihazlarda desteklenir. Windows'un önceki sürümlerinde bu sürümler değildir.

D3D11On12, performans için iyileştirilmemiştir. Standart bir D3D11 sürücüsüne kıyasla orta düzeyde CPU yükü, minimum GPU yükü ve önemli bellek yükü olduğu bilinmektedir. Bu nedenle karmaşık 3B sahneler için D3D11On12 kullanılması önerilmez ve bunun yerine basit sahneler veya 2B işleme için önerilir.

Apı 'leri

11on12 katmanını oluşturan API'ler 11on12 Başvuruiçinde açıklanmıştır.

D3D11on12 kullanarak D2D

Direct3D 12 'i Anlama

Direct3D 11, Direct3D 10 ve Direct2D ile çalışma