#include "d3d10_include.h" #include "../dxgi/dxgi_adapter.h" #include "../dxgi/dxgi_device.h" namespace dxvk { Logger Logger::s_instance("d3d10.log"); } extern "C" { using namespace dxvk; HRESULT __stdcall D3D11CoreCreateDevice( IDXGIFactory* pFactory, IDXGIAdapter* pAdapter, UINT Flags, const D3D_FEATURE_LEVEL* pFeatureLevels, UINT FeatureLevels, ID3D11Device** ppDevice); DLLEXPORT HRESULT __stdcall D3D10CoreCreateDevice( IDXGIFactory* pFactory, IDXGIAdapter* pAdapter, UINT Flags, D3D_FEATURE_LEVEL FeatureLevel, ID3D10Device** ppDevice) { Com d3d11Device; HRESULT hr = D3D11CoreCreateDevice(pFactory, pAdapter, Flags, &FeatureLevel, 1, &d3d11Device); if (FAILED(hr)) return hr; if (FAILED(d3d11Device->QueryInterface( __uuidof(ID3D10Device), reinterpret_cast(ppDevice)))) return E_FAIL; return S_OK; } DLLEXPORT HRESULT D3D10CreateDevice1( IDXGIAdapter* pAdapter, D3D10_DRIVER_TYPE DriverType, HMODULE Software, UINT Flags, D3D10_FEATURE_LEVEL1 HardwareLevel, UINT SDKVersion, ID3D10Device1** ppDevice) { InitReturnPtr(ppDevice); // Get DXGI factory and adapter. This is mostly // copied from the equivalent D3D11 functions. Com dxgiFactory = nullptr; Com dxgiAdapter = pAdapter; if (dxgiAdapter == nullptr) { if (DriverType != D3D10_DRIVER_TYPE_HARDWARE) Logger::warn("D3D10CreateDevice: Unsupported driver type"); if (FAILED(CreateDXGIFactory(__uuidof(IDXGIFactory), reinterpret_cast(&dxgiFactory)))) { Logger::err("D3D10CreateDevice: Failed to create a DXGI factory"); return E_FAIL; } if (FAILED(dxgiFactory->EnumAdapters(0, &dxgiAdapter))) { Logger::err("D3D10CreateDevice: No default adapter available"); return E_FAIL; } } else { if (FAILED(dxgiAdapter->GetParent(__uuidof(IDXGIFactory), reinterpret_cast(&dxgiFactory)))) { Logger::err("D3D10CreateDevice: Failed to query DXGI factory from DXGI adapter"); return E_FAIL; } if (DriverType != D3D10_DRIVER_TYPE_HARDWARE || Software != nullptr) return E_INVALIDARG; } // Create the actual device Com device; HRESULT hr = D3D10CoreCreateDevice( dxgiFactory.ptr(), dxgiAdapter.ptr(), Flags, D3D_FEATURE_LEVEL(HardwareLevel), &device); if (FAILED(hr)) return hr; hr = device->QueryInterface( __uuidof(ID3D10Device1), reinterpret_cast(ppDevice)); if (FAILED(hr)) return E_FAIL; return hr; } DLLEXPORT HRESULT D3D10CreateDevice( IDXGIAdapter* pAdapter, D3D10_DRIVER_TYPE DriverType, HMODULE Software, UINT Flags, UINT SDKVersion, ID3D10Device** ppDevice) { InitReturnPtr(ppDevice); Com d3d10Device = nullptr; HRESULT hr = D3D10CreateDevice1(pAdapter, DriverType, Software, Flags, D3D10_FEATURE_LEVEL_10_0, SDKVersion, &d3d10Device); if (FAILED(hr)) return hr; if (ppDevice != nullptr) { *ppDevice = d3d10Device.ref(); return S_OK; } return S_FALSE; } DLLEXPORT HRESULT D3D10CreateDeviceAndSwapChain1( IDXGIAdapter* pAdapter, D3D10_DRIVER_TYPE DriverType, HMODULE Software, UINT Flags, D3D10_FEATURE_LEVEL1 HardwareLevel, UINT SDKVersion, DXGI_SWAP_CHAIN_DESC* pSwapChainDesc, IDXGISwapChain** ppSwapChain, ID3D10Device1** ppDevice) { InitReturnPtr(ppDevice); InitReturnPtr(ppSwapChain); // Try to create the device as usual Com d3d10Device = nullptr; HRESULT hr = D3D10CreateDevice1(pAdapter, DriverType, Software, Flags, HardwareLevel, SDKVersion, &d3d10Device); if (FAILED(hr)) return hr; // Create the swap chain if requested if (pSwapChainDesc == nullptr) return E_INVALIDARG; Com dxgiDevice = nullptr; Com dxgiAdapter = nullptr; Com dxgiFactory = nullptr; if (FAILED(d3d10Device->QueryInterface(__uuidof(IDXGIDevice), reinterpret_cast(&dxgiDevice)))) { Logger::err("D3D11CreateDeviceAndSwapChain: Failed to query DXGI device"); return E_FAIL; } if (FAILED(dxgiDevice->GetParent(__uuidof(IDXGIAdapter), reinterpret_cast(&dxgiAdapter)))) { Logger::err("D3D11CreateDeviceAndSwapChain: Failed to query DXGI adapter"); return E_FAIL; } if (FAILED(dxgiAdapter->GetParent(__uuidof(IDXGIFactory), reinterpret_cast(&dxgiFactory)))) { Logger::err("D3D11CreateDeviceAndSwapChain: Failed to query DXGI factory"); return E_FAIL; } if (FAILED(dxgiFactory->CreateSwapChain(d3d10Device.ptr(), pSwapChainDesc, ppSwapChain))) { Logger::err("D3D11CreateDeviceAndSwapChain: Failed to create swap chain"); return E_FAIL; } // Write back device pointer if (ppDevice != nullptr) { *ppDevice = d3d10Device.ptr(); return S_OK; } return S_FALSE; } DLLEXPORT HRESULT D3D10CreateDeviceAndSwapChain( IDXGIAdapter* pAdapter, D3D10_DRIVER_TYPE DriverType, HMODULE Software, UINT Flags, UINT SDKVersion, DXGI_SWAP_CHAIN_DESC* pSwapChainDesc, IDXGISwapChain** ppSwapChain, ID3D10Device** ppDevice) { InitReturnPtr(ppDevice); InitReturnPtr(ppSwapChain); Com d3d10Device = nullptr; HRESULT hr = D3D10CreateDeviceAndSwapChain1(pAdapter, DriverType, Software, Flags, D3D10_FEATURE_LEVEL_10_0, SDKVersion, pSwapChainDesc, ppSwapChain, &d3d10Device); if (FAILED(hr)) return hr; if (ppDevice != nullptr) { *ppDevice = d3d10Device.ref(); return S_OK; } return S_FALSE; } }