CreateDeviceEx иногда возвращает D3DERR_DRIVERINVALIDCALL

Иногда не всегда … при создании устройства D3D я получаю код ошибки D3DERR_DRIVERINVALIDCAL, а затем в другой раз получаю S_OK.

Я застрял в этом вопросе в течение последних 3 дней, номер 4.

Глядя на документацию по этому коду ошибки, он описывает, что он не используется, что очень запутанно.

Кто-нибудь может пролить свет?

HRESULT     hr = S_OK;
HWND        hwnd = NULL;
HMONITOR    hMonitor = NULL;
UINT        uAdapterID = D3DADAPTER_DEFAULT;
DWORD       vp = 0;

D3DCAPS9    ddCaps;
ZeroMemory(&ddCaps, sizeof(ddCaps));

IDirect3DDevice9* pDevice = NULL;

// Hold the lock because we might be discarding an exisiting device.
AutoLock lock(m_ObjectLock);

if (!m_pD3D9 || !m_pDeviceManager)
{
return MF_E_NOT_INITIALIZED;
}

hwnd = GetDesktopWindow();

// Note: The presenter creates additional swap chains to present the
// video frames. Therefore, it does not use the device's implicit
// swap chain, so the size of the back buffer here is 1 x 1.

D3DPRESENT_PARAMETERS pp;
ZeroMemory(&pp, sizeof(pp));

pp.BackBufferWidth = 1;
pp.BackBufferHeight = 1;
pp.Windowed = TRUE;
pp.SwapEffect = D3DSWAPEFFECT_COPY;
pp.BackBufferFormat = D3DFMT_UNKNOWN;
pp.hDeviceWindow = hwnd;
pp.Flags = D3DPRESENTFLAG_VIDEO;
pp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;

// Find the monitor for this window.
if (m_hwnd)
{
hMonitor = MonitorFromWindow(m_hwnd, MONITOR_DEFAULTTONEAREST);

// Find the corresponding adapter.
CHECK_HR(hr = FindAdapter(m_pD3D9, hMonitor, &uAdapterID));
}

// Get the device caps for this adapter.
CHECK_HR(hr = m_pD3D9->GetDeviceCaps(uAdapterID, D3DDEVTYPE_HAL, &ddCaps));

if(ddCaps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
{
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
}
else
{
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
}

IDirect3DDevice9Ex * pDeviceEx;

// Create the device.
CHECK_HR(hr = m_pD3D9->CreateDeviceEx(uAdapterID,
D3DDEVTYPE_HAL,
pp.hDeviceWindow,
vp | D3DCREATE_NOWINDOWCHANGES | D3DCREATE_MULTITHREADED | D3DCREATE_FPU_PRESERVE,
&pp,
NULL,
&pDeviceEx));

ОБНОВИТЬ
Обертывание CreateDeviceEx в цикле while до тех пор, пока оно не станет равным S_OK, в конце концов сработает … но что может вызвать это в первую очередь?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …