From 29eea269fc2ee45d40ab46c77ad0fcbc4ae43c54 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 3 Nov 2016 06:39:24 -0700 Subject: [PATCH] libobs-d3d11: Store dxgi adapter used for device Keeping a reference is useful, and additionally allows pruning a bit of duplicated code in the dupicator object. --- libobs-d3d11/d3d11-duplicator.cpp | 13 +------------ libobs-d3d11/d3d11-subsystem.cpp | 12 +++++------- libobs-d3d11/d3d11-subsystem.hpp | 5 +++-- 3 files changed, 9 insertions(+), 21 deletions(-) diff --git a/libobs-d3d11/d3d11-duplicator.cpp b/libobs-d3d11/d3d11-duplicator.cpp index 547522bb1..d03478802 100644 --- a/libobs-d3d11/d3d11-duplicator.cpp +++ b/libobs-d3d11/d3d11-duplicator.cpp @@ -20,20 +20,9 @@ static inline bool get_monitor(gs_device_t *device, int monitor_idx, IDXGIOutput **dxgiOutput) { - ComPtr dxgiAdapter; - ComPtr dxgiDevice; HRESULT hr; - hr = device->device->QueryInterface(__uuidof(IDXGIDevice), - (void**)dxgiDevice.Assign()); - if (FAILED(hr)) - throw HRError("Failed to query IDXGIDevice", hr); - - hr = dxgiDevice->GetAdapter(dxgiAdapter.Assign()); - if (FAILED(hr)) - throw HRError("Failed to get adapter", hr); - - hr = dxgiAdapter->EnumOutputs(monitor_idx, dxgiOutput); + hr = device->adapter->EnumOutputs(monitor_idx, dxgiOutput); if (FAILED(hr)) { if (hr == DXGI_ERROR_NOT_FOUND) return false; diff --git a/libobs-d3d11/d3d11-subsystem.cpp b/libobs-d3d11/d3d11-subsystem.cpp index 9e2e401af..88419ea1c 100644 --- a/libobs-d3d11/d3d11-subsystem.cpp +++ b/libobs-d3d11/d3d11-subsystem.cpp @@ -171,7 +171,7 @@ void gs_device::InitCompiler() throw "Could not find any D3DCompiler libraries"; } -void gs_device::InitFactory(uint32_t adapterIdx, IDXGIAdapter1 **padapter) +void gs_device::InitFactory(uint32_t adapterIdx) { HRESULT hr; IID factoryIID = (GetWinVer() >= 0x602) ? dxgiFactory2 : @@ -181,7 +181,7 @@ void gs_device::InitFactory(uint32_t adapterIdx, IDXGIAdapter1 **padapter) if (FAILED(hr)) throw UnsupportedHWError("Failed to create DXGIFactory", hr); - hr = factory->EnumAdapters1(adapterIdx, padapter); + hr = factory->EnumAdapters1(adapterIdx, &adapter); if (FAILED(hr)) throw UnsupportedHWError("Failed to enumerate DXGIAdapter", hr); } @@ -194,7 +194,7 @@ const static D3D_FEATURE_LEVEL featureLevels[] = D3D_FEATURE_LEVEL_9_3, }; -void gs_device::InitDevice(uint32_t adapterIdx, IDXGIAdapter *adapter) +void gs_device::InitDevice(uint32_t adapterIdx) { wstring adapterName; DXGI_ADAPTER_DESC desc; @@ -423,8 +423,6 @@ void gs_device::UpdateViewProjMatrix() gs_device::gs_device(uint32_t adapterIdx) : curToplogy (D3D11_PRIMITIVE_TOPOLOGY_UNDEFINED) { - ComPtr adapter; - matrix4_identity(&curProjMatrix); matrix4_identity(&curViewMatrix); matrix4_identity(&curViewProjMatrix); @@ -437,8 +435,8 @@ gs_device::gs_device(uint32_t adapterIdx) } InitCompiler(); - InitFactory(adapterIdx, adapter.Assign()); - InitDevice(adapterIdx, adapter); + InitFactory(adapterIdx); + InitDevice(adapterIdx); device_set_render_target(this, NULL, NULL); } diff --git a/libobs-d3d11/d3d11-subsystem.hpp b/libobs-d3d11/d3d11-subsystem.hpp index d41350834..8f5a1b6f5 100644 --- a/libobs-d3d11/d3d11-subsystem.hpp +++ b/libobs-d3d11/d3d11-subsystem.hpp @@ -613,6 +613,7 @@ struct mat4float { struct gs_device { ComPtr factory; + ComPtr adapter; ComPtr device; ComPtr context; @@ -652,8 +653,8 @@ struct gs_device { matrix4 curViewProjMatrix; void InitCompiler(); - void InitFactory(uint32_t adapterIdx, IDXGIAdapter1 **adapter); - void InitDevice(uint32_t adapterIdx, IDXGIAdapter *adapter); + void InitFactory(uint32_t adapterIdx); + void InitDevice(uint32_t adapterIdx); ID3D11DepthStencilState *AddZStencilState(); ID3D11RasterizerState *AddRasterState();