Direct3d девайс не хочет Reset'иться

Тема в разделе "Разработка игр и приложений к ним", создана пользователем -, 21 июн 2011.

Статус темы:
Закрыта.
  1. Гость

    Встретился с такой проблемой - когда TestCooperativeLevel возвращает D3DERR_DEVICENOTRESET, прога пытается восстановить девайс, но метод reset возвращает D3DERR_INVALIDCALL. При этом в debug trace выводится следующий текст
    Код (Text):
    Direct3D9: (WARN) :Window does not have focus. TestCooperativeLevel fails
    Direct3D9: :WM_SIZE hWnd=B04B8 wp=0000, lp=035E0598 dwFlags=00000001
    Direct3D9: :WM_SIZE: Window restored, sending WM_ACTIVATEAPP
    Direct3D9: :WM_ACTIVATEAPP: BEGIN Activating app pid=00000820, tid=000008a4
    Direct3D9: :*** Active state changing
    Direct3D9: :WM_ACTIVATEAPP: DONE Activating app pid=00000820, tid=000008a4
    Direct3D9: (ERROR) :Invalid value for BackBufferFormat. ValidatePresentParameters fails.
    Direct3D9: (ERROR) :Reset failed and Reset/TestCooperativeLevel/Release are the only legal APIs to be called subsequently
    Вот код рендера:
    Код (C++):
    bool Render (void)
    {
    HRESULT hRes = pdev->TestCooperativeLevel ();
    if (hRes == D3DERR_DEVICELOST)
    {
    return false;
    }
    if (hRes == D3DERR_DEVICENOTRESET)
    {
    hRes = pdev->Reset (&d3dpp);
    if (hRes == D3D_OK)
    {
    return true;
    }
    else
    {
    switch (hRes)
    {
    case D3DERR_DEVICELOST:
    ::FailInform (METHOD_D3DDEVICERESET, D3DERR_DEVICELOST);
    break;
    case D3DERR_DEVICEREMOVED:
    ::FailInform (METHOD_D3DDEVICERESET, D3DERR_DEVICEREMOVED);
    break;
    case D3DERR_DRIVERINTERNALERROR:
    ::FailInform (METHOD_D3DDEVICERESET, D3DERR_DRIVERINTERNALERROR);
    break;
    case D3DERR_OUTOFVIDEOMEMORY:
    ::FailInform (METHOD_D3DDEVICERESET, D3DERR_OUTOFVIDEOMEMORY);
    break;
    case D3D_OK:
    ::WriteLog ("Устройство Direct3D благополучно восстановлено.");
    break;
    case E_FAIL:
    ::FailInform (METHOD_D3DDEVICERESET, E_FAIL);
    break;
    case D3DERR_INVALIDCALL:
    ::FailInform (METHOD_D3DDEVICERESET, D3DERR_INVALIDCALL);
    break;
    default:
    ::FailInform (METHOD_D3DDEVICERESET_RETURNED, 1);
    }
    return false;
    }
    }
    if (hRes == D3D_OK)
    {
    pdev->Clear (0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xFFFF0000, 1.0f, 0);
    pdev->Present (0, 0, 0, 0);
    }
    return true;
    }
    Стоит также заметить, что никаких ресурсов я не создаю!
    Структура D3DPRESENT_PARAMETERS одинакова и для создания девайса, и для reset'а.
    Код (C++):
            ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.Windowed              = false;
    d3dpp.SwapEffect                = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat          = D3DFMT_A8R8G8B8;
    d3dpp.BackBufferCount           = 1;
    d3dpp.EnableAutoDepthStencil        = true;
    d3dpp.hDeviceWindow         = hwnd;
    d3dpp.AutoDepthStencilFormat        = D3DFMT_D24S8;
    d3dpp.MultiSampleType           = D3DMULTISAMPLE_NONE;
    d3dpp.FullScreen_RefreshRateInHz    = D3DPRESENT_RATE_DEFAULT;
    d3dpp.PresentationInterval          = D3DPRESENT_INTERVAL_IMMEDIATE;
    d3dpp.BackBufferWidth           = 1440;
    d3dpp.BackBufferHeight          = 900;
    d3dpp.Flags                 = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
    Девайс создаётся и reset'ится в одном потоке. Уже все форумы перелазил, нигде решения не нашёл. За код прошу строго не судить, я только изучаю d3d :)
     
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Может быть дело в этом:
    ?
     
  3. Гость

    Да, скорее всего. Я пробовал значения D3DFMT_A8R8G8B8 и D3DFMT_X8R8G8B8. И не получается. Что делать, понятия не имею. Эта проблема меня немало достаёт, особенно с привычкой моих компов периодически сворачивать окна. Может, найдётся пример кода, который будет возвращать девайс в рабочее состояние? Примеры из DirectX SDK мне не нужны.
     
Статус темы:
Закрыта.

Поделиться этой страницей