Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
DXCore je rozhraní API pro výčet adaptéru pro zařízení DirectX, takže některé jeho funkce se překrývají s prvky DXGI.
DXCore umožňuje vystavení nových typů zařízení uživatelskému režimu, jako je MCDM (Microsoft Compute Driver Model), pro použití s Direct3D 12, DirectMLa Windows Machine Learning. DXCore, na rozdíl od DXGI, neposkytuje žádné informace o technologii nebo vlastnostech souvisejících se zobrazením
V následujících několika částech se podíváme na hlavní funkce DXCore s některými příklady kódu (napsanými v C++/WinRT). Níže uvedené příklady kódu jsou extrahovány z úplného výpisu zdrojového kódu, který najdete v tématu Minimal DXCore aplikace.
Vytvořit továrnu na adaptéry
Proces výčtu adaptéru DXCore začnete vytvořením objektu továrny adaptéru, který je reprezentován rozhraním IDXCoreAdapterFactory. Pokud chcete vytvořit továrnu, zahrňte hlavičkový soubor dxcore.h a volejte bezplatnou funkci DXCoreCreateAdapterFactory.
#include <dxcore.h>
...
winrt::com_ptr<IDXCoreAdapterFactory> adapterFactory;
winrt::check_hresult(::DXCoreCreateAdapterFactory(adapterFactory.put()));
Načtení seznamu adaptérů
Na rozdíl od DXGI nově vytvořená továrna adaptéru DXCore automaticky nevytvoří snímek stavu adaptéru systému. Místo toho DXCore vytvoří tento snímek při explicitním načtení objektu seznamu adaptérů, který je reprezentován rozhraním IDXCoreAdapterList.
winrt::com_ptr<IDXCoreAdapterList> d3D12CoreComputeAdapters;
GUID attributes[]{ DXCORE_ADAPTER_ATTRIBUTE_D3D12_CORE_COMPUTE };
winrt::check_hresult(
adapterFactory->CreateAdapterList(_countof(attributes),
attributes,
d3D12CoreComputeAdapters.put()));
V seznamu vyberte příslušný adaptér.
Tato část ukazuje, jak vzhledem k objektu seznamu adaptérů můžete v seznamu najít první hardwarový adaptér.
Metoda IDXCoreAdapterList::GetAdapterCount informuje o počtu prvků v seznamu a IDXCoreAdapterList::GetAdapter načte konkrétní adaptér podle indexu.
Vlastnosti tohoto adaptéru pak můžete dotazovat pomocí následujícího postupu.
- Nejprve ověřte, že je možné načíst hodnotu dané vlastnosti pro tento adaptér v této verzi operačního systému tím, že zavoláte IDXCoreAdapter::IsPropertySupported. Předáním hodnoty DXCoreAdapterProperty výčtu určete, o které vlastnosti se dotazujete.
- Volitelně potvrďte velikost hodnoty vlastnosti voláním IDXCoreAdapter::GetPropertySize. Pro vlastnost, jako je DXCoreAdapterProperty::IsHardware, což je jednoduchá logická hodnota, tento krok není nutný.
- A nakonec načtěte hodnotu vlastnosti voláním IDXCoreAdapter::GetProperty.
winrt::com_ptr<IDXCoreAdapter> preferredAdapter;
const uint32_t count{ d3D12CoreComputeAdapters->GetAdapterCount() };
for (uint32_t i = 0; i < count; ++i)
{
winrt::com_ptr<IDXCoreAdapter> candidateAdapter;
winrt::check_hresult(
d3D12CoreComputeAdapters->GetAdapter(i, candidateAdapter.put()));
bool isHardware{ false };
winrt::check_hresult(candidateAdapter->GetProperty(
DXCoreAdapterProperty::IsHardware,
&isHardware));
if (isHardware)
{
// Choose the first hardware adapter, and stop looping.
preferredAdapter = candidateAdapter;
break;
}
// Otherwise, ensure that (as long as there are *any* adapters) we'll
// at least choose one.
if (!preferredAdapter)
{
preferredAdapter = candidateAdapter;
}
}
Výběr upřednostňovaného adaptéru seřazením seznamu adaptérů
Seznam adaptérů DXCore můžete seřadit voláním metody IDXCoreAdapterList::Sort.
DXCoreAdapterPreference výčet definuje hodnoty představující kritéria řazení. Předejte pole těchto hodnot do Seřadita potom přečtěte první adaptér v seřazeném seznamu.
Chcete-li zjistit, zda bude typ řazení pochopen Řazením, nejprve zavolejte IDXCoreAdapterList::IsAdapterPreferenceSupported.
winrt::com_ptr<IDXCoreAdapter> TryFindHardwareHighPerformanceGraphicsAdapter()
{
// You begin DXCore adapter enumeration by creating an adapter factory.
winrt::com_ptr<IDXCoreAdapterFactory> adapterFactory;
winrt::check_hresult(::DXCoreCreateAdapterFactory(adapterFactory.put()));
// From the factory, retrieve a list of all the Direct3D 12 Graphics adapters.
winrt::com_ptr<IDXCoreAdapterList> d3D12GraphicsAdapters;
GUID attributes[]{ DXCORE_ADAPTER_ATTRIBUTE_D3D12_GRAPHICS };
winrt::check_hresult(
adapterFactory->CreateAdapterList(_countof(attributes),
attributes,
d3D12GraphicsAdapters.put()));
DXCoreAdapterPreference sortPreferences[]{
DXCoreAdapterPreference::Hardware, DXCoreAdapterPreference::HighPerformance };
// Ask the OS to sort for the highest performance hardware adapter.
winrt::check_hresult(d3D12GraphicsAdapters->Sort(_countof(sortPreferences), sortPreferences));
winrt::com_ptr<IDXCoreAdapter> preferredAdapter;
if (d3D12GraphicsAdapters->GetAdapterCount() > 0)
{
winrt::check_hresult(d3D12GraphicsAdapters->GetAdapter(0, preferredAdapter.put()));
}
return preferredAdapter;
}
Dotazování a nastavení stavu adaptéru (vlastnosti)
Stav zadané položky stavu adaptéru můžete načíst a nastavit voláním metod IDXCoreAdapter::QueryState a IDXCoreAdapter::SetState metody.
void SetDesiredMemoryReservation(winrt::com_ptr<IDXCoreAdapter> const& adapter, uint64_t reservation)
{
DXCoreAdapterMemoryBudgetNodeSegmentGroup nodeSegmentGroup{};
nodeSegmentGroup.nodeIndex = 0;
nodeSegmentGroup.segmentGroup = DXCoreSegmentGroup::Local;
DXCoreAdapterMemoryBudget memoryBudget{};
winrt::check_hresult(adapter->QueryState(
DXCoreAdapterState::AdapterMemoryBudget,
&nodeSegmentGroup,
&memoryBudget));
// Clamp the reservation to what's available.
reservation = std::min<uint64_t>(reservation, memoryBudget.availableForReservation);
winrt::check_hresult(adapter->SetState(
DXCoreAdapterState::AdapterMemoryBudget,
&nodeSegmentGroup,
&reservation));
}
V praxi byste měli před voláním QueryState a SetStatevolat IsQueryStateSupported, abyste potvrdili, že dotazování typu stavu je dostupné pro tento adaptér a operační systém (OS).
Aktuálnost seznamu adaptérů
Pokud se seznam adaptérů stane zastaralým kvůli měnícím se systémovým podmínkám, označí se jako takový. Aktuálnost seznamu adaptérů můžete určit dotazováním metody IDXCoreAdapterList::IsStale.
Pohodlnější možností je přihlásit se k odběru oznámení pro podmínky, jako je zastaralost. K tomu předejte DXCoreNotificationType::AdapterListStale do IDXCoreAdapterFactory::RegisterEventNotificationa bezpečně uložte vrácený soubor cookie pro pozdější použití.
uint32_t m_eventCookie = 0;
...
winrt::check_hresult(factory->RegisterEventNotification(
m_adapters.get(),
DXCoreNotificationType::AdapterListStale,
OnAdapterListStale,
this,
&m_eventCookie));
...
static void WINAPI OnAdapterListStale(
DXCoreNotificationType notificationType,
IUnknown* staleObject,
void* context)
{
...
}
Potom můžete vygenerovat nový, aktuální objekt seznamu adaptérů z objektu továrny, který už máte. Zpracování těchto podmínek je důležité pro vaši schopnost bezproblémově reagovat na události, jako je doručení a odebrání adaptéru (ať už gpu nebo specializovaný výpočetní adaptér), a k odpovídajícímu přesunu úloh v reakci.
Než zničíte objekt seznamu adaptérů, je nutné použít hodnotu cookie k zrušení registrace objektu z oznámení voláním IDXCoreAdapterFactory::UnregisterEventNotification. Pokud se neodregistrujete, při zjištění situace se vyvolá závažná výjimka.
HRESULT hr = factory->UnregisterEventNotification(m_eventCookie);
Zobrazení informací
Poznámka
DXCore sama o sobě neposkytuje žádné informace o zobrazení. V případě potřeby byste k načtení těchto informací měli použít modul Windows Runtime DisplayMonitor třídy. Identifikátor LUID adaptéru poskytuje běžný identifikátor, který můžete použít k mapování adaptéru DXCore na DisplayMonitor.DisplayAdapterId informací. Pokud chcete získat LUID adaptéru, předat DXCoreAdapterProperty::InstanceLuid do metody IDXCoreAdapter::GetProperty.
Seznam adaptérů pro mediální úlohy
I když metoda IDXCoreAdapterFactory1::CreateAdapterListByWorkload umožňuje zadat specifické filtry pro úlohy, modul runtime a hardware, doporučujeme omezit filtrování na to, co je nezbytné. Hlavním důvodem je zajistit kompatibilitu napříč širokou škálou konfigurací koncových uživatelů. Na DXCore se můžete spolehnout, když aplikaci poskytnete nejvhodnější adaptér v první položce seznamu adaptérů; a v případě potřeby můžete zbytek ignorovat. V tomto příkladu vytvoříme seznam adaptérů pro úlohu média (tj. zpracování videa), u které budou akcelerátory médií upřednostňovány pomocí DXCore.
void EnumerateAcceleratorsForMedia(ComPtr<IDXCoreAdapterList> &accelsForMedia)
{
ComPtr<IDXCoreAdapterFactory1> adapterFactory;
winrt::check_hresult(DXCoreCreateAdapterFactory(&adapterFactory));
winrt::check_hresult(adapterFactory->CreateAdapterListByWorkload(
DXCoreWorkload::Media,
DXCoreRuntimeFilterFlags::None,
DXCoreHardwareTypeFilterFlags::None,
&accelsForMedia));
// Ordering for returned adapter list:
// - Media only
// - Media and ML
// - Media with Compute shaders
// - Media with full GPU
}
Vytvoření výčtu NPU pro úlohy ML
V některých případech je vhodné seznam adaptérů dále zúžit pro IDXCoreAdapterFactory1::CreateAdapterListByWorkload, například v případě, že chcete na NPU efektivně zpracovávat úlohy strojového učení. Tento příklad poskytne seznam adaptérů, který se skládá z NPU schopných zpracovávat úlohy ML prostřednictvím meta-příkazů DirectX, aniž by zahrnoval grafické procesory a výpočetní akcelerátory.
void EnumerateNPUsForML(ComPtr<IDXCoreAdapterList> &npus)
{
ComPtr<IDXCoreAdapterFactory1> adapterFactory;
winrt::check_hresult(DXCoreCreateAdapterFactory(&adapterFactory));
winrt::check_hresult(adapterFactory->CreateAdapterListByWorkload(
DXCoreWorkload::MachineLearning,
DXCoreRuntimeFilterFlags::None,
DXCoreHardwareTypeFilterFlags::NPU,
&npus));
// Ordering for returned adapter list:
// - NPUs with metacommands
// - NPUs with metacommands and compute shaders
}
Zobrazení výčtu adaptérů s ovladači uživatelského režimu DirectX nebo bez
DXCore podporuje výčet zařízení MCDM/WDDM, která neposkytují ovladač uživatelského režimu Direct 3D (ale místo toho se spoléhají na privátní rozhraní nebo jiné knihovny pro interakci). Tato zařízení se nedají vyjmenovat prostřednictvím IDXCoreAdapterFactory1::CreateAdapterListByWorkload, protože tato metoda je zamýšlená tak, aby podporovala případy použití týkající se zásobníku DirectX. Tato úzká třída adaptérů bude však enumerovat prostřednictvím IDXCoreAdapterFactory::CreateAdapterList metoda pomocí nových atributů hardwarového typu. Tento příklad vytvoří výčet všech adaptérů v systému bez ohledu na podporu modulu runtime Direct 3D a přidá ho do mapy s identifikátorem GUID atributu typu hardwaru jako klíčem.
void EnumerateAllAdapters(std::map<GUID, ComPtr<IDXCoreAdapterList>> &adapterListByType)
{
ComPtr<IDXCoreAdapterFactory> adapterFactory;
winrt::check_hresult(DXCoreCreateAdapterFactory(&adapterFactory));
const GUID attributes[] = {
DXCORE_HARDWARE_TYPE_ATTRIBUTE_GPU,
DXCORE_HARDWARE_TYPE_ATTRIBUTE_COMPUTE_ACCELERATOR,
DXCORE_HARDWARE_TYPE_ATTRIBUTE_NPU,
DXCORE_HARDWARE_TYPE_ATTRIBUTE_MEDIA_ACCELERATOR,
};
for(uint32_t i = 0; i < ARRAYSIZE(attributes); ++i)
{
ComPtr<IDXCoreAdapterList> adapterList = nullptr;
winrt::check_hresult(adapterFactory->CreateAdapterList(1, attributes[i], &adapterList));
if(adapterList->GetAdapterCount() > 0)
{
adapterListByType.insert({attributes[i], adapterList});
}
}
}