[D3D12] Add DXGIAdapter to AdapterDiscoveryOptions
This gives Chromium the option to give Dawn the correct dxgi adapter to use
Bug: chromium:1036711
Change-Id: Ica544d2e76d1c300038fa07b5b639a35c43f60b9
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/24761
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
Reviewed-by: Rafael Cintron <rafael.cintron@microsoft.com>
Commit-Queue: Natasha Lee <natlee@microsoft.com>
diff --git a/src/dawn_native/d3d12/BackendD3D12.cpp b/src/dawn_native/d3d12/BackendD3D12.cpp
index 46dc1b6..7075093 100644
--- a/src/dawn_native/d3d12/BackendD3D12.cpp
+++ b/src/dawn_native/d3d12/BackendD3D12.cpp
@@ -70,6 +70,18 @@
return std::move(factory);
}
+ ResultOrError<std::unique_ptr<AdapterBase>> CreateAdapterFromIDXGIAdapter(
+ Backend* backend,
+ ComPtr<IDXGIAdapter> dxgiAdapter) {
+ ComPtr<IDXGIAdapter3> dxgiAdapter3;
+ DAWN_TRY(CheckHRESULT(dxgiAdapter.As(&dxgiAdapter3), "DXGIAdapter retrieval"));
+ std::unique_ptr<Adapter> adapter =
+ std::make_unique<Adapter>(backend, std::move(dxgiAdapter3));
+ DAWN_TRY(adapter->Initialize());
+
+ return {std::move(adapter)};
+ }
+
} // anonymous namespace
Backend::Backend(InstanceBase* instance)
@@ -127,23 +139,34 @@
}
ASSERT(dxgiAdapter != nullptr);
-
- ComPtr<IDXGIAdapter3> dxgiAdapter3;
- HRESULT result = dxgiAdapter.As(&dxgiAdapter3);
- ASSERT(SUCCEEDED(result));
-
- std::unique_ptr<Adapter> adapter =
- std::make_unique<Adapter>(this, std::move(dxgiAdapter3));
- if (GetInstance()->ConsumedError(adapter->Initialize())) {
+ ResultOrError<std::unique_ptr<AdapterBase>> adapter =
+ CreateAdapterFromIDXGIAdapter(this, dxgiAdapter);
+ if (adapter.IsError()) {
+ adapter.AcquireError();
continue;
}
- adapters.push_back(std::move(adapter));
+ adapters.push_back(std::move(adapter.AcquireSuccess()));
}
return adapters;
}
+ ResultOrError<std::vector<std::unique_ptr<AdapterBase>>> Backend::DiscoverAdapters(
+ const AdapterDiscoveryOptionsBase* optionsBase) {
+ ASSERT(optionsBase->backendType == WGPUBackendType_D3D12);
+ const AdapterDiscoveryOptions* options =
+ static_cast<const AdapterDiscoveryOptions*>(optionsBase);
+
+ ASSERT(options->dxgiAdapter != nullptr);
+
+ std::unique_ptr<AdapterBase> adapter;
+ DAWN_TRY_ASSIGN(adapter, CreateAdapterFromIDXGIAdapter(this, options->dxgiAdapter));
+ std::vector<std::unique_ptr<AdapterBase>> adapters;
+ adapters.push_back(std::move(adapter));
+ return std::move(adapters);
+ }
+
BackendConnection* Connect(InstanceBase* instance) {
Backend* backend = new Backend(instance);
diff --git a/src/dawn_native/d3d12/BackendD3D12.h b/src/dawn_native/d3d12/BackendD3D12.h
index 403943a..87c2d13 100644
--- a/src/dawn_native/d3d12/BackendD3D12.h
+++ b/src/dawn_native/d3d12/BackendD3D12.h
@@ -35,6 +35,8 @@
const PlatformFunctions* GetFunctions() const;
std::vector<std::unique_ptr<AdapterBase>> DiscoverDefaultAdapters() override;
+ ResultOrError<std::vector<std::unique_ptr<AdapterBase>>> DiscoverAdapters(
+ const AdapterDiscoveryOptionsBase* optionsBase) override;
private:
// Keep mFunctions as the first member so that in the destructor it is freed last. Otherwise
diff --git a/src/dawn_native/d3d12/D3D12Backend.cpp b/src/dawn_native/d3d12/D3D12Backend.cpp
index f78975e..7196599 100644
--- a/src/dawn_native/d3d12/D3D12Backend.cpp
+++ b/src/dawn_native/d3d12/D3D12Backend.cpp
@@ -69,4 +69,7 @@
return reinterpret_cast<WGPUTexture>(texture.Detach());
}
+ AdapterDiscoveryOptions::AdapterDiscoveryOptions(ComPtr<IDXGIAdapter> adapter)
+ : AdapterDiscoveryOptionsBase(WGPUBackendType_D3D12), dxgiAdapter(std::move(adapter)) {
+ }
}} // namespace dawn_native::d3d12
diff --git a/src/include/dawn_native/D3D12Backend.h b/src/include/dawn_native/D3D12Backend.h
index bdefdf3..035ad96 100644
--- a/src/include/dawn_native/D3D12Backend.h
+++ b/src/include/dawn_native/D3D12Backend.h
@@ -18,6 +18,7 @@
#include <dawn/dawn_wsi.h>
#include <dawn_native/DawnNative.h>
+#include <DXGI1_4.h>
#include <windows.h>
#include <wrl/client.h>
@@ -52,6 +53,12 @@
DAWN_NATIVE_EXPORT WGPUTexture
WrapSharedHandle(WGPUDevice device, const ExternalImageDescriptorDXGISharedHandle* descriptor);
+ struct DAWN_NATIVE_EXPORT AdapterDiscoveryOptions : public AdapterDiscoveryOptionsBase {
+ AdapterDiscoveryOptions(Microsoft::WRL::ComPtr<IDXGIAdapter> adapter);
+
+ Microsoft::WRL::ComPtr<IDXGIAdapter> dxgiAdapter;
+ };
+
}} // namespace dawn_native::d3d12
#endif // DAWNNATIVE_D3D12BACKEND_H_