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