Пример #1
0
HRESULT VBoxD3DIfDeviceCreateDummy(PVBOXWDDMDISP_DEVICE pDevice)
{
    VBOXWDDMDISP_RESOURCE Rc;
    vboxWddmResourceInit(&Rc, 1);

    Rc.RcDesc.enmFormat = D3DDDIFMT_A8R8G8B8;
    Rc.RcDesc.enmPool = D3DDDIPOOL_LOCALVIDMEM;
    Rc.RcDesc.enmMultisampleType = D3DDDIMULTISAMPLE_NONE;
    Rc.RcDesc.MultisampleQuality = 0;
    PVBOXWDDMDISP_ALLOCATION pAlloc = &Rc.aAllocations[0];
    pAlloc->enmD3DIfType = VBOXDISP_D3DIFTYPE_SURFACE;
    pAlloc->SurfDesc.width = 0x4;
    pAlloc->SurfDesc.height = 0x4;
    pAlloc->SurfDesc.format = D3DDDIFMT_A8R8G8B8;
    Assert(!pDevice->pDevice9If);
    VBOXWINEEX_D3DPRESENT_PARAMETERS Params;
    VBoxD3DIfFillPresentParams(&Params.Base, &Rc, 2);
    Params.pHgsmi = &pDevice->Uhgsmi.BasePrivate.Base;
    DWORD fFlags = D3DCREATE_HARDWARE_VERTEXPROCESSING;
    PVBOXWDDMDISP_ADAPTER pAdapter = pDevice->pAdapter;
    IDirect3DDevice9 * pDevice9If = NULL;

    HRESULT hr = pAdapter->D3D.pD3D9If->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, NULL, fFlags, &Params.Base, &pDevice9If);
    if (!SUCCEEDED(hr))
    {
        WARN(("CreateDevice failed hr 0x%x", hr));
        return hr;
    }

    pDevice->pDevice9If = pDevice9If;
    return S_OK;
}
HRESULT VBoxD3DIfDeviceCreateDummy(PVBOXWDDMDISP_DEVICE pDevice)
{
    VBOXWDDMDISP_RESOURCE Rc;
    vboxWddmResourceInit(&Rc, 1);

    Rc.RcDesc.enmFormat = D3DDDIFMT_A8R8G8B8;
    Rc.RcDesc.enmPool = D3DDDIPOOL_LOCALVIDMEM;
    Rc.RcDesc.enmMultisampleType = D3DDDIMULTISAMPLE_NONE;
    Rc.RcDesc.MultisampleQuality = 0;
    PVBOXWDDMDISP_ALLOCATION pAlloc = &Rc.aAllocations[0];
    pAlloc->enmD3DIfType = VBOXDISP_D3DIFTYPE_SURFACE;
    pAlloc->SurfDesc.width = 0x4;
    pAlloc->SurfDesc.height = 0x4;
    pAlloc->SurfDesc.format = D3DDDIFMT_A8R8G8B8;
    Assert(!pDevice->pDevice9If);
    VBOXWINEEX_D3DPRESENT_PARAMETERS Params;
    VBoxD3DIfFillPresentParams(&Params.Base, &Rc, 2);
#ifdef VBOX_WITH_CRHGSMI
    Params.pHgsmi = &pDevice->Uhgsmi.BasePrivate.Base;
#else
    Params.pHgsmi = NULL;
#endif
    DWORD fFlags =   D3DCREATE_HARDWARE_VERTEXPROCESSING
                   | D3DCREATE_FPU_PRESERVE; /* Do not allow Wine to mess with FPU control word. */
    PVBOXWDDMDISP_ADAPTER pAdapter = pDevice->pAdapter;
    IDirect3DDevice9 * pDevice9If = NULL;

    HRESULT hr = pAdapter->D3D.pD3D9If->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, NULL, fFlags, &Params.Base, &pDevice9If);
    if (SUCCEEDED(hr))
    {
        int32_t hostId = 0;
        hr = pAdapter->D3D.D3D.pfnVBoxWineExD3DDev9GetHostId((IDirect3DDevice9Ex*)pDevice9If, &hostId);
        if (SUCCEEDED(hr))
        {
            Assert(hostId);

            VBOXDISPIFESCAPE Data;
            Data.escapeCode = VBOXESC_SETCTXHOSTID;
            Data.u32CmdSpecific = (uint32_t)hostId;
            D3DDDICB_ESCAPE DdiEscape = {0};
            DdiEscape.hContext = pDevice->DefaultContext.ContextInfo.hContext;
            DdiEscape.hDevice = pDevice->hDevice;
        //    DdiEscape.Flags.Value = 0;
            DdiEscape.pPrivateDriverData = &Data;
            DdiEscape.PrivateDriverDataSize = sizeof (Data);
            hr = pDevice->RtCallbacks.pfnEscapeCb(pDevice->pAdapter->hAdapter, &DdiEscape);
            if (SUCCEEDED(hr))
            {
                pDevice->pDevice9If = pDevice9If;
                return S_OK;
            }
            else
                WARN(("pfnEscapeCb VBOXESC_SETCTXHOSTID failed hr 0x%x", hr));
        }
        else
            WARN(("pfnVBoxWineExD3DDev9GetHostId failed hr 0x%x", hr));

        pDevice->pAdapter->D3D.D3D.pfnVBoxWineExD3DDev9Term((IDirect3DDevice9Ex *)pDevice9If);
    }
    else
        WARN(("CreateDevice failed hr 0x%x", hr));

    return hr;
}