dxgid3d10.cpp revision 92617aeac109481258f0c3863d09c1b8903d438b
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 792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * "Software"), to deal in the Software without restriction, including 892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * without limitation the rights to use, copy, modify, merge, publish, 992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * distribute, sublicense, and/or sell copies of the Software, and to 1092617aeac109481258f0c3863d09c1b8903d438bLuca 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 1592617aeac109481258f0c3863d09c1b8903d438bLuca 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> 3092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include <pipe/p_screen.h> 3192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#include <pipe/p_context.h> 3292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 3392617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriHRESULT D3D10CreateDevice1( 3492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri __in_opt IDXGIAdapter *pAdapter, 3592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri __in D3D10_DRIVER_TYPE DriverType, 3692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri __in HMODULE Software, 3792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri __in unsigned Flags, 3892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri __in D3D10_FEATURE_LEVEL1 HardwareLevel, 3992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri __in unsigned SDKVersion, 4092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri __out_opt ID3D10Device1 **ppDevice 4192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri) 4292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{ 4392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri HRESULT hr; 4492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ComPtr<IDXGIAdapter1> adapter_to_release; 4592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(!pAdapter) 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; 5492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri pAdapter = adapter_to_release.p; 5592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 5692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ComPtr<IGalliumAdapter> gallium_adapter; 5792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri hr = pAdapter->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? 6292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(DriverType == D3D10_DRIVER_TYPE_REFERENCE) 6392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri screen = gallium_adapter->GetGalliumReferenceSoftwareScreen(); 6492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri else if(DriverType == D3D10_DRIVER_TYPE_SOFTWARE || DriverType == 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; 7492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri hr = GalliumD3D10DeviceCreate1(screen, context, TRUE, Flags, pAdapter, &device); 7592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(!SUCCEEDED(hr)) 7692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri { 7792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri context->destroy(context); 7892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return hr; 7992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 8092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(ppDevice) 8192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *ppDevice = device.steal(); 8292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return S_OK; 8392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 8492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 8592617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriHRESULT WINAPI D3D10CreateDeviceAndSwapChain1( 8692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri __in_opt IDXGIAdapter* pAdapter, 8792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri D3D10_DRIVER_TYPE DriverType, 8892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri HMODULE Software, 8992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri unsigned Flags, 9092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri __in D3D10_FEATURE_LEVEL1 HardwareLevel, 9192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri unsigned SDKVersion, 9292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri __in_opt DXGI_SWAP_CHAIN_DESC* pSwapChainDesc, 9392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri __out_opt IDXGISwapChain** ppSwapChain, 9492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri __out_opt ID3D10Device1** ppDevice 9592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri) 9692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{ 9792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri ComPtr<ID3D10Device1> dev; 9892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri HRESULT hr; 9992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri hr = D3D10CreateDevice1(pAdapter, DriverType, Software, Flags, HardwareLevel, SDKVersion, &dev); 10092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(!SUCCEEDED(hr)) 10192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return hr; 10292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(ppSwapChain) 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); 11692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri hr = factory->CreateSwapChain(dev.p, (DXGI_SWAP_CHAIN_DESC*)pSwapChainDesc, ppSwapChain); 11792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(!SUCCEEDED(hr)) 11892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return hr; 11992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri } 12092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri if(ppDevice) 12192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *ppDevice = dev.steal(); 12292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return hr; 12392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 12492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 12592617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriHRESULT D3D10CreateDevice( 12692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri __in_opt IDXGIAdapter *pAdapter, 12792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri __in D3D10_DRIVER_TYPE DriverType, 12892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri __in HMODULE Software, 12992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri __in unsigned Flags, 13092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri __in unsigned SDKVersion, 13192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri __out_opt ID3D10Device **ppDevice 13292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri) 13392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{ 13492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return D3D10CreateDevice1(pAdapter, DriverType, Software, Flags, D3D10_FEATURE_LEVEL_10_0, SDKVersion, (ID3D10Device1**)ppDevice); 13592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 13692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri 13792617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriHRESULT WINAPI D3D10CreateDeviceAndSwapChain( 13892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri __in_opt IDXGIAdapter* pAdapter, 13992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri D3D10_DRIVER_TYPE DriverType, 14092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri HMODULE Software, 14192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri unsigned Flags, 14292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri unsigned SDKVersion, 14392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri __in_opt DXGI_SWAP_CHAIN_DESC* pSwapChainDesc, 14492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri __out_opt IDXGISwapChain** ppSwapChain, 14592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri __out_opt ID3D10Device** ppDevice 14692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri) 14792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{ 14892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri return D3D10CreateDeviceAndSwapChain1(pAdapter, DriverType, Software, Flags, D3D10_FEATURE_LEVEL_10_0, SDKVersion, pSwapChainDesc, ppSwapChain, (ID3D10Device1**)ppDevice); 14992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri} 150