IDirect3DDevice9* CreateDevice9(HINSTANCE dll, IDirect3D9** d3d9, D3DADAPTER_IDENTIFIER9 *d3dai) { qDebug("creating d3d9 device..."); typedef IDirect3D9* (WINAPI *Create9Func)(UINT SDKVersion); Create9Func Create9 = (Create9Func)GetProcAddress(dll, "Direct3DCreate9"); if (!Create9) { qWarning("Symbol not found: Direct3DCreate9"); return NULL; } *d3d9 = Create9(D3D_SDK_VERSION); if (!(*d3d9)) { qWarning("Direct3DCreate9 failed"); return NULL; } if (d3dai) DX_WARN((*d3d9)->GetAdapterIdentifier(D3DADAPTER_DEFAULT, 0, d3dai)); D3DPRESENT_PARAMETERS d3dpp; InitParameters(&d3dpp); DWORD flags = D3DCREATE_FPU_PRESERVE | D3DCREATE_MULTITHREADED | D3DCREATE_MIXED_VERTEXPROCESSING; IDirect3DDevice9 *d3d9dev = NULL; DX_ENSURE(((*d3d9)->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetShellWindow(),// GetDesktopWindow(), //GetShellWindow()? flags, &d3dpp, &d3d9dev)) , NULL); qDebug("IDirect3DDevice9 created"); return d3d9dev; }
/** * It creates a Direct3D device usable for DXVA 2 */ static int D3dCreateDevice(vlc_va_t *va) { vlc_va_sys_t *sys = va->sys; /* */ LPDIRECT3D9 (WINAPI *Create9)(UINT SDKVersion); Create9 = (void *)GetProcAddress(sys->hd3d9_dll, "Direct3DCreate9"); if (!Create9) { msg_Err(va, "Cannot locate reference to Direct3DCreate9 ABI in DLL"); return VLC_EGENERIC; } /* */ LPDIRECT3D9 d3dobj; d3dobj = Create9(D3D_SDK_VERSION); if (!d3dobj) { msg_Err(va, "Direct3DCreate9 failed"); return VLC_EGENERIC; } sys->d3dobj = d3dobj; /* */ D3DADAPTER_IDENTIFIER9 *d3dai = &sys->d3dai; if (FAILED(IDirect3D9_GetAdapterIdentifier(sys->d3dobj, D3DADAPTER_DEFAULT, 0, d3dai))) { msg_Warn(va, "IDirect3D9_GetAdapterIdentifier failed"); ZeroMemory(d3dai, sizeof(*d3dai)); } /* */ D3DPRESENT_PARAMETERS *d3dpp = &sys->d3dpp; ZeroMemory(d3dpp, sizeof(*d3dpp)); d3dpp->Flags = D3DPRESENTFLAG_VIDEO; d3dpp->Windowed = TRUE; d3dpp->hDeviceWindow = NULL; d3dpp->SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp->MultiSampleType = D3DMULTISAMPLE_NONE; d3dpp->PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; d3dpp->BackBufferCount = 0; /* FIXME what to put here */ d3dpp->BackBufferFormat = D3DFMT_X8R8G8B8; /* FIXME what to put here */ d3dpp->BackBufferWidth = 0; d3dpp->BackBufferHeight = 0; d3dpp->EnableAutoDepthStencil = FALSE; /* Direct3D needs a HWND to create a device, even without using ::Present this HWND is used to alert Direct3D when there's a change of focus window. For now, use GetDesktopWindow, as it looks harmless */ LPDIRECT3DDEVICE9 d3ddev; if (FAILED(IDirect3D9_CreateDevice(d3dobj, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetDesktopWindow(), D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED, d3dpp, &d3ddev))) { msg_Err(va, "IDirect3D9_CreateDevice failed"); return VLC_EGENERIC; } sys->d3ddev = d3ddev; return VLC_SUCCESS; }
/** * It creates a DirectX video service */ static int hb_d3d_create_device( hb_va_dxva2_t *dxva2 ) { LPDIRECT3D9 (WINAPI *Create9)( UINT SDKVersion ); Create9 = (void*)GetProcAddress( dxva2->hd3d9_dll, TEXT( "Direct3DCreate9" )); if( !Create9 ) { hb_log( "dxva2:Cannot locate reference to Direct3DCreate9 ABI in DLL" ); return HB_WORK_ERROR; } LPDIRECT3D9 d3dobj; d3dobj = Create9( D3D_SDK_VERSION ); if( !d3dobj ) { hb_log( "dxva2:Direct3DCreate9 failed" ); return HB_WORK_ERROR; } dxva2->d3dobj = d3dobj; D3DADAPTER_IDENTIFIER9 *d3dai = &dxva2->d3dai; if( FAILED( IDirect3D9_GetAdapterIdentifier( dxva2->d3dobj, D3DADAPTER_DEFAULT, 0, d3dai ))) { hb_log( "dxva2:IDirect3D9_GetAdapterIdentifier failed" ); memset( d3dai, 0, sizeof(*d3dai)); } PROCGETSHELLWND GetShellWindow; HMODULE hUser32 = GetModuleHandle( "user32" ); GetShellWindow = (PROCGETSHELLWND) GetProcAddress( hUser32, "GetShellWindow" ); D3DPRESENT_PARAMETERS *d3dpp = &dxva2->d3dpp; memset( d3dpp, 0, sizeof(*d3dpp)); d3dpp->Flags = D3DPRESENTFLAG_VIDEO; d3dpp->Windowed = TRUE; d3dpp->hDeviceWindow = NULL; d3dpp->SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp->MultiSampleType = D3DMULTISAMPLE_NONE; d3dpp->PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; d3dpp->BackBufferCount = 0; /* FIXME what to put here */ d3dpp->BackBufferFormat = D3DFMT_X8R8G8B8; /* FIXME what to put here */ d3dpp->BackBufferWidth = 0; d3dpp->BackBufferHeight = 0; d3dpp->EnableAutoDepthStencil = FALSE; LPDIRECT3DDEVICE9 d3ddev; //if (FAILED(IDirect3D9_CreateDevice(d3dobj, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetShellWindow(), D3DCREATE_SOFTWARE_VERTEXPROCESSING|D3DCREATE_MULTITHREADED, d3dpp, &d3ddev))) if( FAILED( IDirect3D9_CreateDevice( d3dobj, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetShellWindow(), D3DCREATE_HARDWARE_VERTEXPROCESSING|D3DCREATE_MULTITHREADED, d3dpp, &d3ddev ))) { hb_log( "dxva2:IDirect3D9_CreateDevice failed" ); return HB_WORK_ERROR; } dxva2->d3ddev = d3ddev; return HB_WORK_OK; }
bool VideoDecoderDXVAPrivate::D3dCreateDeviceFallback() { qDebug("Fallback to d3d9"); typedef IDirect3D9* (WINAPI *Create9Func)(UINT SDKVersion); Create9Func Create9 = (Create9Func)GetProcAddress(hd3d9_dll, "Direct3DCreate9"); if (!Create9) { qWarning("Cannot locate reference to Direct3DCreate9 ABI in DLL"); return false; } d3dobj = Create9(D3D_SDK_VERSION); if (!d3dobj) { qWarning("Direct3DCreate9 failed"); return false; } if (FAILED(d3dobj->GetAdapterIdentifier(D3DADAPTER_DEFAULT, 0, &d3dai))) { qWarning("IDirect3D9->GetAdapterIdentifier failed"); ZeroMemory(&d3dai, sizeof(d3dai)); return false; } vendor = getVendorName(&d3dai); description = QString().sprintf("DXVA2 (%.*s, vendor %lu(%s), device %lu, revision %lu)", sizeof(d3dai.Description), d3dai.Description, d3dai.VendorId, qPrintable(vendor), d3dai.DeviceId, d3dai.Revision); //if (copy_uswc) // copy_uswc = vendor.toLower() == "intel"; qDebug("DXVA2 description: %s", description.toUtf8().constData()); D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); // use mozilla's parameters d3dpp.Flags = D3DPRESENTFLAG_VIDEO; d3dpp.Windowed = TRUE; d3dpp.hDeviceWindow = ::GetShellWindow(); //NULL; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; //d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; //d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; d3dpp.BackBufferCount = 1; //0; /* FIXME what to put here */ d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; //D3DFMT_X8R8G8B8; /* FIXME what to put here */ d3dpp.BackBufferWidth = 1; //0; d3dpp.BackBufferHeight = 1; //0; //d3dpp.EnableAutoDepthStencil = FALSE; DWORD flags = D3DCREATE_FPU_PRESERVE | D3DCREATE_MULTITHREADED | D3DCREATE_MIXED_VERTEXPROCESSING; if (FAILED(d3dobj->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetShellWindow(),// GetDesktopWindow(), //GetShellWindow()? flags, &d3dpp, &d3ddev))) { qWarning("IDirect3D9->CreateDevice failed"); d3ddev = 0; return false; } qDebug("IDirect3DDevice9 created...."); return true; }
bool VideoDecoderDXVAPrivate::D3dCreateDevice() { typedef IDirect3D9* (WINAPI *Create9Func)(UINT SDKVersion); Create9Func Create9 = (Create9Func)GetProcAddress(hd3d9_dll, "Direct3DCreate9"); if (!Create9) { qWarning("Cannot locate reference to Direct3DCreate9 ABI in DLL"); return false; } d3dobj = Create9(D3D_SDK_VERSION); if (!d3dobj) { qWarning("Direct3DCreate9 failed"); return false; } if (FAILED(d3dobj->GetAdapterIdentifier(D3DADAPTER_DEFAULT, 0, &d3dai))) { qWarning("IDirect3D9_GetAdapterIdentifier failed"); ZeroMemory(&d3dai, sizeof(d3dai)); } else { description = DxDescribe(&d3dai); qDebug("DXVA2 description: %s", description.toUtf8().constData()); } ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.Flags = D3DPRESENTFLAG_VIDEO; d3dpp.Windowed = TRUE; d3dpp.hDeviceWindow = NULL; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; d3dpp.BackBufferCount = 0; /* FIXME what to put here */ d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8; /* FIXME what to put here */ d3dpp.BackBufferWidth = 0; d3dpp.BackBufferHeight = 0; d3dpp.EnableAutoDepthStencil = FALSE; /* Direct3D needs a HWND to create a device, even without using ::Present this HWND is used to alert Direct3D when there's a change of focus window. For now, use GetDesktopWindow, as it looks harmless */ if (FAILED(d3dobj->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetDesktopWindow(), //GetShellWindow()? D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED, &d3dpp, &d3ddev))) { qWarning("IDirect3D9_CreateDevice failed"); return false; } return true; }