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