Имеется код инициализации для устройства dx9
D3DDISPLAYMODE display;
m_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &display);
ZeroMemory(&m_d3dpp, sizeof(m_d3dpp));
m_d3dpp.Windowed = false;
m_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
m_d3dpp.BackBufferFormat = display.Format;
m_d3dpp.EnableAutoDepthStencil = false;
m_d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
/*BackBufferHeight and BackBufferWidth also set from elsewhere*/
DWORD flags = D3DCREATE_FPU_PRESERVE|D3DCREATE_MULTITHREADED;
m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, m_Devtype, hWnd, flags, &m_d3dpp, &m_pd3dDevice)
Дело в том, что это хорошо работает как с m_Devtype = D3DDEVTYPE_HAL, так и с m_Devtype = D3DDEVTYPE_REF.
Но на каком-то конкретном компьютере (winXP, sp3, последний установленный dx) CreateDevice возвращает D3DERR_INVALIDCALL для D3DDEVTYPE_HAL и D3DERR_NOTAVAILABLE для D3DDEVTYPE_REF. m_pD3D
и display
оба допустимы. display
структура имеет rgb565 в поле формата.
Вроде бы важно: "DX Caps Viewer" не показывает никаких аппаратных адаптеров, а только один софт в формате rgb565.
Похоже, все параметры в CreateDevice правильные, и я ожидаю, что он должен возвращать D3D_OK для эталонного устройства, почему бы и нет?
UPD1: Теперь я знаю, что этот несчастный XP работает на какой-то виртуальной машине. Вот почему, я думаю, есть только один программный адаптер.