dxgid3d11.cpp revision 92617aeac109481258f0c3863d09c1b8903d438b
1/************************************************************************** 2 * 3 * Copyright 2010 Luca Barbieri 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining 6 * a copy of this software and associated documentation files (the 7 * "Software"), to deal in the Software without restriction, including 8 * without limitation the rights to use, copy, modify, merge, publish, 9 * distribute, sublicense, and/or sell copies of the Software, and to 10 * permit persons to whom the Software is furnished to do so, subject to 11 * the following conditions: 12 * 13 * The above copyright notice and this permission notice (including the 14 * next paragraph) shall be included in all copies or substantial 15 * portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 20 * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 21 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 22 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 23 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 * 25 **************************************************************************/ 26 27#include "d3d1xstutil.h" 28#include "galliumd3d11.h" 29#include <dxgi.h> 30#include <pipe/p_screen.h> 31#include <pipe/p_context.h> 32 33HRESULT D3D11CreateDevice( 34 __in_opt IDXGIAdapter *pAdapter, 35 __in D3D_DRIVER_TYPE DriverType, 36 __in HMODULE Software, 37 __in unsigned Flags, 38 __in_ecount_opt( FeatureLevels ) const D3D_FEATURE_LEVEL *pFeatureLevels, 39 __in unsigned FeatureLevels, 40 __in unsigned SDKVersion, 41 __out_opt ID3D11Device **ppDevice, 42 __out_opt D3D_FEATURE_LEVEL *pFeatureLevel, 43 __out_opt ID3D11DeviceContext **ppImmediateContext 44) 45{ 46 HRESULT hr; 47 ComPtr<IDXGIAdapter1> adapter_to_release; 48 if(!pAdapter) 49 { 50 ComPtr<IDXGIFactory1> factory; 51 hr = CreateDXGIFactory1(IID_IDXGIFactory1, (void**)&factory); 52 if(!SUCCEEDED(hr)) 53 return hr; 54 hr = factory->EnumAdapters1(0, &adapter_to_release); 55 if(!SUCCEEDED(hr)) 56 return hr; 57 pAdapter = adapter_to_release.p; 58 } 59 ComPtr<IGalliumAdapter> gallium_adapter; 60 hr = pAdapter->QueryInterface(IID_IGalliumAdapter, (void**)&gallium_adapter); 61 if(!SUCCEEDED(hr)) 62 return hr; 63 struct pipe_screen* screen; 64 // TODO: what should D3D_DRIVER_TYPE_SOFTWARE return? fast or reference? 65 if(DriverType == D3D_DRIVER_TYPE_REFERENCE) 66 screen = gallium_adapter->GetGalliumReferenceSoftwareScreen(); 67 else if(DriverType == D3D_DRIVER_TYPE_SOFTWARE || DriverType == D3D_DRIVER_TYPE_WARP) 68 screen = gallium_adapter->GetGalliumFastSoftwareScreen(); 69 else 70 screen = gallium_adapter->GetGalliumScreen(); 71 if(!screen) 72 return E_FAIL; 73 struct pipe_context* context = screen->context_create(screen, 0); 74 if(!context) 75 return E_FAIL; 76 ComPtr<ID3D11Device> device; 77 hr = GalliumD3D11DeviceCreate(screen, context, TRUE, Flags, pAdapter, &device); 78 if(!SUCCEEDED(hr)) 79 { 80 context->destroy(context); 81 return hr; 82 } 83 if(ppImmediateContext) 84 device->GetImmediateContext(ppImmediateContext); 85 if(pFeatureLevel) 86 *pFeatureLevel = device->GetFeatureLevel(); 87 if(ppDevice) 88 *ppDevice = device.steal(); 89 return S_OK; 90} 91 92HRESULT WINAPI D3D11CreateDeviceAndSwapChain( 93 __in_opt IDXGIAdapter* pAdapter, 94 D3D_DRIVER_TYPE DriverType, 95 HMODULE Software, 96 unsigned Flags, 97 __in_ecount_opt( FeatureLevels ) CONST D3D_FEATURE_LEVEL* pFeatureLevels, 98 unsigned FeatureLevels, 99 unsigned SDKVersion, 100 __in_opt CONST DXGI_SWAP_CHAIN_DESC* pSwapChainDesc, 101 __out_opt IDXGISwapChain** ppSwapChain, 102 __out_opt ID3D11Device** ppDevice, 103 __out_opt D3D_FEATURE_LEVEL* pFeatureLevel, 104 __out_opt ID3D11DeviceContext** ppImmediateContext ) 105{ 106 ComPtr<ID3D11Device> dev; 107 ComPtr<ID3D11DeviceContext> ctx; 108 HRESULT hr; 109 hr = D3D11CreateDevice(pAdapter, DriverType, Software, Flags, pFeatureLevels, FeatureLevels, SDKVersion, (ID3D11Device**)&dev, pFeatureLevel, (ID3D11DeviceContext**)&ctx); 110 if(!SUCCEEDED(hr)) 111 return hr; 112 if(ppSwapChain) 113 { 114 ComPtr<IDXGIFactory> factory; 115 ComPtr<IDXGIDevice> dxgi_device; 116 ComPtr<IDXGIAdapter> adapter; 117 hr = dev->QueryInterface(IID_IDXGIDevice, (void**)&dxgi_device); 118 if(!SUCCEEDED(hr)) 119 return hr; 120 121 hr = dxgi_device->GetAdapter(&adapter); 122 if(!SUCCEEDED(hr)) 123 return hr; 124 125 adapter->GetParent(IID_IDXGIFactory, (void**)&factory); 126 hr = factory->CreateSwapChain(dev.p, (DXGI_SWAP_CHAIN_DESC*)pSwapChainDesc, ppSwapChain); 127 if(!SUCCEEDED(hr)) 128 return hr; 129 } 130 if(ppDevice) 131 *ppDevice = dev.steal(); 132 if(ppImmediateContext) 133 *ppImmediateContext = ctx.steal(); 134 return hr; 135} 136