Home | History | Annotate | Download | only in dxgid3d10
      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 "galliumd3d10_1.h"
     29 #include <dxgi.h>
     30 #include "pipe/p_screen.h"
     31 #include "pipe/p_context.h"
     32 
     33 HRESULT D3D10CreateDevice1(
     34 	IDXGIAdapter *adapter,
     35 	D3D10_DRIVER_TYPE driver_type,
     36 	HMODULE software,
     37 	unsigned flags,
     38 	D3D10_FEATURE_LEVEL1 hardware_level,
     39 	unsigned sdk_version,
     40 	ID3D10Device1 **out_device
     41 )
     42 {
     43 	HRESULT hr;
     44 	ComPtr<IDXGIAdapter1> adapter_to_release;
     45 	if(!adapter)
     46 	{
     47 		ComPtr<IDXGIFactory1> factory;
     48 		hr = CreateDXGIFactory1(IID_IDXGIFactory1, (void**)&factory);
     49 		if(!SUCCEEDED(hr))
     50 			return hr;
     51 		hr = factory->EnumAdapters1(0, &adapter_to_release);
     52 		if(!SUCCEEDED(hr))
     53 			return hr;
     54 		adapter = adapter_to_release.p;
     55 	}
     56 	ComPtr<IGalliumAdapter> gallium_adapter;
     57 	hr = adapter->QueryInterface(IID_IGalliumAdapter, (void**)&gallium_adapter);
     58 	if(!SUCCEEDED(hr))
     59 		return hr;
     60 	struct pipe_screen* screen;
     61 	// TODO: what should D3D_DRIVER_TYPE_SOFTWARE return? fast or reference?
     62 	if(driver_type == D3D10_DRIVER_TYPE_REFERENCE)
     63 		screen = gallium_adapter->GetGalliumReferenceSoftwareScreen();
     64 	else if(driver_type == D3D10_DRIVER_TYPE_SOFTWARE || driver_type == D3D10_DRIVER_TYPE_WARP)
     65 		screen = gallium_adapter->GetGalliumFastSoftwareScreen();
     66 	else
     67 		screen = gallium_adapter->GetGalliumScreen();
     68 	if(!screen)
     69 		return E_FAIL;
     70 	struct pipe_context* context = screen->context_create(screen, 0);
     71 	if(!context)
     72 		return E_FAIL;
     73 	ComPtr<ID3D10Device1> device;
     74 	hr = GalliumD3D10DeviceCreate1(screen, context, TRUE, flags, adapter, &device);
     75 	if(!SUCCEEDED(hr))
     76 	{
     77 		context->destroy(context);
     78 		return hr;
     79 	}
     80 	if(out_device)
     81 		*out_device = device.steal();
     82 	return S_OK;
     83 }
     84 
     85 HRESULT WINAPI D3D10CreateDeviceAndSwapChain1(
     86 	IDXGIAdapter* adapter,
     87 	D3D10_DRIVER_TYPE driver_type,
     88 	HMODULE software,
     89 	unsigned flags,
     90 	D3D10_FEATURE_LEVEL1 hardware_level,
     91 	unsigned sdk_version,
     92 	DXGI_SWAP_CHAIN_DESC* swap_chain_desc,
     93 	IDXGISwapChain** out_swap_chain,
     94 	ID3D10Device1** out_device
     95 )
     96 {
     97 	ComPtr<ID3D10Device1> dev;
     98 	HRESULT hr;
     99 	hr = D3D10CreateDevice1(adapter, driver_type, software, flags, hardware_level, sdk_version, &dev);
    100 	if(!SUCCEEDED(hr))
    101 		return hr;
    102 	if(out_swap_chain)
    103 	{
    104 		ComPtr<IDXGIFactory> factory;
    105 		ComPtr<IDXGIDevice> dxgi_device;
    106 		ComPtr<IDXGIAdapter> adapter;
    107 		hr = dev->QueryInterface(IID_IDXGIDevice, (void**)&dxgi_device);
    108 		if(!SUCCEEDED(hr))
    109 			return hr;
    110 
    111 		hr = dxgi_device->GetAdapter(&adapter);
    112 		if(!SUCCEEDED(hr))
    113 			return hr;
    114 
    115 		adapter->GetParent(IID_IDXGIFactory, (void**)&factory);
    116 		hr = factory->CreateSwapChain(dev.p, (DXGI_SWAP_CHAIN_DESC*)swap_chain_desc, out_swap_chain);
    117 		if(!SUCCEEDED(hr))
    118 			return hr;
    119 	}
    120 	if(out_device)
    121 		*out_device = dev.steal();
    122 	return hr;
    123 }
    124 
    125 HRESULT D3D10CreateDevice(
    126 	IDXGIAdapter *adapter,
    127 	D3D10_DRIVER_TYPE driver_type,
    128 	HMODULE software,
    129 	unsigned flags,
    130 	unsigned sdk_version,
    131 	ID3D10Device **out_device
    132 )
    133 {
    134 	return D3D10CreateDevice1(adapter, driver_type, software, flags, D3D10_FEATURE_LEVEL_10_0, sdk_version, (ID3D10Device1**)out_device);
    135 }
    136 
    137 HRESULT WINAPI D3D10CreateDeviceAndSwapChain(
    138 	IDXGIAdapter* adapter,
    139 	D3D10_DRIVER_TYPE driver_type,
    140 	HMODULE software,
    141 	unsigned flags,
    142 	unsigned sdk_version,
    143 	DXGI_SWAP_CHAIN_DESC* swap_chain_desc,
    144 	IDXGISwapChain** out_swap_chain,
    145 	ID3D10Device** out_device
    146 )
    147 {
    148 	return D3D10CreateDeviceAndSwapChain1(adapter, driver_type, software, flags, D3D10_FEATURE_LEVEL_10_0, sdk_version, swap_chain_desc, out_swap_chain, (ID3D10Device1**)out_device);
    149 }
    150