0

常にではない場合もあります...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));

S_OKと等しくなるまでcreateDeviceExをwhileループでラップするUPDATEは、最終的には機能します...しかし、そもそもこれが発生する原因は何でしょうか。

4

0 に答える 0