Сбой создания DirectX9 CreateDevice с D3DERR_NOTAVAILABLE

Имеется код инициализации для устройства 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 работает на какой-то виртуальной машине. Вот почему, я думаю, есть только один программный адаптер.


person mjollneer    schedule 15.01.2014    source источник


Ответы (1)


Вы не указали метод обработки вершин в функции CreateDevice. попробуйте установить его как D3DCREATE_SOFTWARE_VERTEXPROCESSING, вы должны установить один из методов обработки вершин, это обязательно в соответствии с документом DirectX SDK.

D3DCREATE_HARDWARE_VERTEXPROCESSING, D3DCREATE_MIXED_VERTEXPROCESSING и D3DCREATE_SOFTWARE_VERTEXPROCESSING являются взаимоисключающими флагами. По крайней мере один из этих флагов обработки вершин должен быть указан при вызове CreateDevice.

person zdd    schedule 17.01.2014
comment
О нет. На самом деле я установил этот флаг: D3DCREATE_HARDWARE_VERTEXPROCESSING для основного устройства и D3DCREATE_SOFTWARE_VERTEXPROCESSING для эталонного. Я просто забыл эту часть, когда собирал строки из разных методов. Последний флаг — D3DCREATE_FPU_PRESERVE|D3DCREATE_MULTITHREADED|D3DCREATE_SOFTWARE_VERTEXPROCESSING. Может слишком много? - person mjollneer; 17.01.2014
comment
Что ты имеешь в виду? Должен ли я думать, что, скорее всего, решения вообще нет? - person mjollneer; 17.01.2014