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