diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index d795e25f3f9..9f6d63b5ea4 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -716,7 +716,13 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, U /* Look at the implementation and set the correct Vtable */ switch(Impl) { case SURFACE_OPENGL: - /* Nothing to do, it's set already */ + /* Check if a 3D adapter is available when creating gl surfaces */ + if(!This->adapter) { + ERR("OpenGL surfaces are not available without opengl\n"); + HeapFree(GetProcessHeap(), 0, object->resource.allocatedMemory); + HeapFree(GetProcessHeap(), 0, object); + return WINED3DERR_NOTAVAILABLE; + } break; case SURFACE_GDI: diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index 86eb0cc8874..1dfb16d43f4 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -2418,8 +2418,10 @@ static HRESULT WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT Adapter, HDC hDC; int i; - /* Validate the adapter number */ - if (Adapter >= IWineD3D_GetAdapterCount(iface)) { + /* Validate the adapter number. If no adapters are available(no GL), ignore the adapter + * number and create a device without a 3D adapter for 2D only operation. + */ + if (IWineD3D_GetAdapterCount(iface) && Adapter >= IWineD3D_GetAdapterCount(iface)) { return WINED3DERR_INVALIDCALL; } @@ -2435,7 +2437,7 @@ static HRESULT WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT Adapter, object->lpVtbl = &IWineD3DDevice_Vtbl; object->ref = 1; object->wineD3D = iface; - object->adapter = &Adapters[Adapter]; + object->adapter = numAdapters ? &Adapters[Adapter] : NULL; IWineD3D_AddRef(object->wineD3D); object->parent = parent; diff --git a/dlls/wined3d/wined3d_main.c b/dlls/wined3d/wined3d_main.c index d232a2b85a2..d1cf28aa454 100644 --- a/dlls/wined3d/wined3d_main.c +++ b/dlls/wined3d/wined3d_main.c @@ -62,8 +62,11 @@ IWineD3D* WINAPI WineDirect3DCreate(UINT SDKVersion, UINT dxVersion, IUnknown *p IWineD3DImpl* object; if (!InitAdapters()) { - ERR("Failed to initialize direct3d adapters\n"); - return NULL; + WARN("Failed to initialize direct3d adapters, Direct3D will not be available\n"); + if(dxVersion > 7) { + ERR("Direct3D%d is not available without opengl\n", dxVersion); + return NULL; + } } object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IWineD3DImpl));