static HRESULT STDMETHODCALLTYPE dxgi_device_GetAdapter(IWineDXGIDevice *iface, IDXGIAdapter **adapter) { struct dxgi_device *device = impl_from_IWineDXGIDevice(iface); TRACE("iface %p, adapter %p.\n", iface, adapter); *adapter = (IDXGIAdapter *)device->adapter; IDXGIAdapter_AddRef(*adapter); return S_OK; }
static HRESULT STDMETHODCALLTYPE dxgi_factory_EnumAdapters(IWineDXGIFactory *iface, UINT adapter_idx, IDXGIAdapter **adapter) { struct dxgi_factory *This = (struct dxgi_factory *)iface; TRACE("iface %p, adapter_idx %u, adapter %p\n", iface, adapter_idx, adapter); if (!adapter) return DXGI_ERROR_INVALID_CALL; if (adapter_idx >= This->adapter_count) { *adapter = NULL; return DXGI_ERROR_NOT_FOUND; } *adapter = This->adapters[adapter_idx]; IDXGIAdapter_AddRef(*adapter); TRACE("Returning adapter %p\n", *adapter); return S_OK; }
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; }
HRESULT WINAPI D3D11CreateDevice(IDXGIAdapter *adapter, D3D_DRIVER_TYPE driver_type, HMODULE swrast, UINT flags, const D3D_FEATURE_LEVEL *feature_levels, UINT levels, UINT sdk_version, ID3D11Device **device_out, D3D_FEATURE_LEVEL *obtained_feature_level, ID3D11DeviceContext **immediate_context) { IDXGIFactory *factory; ID3D11Device *device; HRESULT hr; TRACE("adapter %p, driver_type %s, swrast %p, flags %#x, feature_levels %p, levels %u, sdk_version %u, " "device %p, obtained_feature_level %p, immediate_context %p.\n", adapter, debug_d3d_driver_type(driver_type), swrast, flags, feature_levels, levels, sdk_version, device_out, obtained_feature_level, immediate_context); if (device_out) *device_out = NULL; if (obtained_feature_level) *obtained_feature_level = 0; if (immediate_context) *immediate_context = NULL; 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 D3D_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 D3D_DRIVER_TYPE_NULL: FIXME("NULL device not implemented, falling back to refrast.\n"); /* fall through, for now */ case D3D_DRIVER_TYPE_REFERENCE: { HMODULE refrast = LoadLibraryA("d3d11ref.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 D3D_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 = D3D11CoreCreateDevice(factory, adapter, flags, feature_levels, levels, &device); IDXGIAdapter_Release(adapter); IDXGIFactory_Release(factory); if (FAILED(hr)) { WARN("Failed to create a device, returning %#x.\n", hr); return hr; } TRACE("Created ID3D11Device %p.\n", device); if (obtained_feature_level) *obtained_feature_level = ID3D11Device_GetFeatureLevel(device); if (immediate_context) ID3D11Device_GetImmediateContext(device, immediate_context); if (device_out) *device_out = device; else ID3D11Device_Release(device); return S_OK; }