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));

UPDATE 将 CreateDeviceEx 包装在一个 while 循环中,直到它等于 S_OK 最终会起作用......但是首先是什么导致这种情况发生?

4

0 回答 0