При инициализации D3D9 сторонняя библиотека перестает работать - PullRequest
3 голосов
/ 14 февраля 2011

Во-первых, общая ситуация ... сторонняя библиотека, загруженная через DLL, выполняет рендеринг в HWND.Это простой 2D-рендеринг, и я не вижу в нем непосредственного использования D3D - при обходе зависимостей в DLL показывается множество функций D3DKMT, таких как D3DKMTCreateDevice, но не обычные вызовы D3D, такие как IDirect3D9::CreateDevice.Когда я звоню IDirect3D9::CreateDevice, сторонний рендеринг становится чокнутым.Он не жалуется, а просто отображает все как черные прямоугольники.Мой собственный рендеринг работает нормально.

Специфика ... Сторонняя DLL - это Mozilla XULRunner 1.9.x, которая является ядром FireFox (не 2.0 с аппаратным ускорением), обернутая в библиотеку wxWidgets wxWebConnect,wxWC загружает XUL DLL и предоставляет компонент GUI веб-браузера.

У меня есть рабочее приложение, использующее wx & wxWebConnect, скомпилированный EXE-файл и код: http://www.kirix.com/forums/viewtopic.php?f=25&t=911#p2605

Вот мойРеальный код, он немного привязан к wxWidgets, но не настолько, чтобы его было трудно читать - я получаю HWND из случайного окна, просто чтобы инициализировать D3D, но никогда не рендеринг на него:

void MyFrame::OnD3DButton( wxCommandEvent &event )
{
    static bool initialized = false;
    static LPDIRECT3D9 mpD3D = NULL;
    static LPDIRECT3DDEVICE9 mpD3DDevice=NULL;
    if(!initialized)
    {
        wxButton *button=wxDynamicCast(event.GetEventObject(), wxButton);
        HWND mHWnd = (HWND)button->GetHandle();
        mpD3D = Direct3DCreate9(D3D_SDK_VERSION);

        D3DPRESENT_PARAMETERS md3dpp;
        ZeroMemory( &md3dpp, sizeof(D3DPRESENT_PARAMETERS) );
        md3dpp.Windowed                 = true;
        md3dpp.SwapEffect               = D3DSWAPEFFECT_DISCARD;
        // triple buffer if VSync is on
        md3dpp.BackBufferCount          = 1;
        md3dpp.EnableAutoDepthStencil   = 0;
        md3dpp.hDeviceWindow            = mHWnd;
        md3dpp.BackBufferWidth          = 0;
        md3dpp.BackBufferHeight         = 0;
        md3dpp.FullScreen_RefreshRateInHz = 0;
        md3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
        md3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
        md3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
        md3dpp.MultiSampleQuality = 0;

        HRESULT hr = mpD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,mHWnd,
            D3DCREATE_MULTITHREADED|D3DCREATE_MIXED_VERTEXPROCESSING,&md3dpp,&mpD3DDevice);
        if(FAILED(hr))
            wxMessageBox(wxString("mpD3D->CreateDevice() FAILED"));
        else
        {
            wxMessageBox(wxString("mpD3D->CreateDevice() SUCCEEDED"));
            initialized = true;
        }
    }

}

Ответы [ 2 ]

5 голосов
/ 28 февраля 2011

Возможно, проблема в том, что CreateDevice изменит состояние FPU, если вы не передадите флаг D3DCREATE_FPU_PRESERVE.Мне понадобилось очень много времени, чтобы найти это, когда меня укусило.

1 голос
/ 14 февраля 2011

вы создаете устройство D3D с тем же hwnd, что и используемое сторонним dll?

в этом случае, может быть, стороннее программное обеспечение все еще рисует свои вещи, но direct3d просто рендерит сверхупоэтому вы видите только вывод d3d.

...