static ID3D10Device *create_device(void) { IDXGIFactory *factory = NULL; IDXGIAdapter *adapter = NULL; ID3D10Device *device = NULL; HRESULT hr; hr = CreateDXGIFactory(&IID_IDXGIFactory, (void *)&factory); if (FAILED(hr)) goto cleanup; hr = IDXGIFactory_EnumAdapters(factory, 0, &adapter); ok(SUCCEEDED(hr) || hr == DXGI_ERROR_NOT_FOUND, /* Some VMware and VirtualBox */ "EnumAdapters failed, hr %#x.\n", hr); if (SUCCEEDED(hr)) { hr = D3D10CoreCreateDevice(factory, adapter, 0, NULL, &device); } if (FAILED(hr)) { HMODULE d3d10ref; trace("Failed to create a HW device, trying REF\n"); if (adapter) IDXGIAdapter_Release(adapter); adapter = NULL; d3d10ref = LoadLibraryA("d3d10ref.dll"); if (!d3d10ref) { trace("d3d10ref.dll not available, unable to create a REF device\n"); goto cleanup; } hr = IDXGIFactory_CreateSoftwareAdapter(factory, d3d10ref, &adapter); FreeLibrary(d3d10ref); ok(SUCCEEDED(hr), "CreateSoftwareAdapter failed, hr %#x\n", hr); if (FAILED(hr)) goto cleanup; hr = D3D10CoreCreateDevice(factory, adapter, 0, NULL, &device); ok(SUCCEEDED(hr), "Failed to create a REF device, hr %#x\n", hr); if (FAILED(hr)) goto cleanup; } cleanup: if (adapter) IDXGIAdapter_Release(adapter); if (factory) IDXGIFactory_Release(factory); return device; }
HRESULT WINAPI D3D10CreateDevice(IDXGIAdapter *adapter, D3D10_DRIVER_TYPE driver_type, HMODULE swrast, UINT flags, UINT sdk_version, ID3D10Device **device) { IDXGIFactory *factory; HRESULT hr; TRACE("adapter %p, driver_type %s, swrast %p, flags %#x, sdk_version %d, device %p\n", adapter, debug_d3d10_driver_type(driver_type), swrast, flags, sdk_version, device); if (adapter) { IDXGIAdapter_AddRef(adapter); hr = IDXGIAdapter_GetParent(adapter, &IID_IDXGIFactory, (void **)&factory); if (FAILED(hr)) { WARN("Failed to get dxgi factory, returning %#x\n", hr); return hr; } } else { hr = CreateDXGIFactory(&IID_IDXGIFactory, (void **)&factory); if (FAILED(hr)) { WARN("Failed to create dxgi factory, returning %#x\n", hr); return hr; } switch(driver_type) { case D3D10_DRIVER_TYPE_HARDWARE: { hr = IDXGIFactory_EnumAdapters(factory, 0, &adapter); if (FAILED(hr)) { WARN("No adapters found, returning %#x\n", hr); IDXGIFactory_Release(factory); return hr; } break; } case D3D10_DRIVER_TYPE_NULL: FIXME("NULL device not implemented, falling back to refrast\n"); /* fall through, for now */ case D3D10_DRIVER_TYPE_REFERENCE: { HMODULE refrast = LoadLibraryA("d3d10ref.dll"); if (!refrast) { WARN("Failed to load refrast, returning E_FAIL\n"); IDXGIFactory_Release(factory); return E_FAIL; } hr = IDXGIFactory_CreateSoftwareAdapter(factory, refrast, &adapter); FreeLibrary(refrast); if (FAILED(hr)) { WARN("Failed to create a software adapter, returning %#x\n", hr); IDXGIFactory_Release(factory); return hr; } break; } case D3D10_DRIVER_TYPE_SOFTWARE: { if (!swrast) { WARN("Software device requested, but NULL swrast passed, returning E_FAIL\n"); IDXGIFactory_Release(factory); return E_FAIL; } hr = IDXGIFactory_CreateSoftwareAdapter(factory, swrast, &adapter); if (FAILED(hr)) { WARN("Failed to create a software adapter, returning %#x\n", hr); IDXGIFactory_Release(factory); return hr; } break; } default: FIXME("Unhandled driver type %#x.\n", driver_type); IDXGIFactory_Release(factory); return E_FAIL; } } hr = D3D10CoreCreateDevice(factory, adapter, flags, NULL, device); IDXGIAdapter_Release(adapter); IDXGIFactory_Release(factory); if (FAILED(hr)) { WARN("Failed to create a device, returning %#x\n", hr); return hr; } TRACE("Created ID3D10Device %p\n", *device); return hr; }
HRESULT WINAPI D3D10CreateDevice1(IDXGIAdapter *adapter, D3D10_DRIVER_TYPE driver_type, HMODULE swrast, UINT flags, D3D10_FEATURE_LEVEL1 hw_level, UINT sdk_version, ID3D10Device1 **device) { IDXGIFactory *factory; HRESULT hr; TRACE("adapter %p, driver_type %s, swrast %p, flags %#x, hw_level %s, sdk_version %d, device %p.\n", adapter, debug_d3d10_driver_type(driver_type), swrast, flags, debug_d3d10_feature_level(hw_level), sdk_version, device); if (!device) return E_INVALIDARG; *device = NULL; if (!hw_level) return E_INVALIDARG; if (adapter) { IDXGIAdapter_AddRef(adapter); if (FAILED(hr = IDXGIAdapter_GetParent(adapter, &IID_IDXGIFactory, (void **)&factory))) { WARN("Failed to get dxgi factory, hr %#x.\n", hr); return hr; } } else { if (FAILED(hr = CreateDXGIFactory(&IID_IDXGIFactory, (void **)&factory))) { WARN("Failed to create dxgi factory, hr %#x.\n", hr); return hr; } switch (driver_type) { case D3D10_DRIVER_TYPE_WARP: FIXME("WARP driver not implemented, falling back to hardware.\n"); case D3D10_DRIVER_TYPE_HARDWARE: { if (FAILED(hr = IDXGIFactory_EnumAdapters(factory, 0, &adapter))) { WARN("No adapters found, hr %#x.\n", hr); IDXGIFactory_Release(factory); return hr; } break; } case D3D10_DRIVER_TYPE_NULL: FIXME("NULL device not implemented, falling back to refrast.\n"); /* Fall through, for now. */ case D3D10_DRIVER_TYPE_REFERENCE: { HMODULE refrast; if (!(refrast = LoadLibraryA("d3d10ref.dll"))) { WARN("Failed to load refrast, returning E_FAIL.\n"); IDXGIFactory_Release(factory); return E_FAIL; } hr = IDXGIFactory_CreateSoftwareAdapter(factory, refrast, &adapter); FreeLibrary(refrast); if (FAILED(hr)) { WARN("Failed to create a software adapter, hr %#x.\n", hr); IDXGIFactory_Release(factory); return hr; } break; } case D3D10_DRIVER_TYPE_SOFTWARE: { if (!swrast) { WARN("Software device requested, but NULL swrast passed, returning E_FAIL.\n"); IDXGIFactory_Release(factory); return E_FAIL; } if (FAILED(hr = IDXGIFactory_CreateSoftwareAdapter(factory, swrast, &adapter))) { WARN("Failed to create a software adapter, hr %#x.\n", hr); IDXGIFactory_Release(factory); return hr; } break; } default: FIXME("Unhandled driver type %#x.\n", driver_type); IDXGIFactory_Release(factory); return E_FAIL; } } hr = D3D10CoreCreateDevice(factory, adapter, flags, hw_level, (ID3D10Device **)device); IDXGIAdapter_Release(adapter); IDXGIFactory_Release(factory); if (FAILED(hr)) { WARN("Failed to create a device, hr %#x.\n", hr); return hr; } TRACE("Created device %p.\n", *device); return hr; }