Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Microsoft Direct3D 12'de, önceki sürümlerin hemen modu artık mevcut değildir. Bunun yerine, uygulamalar komut listeleri ve paketler oluşturur ve ardından GPU komutlarının kümelerini kaydeder. Komut kuyrukları yürütülecek komut listelerini göndermek için kullanılır. Bu model, geliştiricilerin hem grafik işleme biriminin (GPU) hem de CPU'nun verimli kullanımı üzerinde daha fazla denetim sahibi olmasını sağlar.
- Komut kuyruğuna genel bakış
- Komut kuyruğu başlatma
- Komut Listelerini Yürütme
- Birden çok komut kuyruğundan kaynaklara erişme
- Komut kuyruğu çitlerini kullanarak komut listesi yürütmesini eşitleme
- Komut kuyrukları tarafından erişilen kaynakları eşitleme
- Kutucuklu kaynaklar için Komut kuyruğu desteği
- İlgili konular
Komut kuyruğuna genel bakış
Direct3D 12 komut kuyrukları, önceden geliştiriciye sunulmamış olan anında mod iş gönderiminin çalışma zamanını ve sürücü eşitlemesini eşzamanlılık, paralellik ve eşitlemeyi açıkça yönetmek için API'lerle değiştirir. Komut kuyrukları geliştiriciler için aşağıdaki geliştirmeleri sağlar:
- Geliştiricilerin beklenmeyen eşitlemeden kaynaklanan yanlışlıkla verimsizlikleri önlemesine olanak tanır.
- Geliştiricilerin gerekli eşitlemenin daha verimli ve doğru bir şekilde belirlenebileceği daha yüksek bir düzeyde eşitleme sunmasını sağlar. Bu, çalışma zamanı ve grafik sürücüsünün paralellik mühendisliğine daha az zaman ayıracağı anlamına gelir.
- Pahalı işlemleri daha açık hale getirir.
Bu geliştirmeler aşağıdaki senaryoları etkinleştirir veya geliştirir:
- Artan paralellik - Uygulamalar, ön plan çalışması için ayrı kuyruklara sahip olduklarında video kod çözme gibi arka plan iş yükleri için daha derin kuyruklar kullanabilir.
- Zaman uyumsuz ve düşük öncelikli GPU çalışması - Komut kuyruğu modeli, bir GPU iş parçacığının engellenmeden başka bir zaman uyumsuz iş parçacığının sonuçlarını kullanmasını sağlayan düşük öncelikli GPU işinin ve atomik işlemlerin eşzamanlı yürütülmesini sağlar.
- Yüksek öncelikli işlem çalışması - Bu tasarım, 3B render işlemlerini kesintiye uğratarak, CPU üzerinde ek işleme için sonucun erken elde edilmesini sağlayacak az miktarda yüksek öncelikli işlem işini gerçekleştiren senaryoları mümkün kılar.
Komut kuyruğu başlatma
Komut kuyrukları id3D12Device::CreateCommandQueueçağrılarak oluşturulabilir. Bu yöntem, hangi kuyruk türünün oluşturulması gerektiğini ve bu nedenle bu kuyruğa hangi tür komutların gönderilebileceğini belirten bir D3D12_COMMAND_LIST_TYPE alır. Paketlerin yalnızca doğrudan komut listelerinden çağrılabileceğini ve doğrudan kuyruğa gönderilemeyeceğini unutmayın. Desteklenen kuyruk türleri şunlardır:
Genel olarak, DIRECT kuyrukları ve komut listeleri herhangi bir komutu kabul eder, İşlem kuyrukları ve komut listeleri işlem ve kopyalama ile ilgili komutları kabul eder ve COPY kuyrukları ve komut listeleri yalnızca kopyalama komutlarını kabul eder.
Komut Listeleri Çalıştırılıyor
Bir komut listesi kaydettikten ve varsayılan komut kuyruğunu aldıktan veya yenisini oluşturduktan sonra, id3D12CommandQueue::ExecuteCommandListsçağırarak komut listelerini yürütürsiniz.
Uygulamalar, komut listelerini birden çok iş parçacığından herhangi bir komut kuyruğuna gönderebilir. Çalışma zamanı, bu istekleri gönderme sırasına göre seri hale getirme işini gerçekleştirir.
Çalışma zamanı, gönderilen komut listesini doğrular ve kısıtlamalardan herhangi biri ihlal edilirse ExecuteCommandLists çağrısını iptal eder. Aramalar aşağıdaki nedenlerle bırakılır:
- Sağlanan komut listesi bir pakettir, doğrudan komut listesi değildir.
- ID3D12GraphicsCommandList::Close kaydı tamamlamak için sağlanan komut listesinde çağrılmadı.
- ID3D12CommandAllocator::Reset, kaydedildiğinden beri komut listesiyle ilişkilendirilen komut ayırıcısında çağrıldı. Komut ayırıcıları hakkında daha fazla bilgi için bkz. komut listeleri ve paketleri oluşturma ve kaydetme.
- Komut kuyruğu çiti, komut listesinin önceki bir yürütmesinin henüz tamamlanmadığını gösterir. Komut kuyruğu çitleri aşağıda ayrıntılı olarak açıklanmaktadır.
- ID3D12GraphicsCommandList::BeginQueryve ID3D12GraphicsCommandList::EndQueryçağrılarıyla ayarlanan sorgu öncesi ve sonrası durumları düzgün eşleşmez.
- Kaynak geçişi engellerinin önceki ve sonraki durumları düzgün eşleşmez. Daha fazla bilgi için bkz. Kaynak durumlarını eşitlemek için kaynak engellerini kullanma.
Birden çok komut kuyruğundan kaynaklara erişme
Çalışma zamanı tarafından uygulanan ve birden çok komut kuyruğundan kaynaklara erişimi kısıtlayan birkaç kural vardır. Bu kurallar şunlardır:
Bir kaynağa aynı anda birden çok komut kuyruğundan yazılamaz. Bir kaynak bir kuyrukta yazılabilir duruma geçtiğinde, yalnızca bu kuyruğa ait kabul edilir ve başka bir kuyruk tarafından erişilebilmesi için önce okuma veya ORTAK duruma (D3D12_RESOURCE_STATESbakın) geçiş yapması gerekir.
Okuma durumundayken, bir kaynak, okuma durumuna bağlı olarak işlemler arasında da dahil olmak üzere birden çok komut kuyruğundan aynı anda okunabilir.
Kaynak erişim kısıtlamaları ve kaynaklara erişimi eşitlemek için kaynak engellerini kullanma hakkında daha fazla bilgi için bkz. Kaynak durumlarını eşitlemek için kaynak engellerini kullanma.
Komut kuyruğu çitlerini kullanarak komut listesi yürütmesini eşitleme
Direct3D 12'de birden çok paralel komut kuyruğu desteği, GPU'da zaman uyumsuz çalışmanın önceliklendirilmesi üzerinde daha fazla esneklik ve denetim sağlar. Bu tasarım, özellikle bir kuyruktaki komut listeleri başka bir komut kuyruğu tarafından çalıştırılan kaynaklara bağımlı olduğunda uygulamaların iş eşitlemesini açıkça yönetmesi gerektiği anlamına da gelir. Bunun bazı örnekleri arasında, hesaplama kuyruğundaki bir işlemin tamamlanmasını bekleyerek sonucun 3B kuyruğundaki bir işleme kullanılabilmesi ve 3B işlemin tamamlanmasını bekleyerek hesaplama kuyruğundaki bir işlemin yazma için kaynağa erişebilmesi sayılabilir. Kuyruklar arasında iş eşitlemesini etkinleştirmek için Direct3D 12, ID3D12Fence arabirimi tarafından API'de temsil edilen çitler kavramını kullanır.
Çit, işlenen geçerli iş birimini temsil eden bir tamsayıdır. Uygulama ID3D12CommandQueue::Signalçağrısı yaparak çiti ilerlettiğinde tamsayı güncelleştirilir. Uygulamalar bir çitin değerini denetleyebilir ve sonraki bir işlemin başlatılıp başlatılmayabileceğine karar vermek için bir çalışma biriminin tamamlanıp tamamlanmadığını belirleyebilir.
Komut kuyrukları tarafından erişilen kaynakları eşitleme
Direct3D 12'de, bazı kaynakların durumunu eşitleme, kaynak engelleri ile uygulanır. Her kaynak engelinde, bir uygulama kaynağın önce ve sonra durumlarını bildirir. Bir kaynağın gölgelendirici kaynak görünümü arasında işleme hedef görünümüne geçmesi yaygın bir örnektir. Çoğunlukla, bu kaynak engelleri komut listelerinde yönetilir. Hata ayıklama katmanları etkinleştirildiğinde, sistem tüm kaynakların önceki ve sonraki durumlarının eşleşmesini zorunlu kılarak kaynağın bir engel geçişindeki belirli bir işlem için doğru durumda olduğunu garanti eder.
Kaynak durumunu eşitleme hakkında daha fazla bilgi için bkz. Kaynak durumlarını eşitlemek için kaynak engellerini kullanma.
Kutucuklu kaynaklar için komut kuyruğu desteği
Direct3D 11'de ID3D11DeviceContext2 arabirimi aracılığıyla kullanıma sunulan kutucuklu kaynakları yönetme yöntemleri, Direct3D 12'deki ID3D12CommandQueue arabirimi tarafından sağlanır. Bu yöntemler şunlardır:
| Yöntem | Açıklama |
|---|---|
| CopyTileMappings | Eşlemeleri kaynak dilimli kaynaktan hedef dilimli kaynağa kopyalar. |
| UpdateTileMappings | Kutucuklu kaynaklardaki kutucuk konumlarının eşlemelerini bir kaynak yığınındaki bellek konumlarıyla güncelleştirir. |
Direct3D 12 uygulamalarında kutucuklu kaynakları kullanma hakkında daha fazla bilgi için bkz. Direct3D11 Kutucuklu Kaynaklar.
İlgili konular
-
Direct3D 12 'da İş Gönderimi