192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri/************************************************************************** 292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * 392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * Copyright 2010 Luca Barbieri 492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * 592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * Permission is hereby granted, free of charge, to any person obtaining 692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * a copy of this software and associated documentation files (the 70525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri * "software"), to deal in the software without restriction, including 892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * without limitation the rights to use, copy, modify, merge, publish, 90525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri * distribute, sublicense, and/or sell copies of the software, and to 100525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri * permit persons to whom the software is furnished to do so, subject to 1192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * the following conditions: 1292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * 1392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * The above copyright notice and this permission notice (including the 1492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * next paragraph) shall be included in all copies or substantial 150525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri * portions of the software. 1692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * 1792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 1892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 1992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 2092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 2192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 2292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 2392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * 2592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri **************************************************************************/ 2692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 2792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "d3d1xstutil.h" 2892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include "galliumd3d10_1.h" 2992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include <dxgi.h> 3092bc1111f3c5dd3616bd591129aebd3f4307e5b4Kai Wasserbäch#include "pipe/p_screen.h" 3192bc1111f3c5dd3616bd591129aebd3f4307e5b4Kai Wasserbäch#include "pipe/p_context.h" 3292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 336c598c78bd17642d731cf57b8369cc794f64ba2fLuca BarbieriHRESULT D3D10CreateDevice1( 340525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri IDXGIAdapter *adapter, 350525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri D3D10_DRIVER_TYPE driver_type, 360525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri HMODULE software, 370525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri unsigned flags, 380525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri D3D10_FEATURE_LEVEL1 hardware_level, 390525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri unsigned sdk_version, 400525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri ID3D10Device1 **out_device 4192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri) 4292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{ 4392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri HRESULT hr; 4492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ComPtr<IDXGIAdapter1> adapter_to_release; 450525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri if(!adapter) 4692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 4792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ComPtr<IDXGIFactory1> factory; 4892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri hr = CreateDXGIFactory1(IID_IDXGIFactory1, (void**)&factory); 4992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(!SUCCEEDED(hr)) 5092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return hr; 5192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri hr = factory->EnumAdapters1(0, &adapter_to_release); 5292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(!SUCCEEDED(hr)) 5392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return hr; 540525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri adapter = adapter_to_release.p; 5592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 5692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ComPtr<IGalliumAdapter> gallium_adapter; 570525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri hr = adapter->QueryInterface(IID_IGalliumAdapter, (void**)&gallium_adapter); 5892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(!SUCCEEDED(hr)) 5992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return hr; 6092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct pipe_screen* screen; 6192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri // TODO: what should D3D_DRIVER_TYPE_SOFTWARE return? fast or reference? 620525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri if(driver_type == D3D10_DRIVER_TYPE_REFERENCE) 6392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri screen = gallium_adapter->GetGalliumReferenceSoftwareScreen(); 640525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri else if(driver_type == D3D10_DRIVER_TYPE_SOFTWARE || driver_type == D3D10_DRIVER_TYPE_WARP) 6592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri screen = gallium_adapter->GetGalliumFastSoftwareScreen(); 6692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri else 6792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri screen = gallium_adapter->GetGalliumScreen(); 6892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(!screen) 6992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return E_FAIL; 7092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri struct pipe_context* context = screen->context_create(screen, 0); 7192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(!context) 7292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return E_FAIL; 7392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ComPtr<ID3D10Device1> device; 740525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri hr = GalliumD3D10DeviceCreate1(screen, context, TRUE, flags, adapter, &device); 7592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(!SUCCEEDED(hr)) 7692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 7792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri context->destroy(context); 7892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return hr; 7992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 800525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri if(out_device) 810525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri *out_device = device.steal(); 8292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return S_OK; 8392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 8492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 8592617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriHRESULT WINAPI D3D10CreateDeviceAndSwapChain1( 860525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri IDXGIAdapter* adapter, 870525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri D3D10_DRIVER_TYPE driver_type, 880525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri HMODULE software, 890525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri unsigned flags, 900525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri D3D10_FEATURE_LEVEL1 hardware_level, 910525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri unsigned sdk_version, 920525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri DXGI_SWAP_CHAIN_DESC* swap_chain_desc, 930525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri IDXGISwapChain** out_swap_chain, 940525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri ID3D10Device1** out_device 9592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri) 9692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{ 9792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ComPtr<ID3D10Device1> dev; 9892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri HRESULT hr; 990525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri hr = D3D10CreateDevice1(adapter, driver_type, software, flags, hardware_level, sdk_version, &dev); 10092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(!SUCCEEDED(hr)) 10192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return hr; 1020525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri if(out_swap_chain) 10392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 10492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ComPtr<IDXGIFactory> factory; 10592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ComPtr<IDXGIDevice> dxgi_device; 10692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ComPtr<IDXGIAdapter> adapter; 10792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri hr = dev->QueryInterface(IID_IDXGIDevice, (void**)&dxgi_device); 10892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(!SUCCEEDED(hr)) 10992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return hr; 11092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 11192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri hr = dxgi_device->GetAdapter(&adapter); 11292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(!SUCCEEDED(hr)) 11392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return hr; 11492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 11592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri adapter->GetParent(IID_IDXGIFactory, (void**)&factory); 1160525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri hr = factory->CreateSwapChain(dev.p, (DXGI_SWAP_CHAIN_DESC*)swap_chain_desc, out_swap_chain); 11792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(!SUCCEEDED(hr)) 11892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return hr; 11992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 1200525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri if(out_device) 1210525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri *out_device = dev.steal(); 12292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return hr; 12392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 12492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 1256c598c78bd17642d731cf57b8369cc794f64ba2fLuca BarbieriHRESULT D3D10CreateDevice( 1260525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri IDXGIAdapter *adapter, 1270525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri D3D10_DRIVER_TYPE driver_type, 1280525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri HMODULE software, 1290525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri unsigned flags, 1300525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri unsigned sdk_version, 1310525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri ID3D10Device **out_device 13292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri) 13392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{ 1340525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri return D3D10CreateDevice1(adapter, driver_type, software, flags, D3D10_FEATURE_LEVEL_10_0, sdk_version, (ID3D10Device1**)out_device); 13592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 13692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 13792617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriHRESULT WINAPI D3D10CreateDeviceAndSwapChain( 1380525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri IDXGIAdapter* adapter, 1390525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri D3D10_DRIVER_TYPE driver_type, 1400525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri HMODULE software, 1410525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri unsigned flags, 1420525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri unsigned sdk_version, 1430525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri DXGI_SWAP_CHAIN_DESC* swap_chain_desc, 1440525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri IDXGISwapChain** out_swap_chain, 1450525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri ID3D10Device** out_device 14692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri) 14792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{ 1480525384c11a6bc95f9fc8f621ea22e13355c2ac8Luca Barbieri return D3D10CreateDeviceAndSwapChain1(adapter, driver_type, software, flags, D3D10_FEATURE_LEVEL_10_0, sdk_version, swap_chain_desc, out_swap_chain, (ID3D10Device1**)out_device); 14992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 150