mfxStatus CD3D11Device::Init( mfxHDL hWindow, mfxU16 nViews, mfxU32 nAdapterNum) { mfxStatus sts = MFX_ERR_NONE; HRESULT hres = S_OK; m_nViews = nViews; if (2 < nViews) return MFX_ERR_UNSUPPORTED; m_bDefaultStereoEnabled = FALSE; static D3D_FEATURE_LEVEL FeatureLevels[] = { D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0 }; D3D_FEATURE_LEVEL pFeatureLevelsOut; hres = CreateDXGIFactory(__uuidof(IDXGIFactory2), (void**)(m_pDXGIFactory.Assign()) ); if (FAILED(hres)) return MFX_ERR_DEVICE_FAILED; if (m_nViews == 2 && hWindow) { hres = m_pDXGIFactory->QueryInterface(__uuidof(IDXGIDisplayControl), (void **)m_pDisplayControl.Assign()); if (FAILED(hres)) return MFX_ERR_DEVICE_FAILED; m_bDefaultStereoEnabled = m_pDisplayControl->IsStereoEnabled(); if (!m_bDefaultStereoEnabled) m_pDisplayControl->SetStereoEnabled(TRUE); } hres = m_pDXGIFactory->EnumAdapters(nAdapterNum, m_pAdapter.Assign()); if (FAILED(hres)) return MFX_ERR_DEVICE_FAILED; hres = D3D11CreateDevice(m_pAdapter , D3D_DRIVER_TYPE_UNKNOWN, NULL, 0, FeatureLevels, MSDK_ARRAY_LEN(FeatureLevels), D3D11_SDK_VERSION, m_pD3D11Device.Assign(), &pFeatureLevelsOut, m_pD3D11Ctx.Assign()); if (FAILED(hres)) return MFX_ERR_DEVICE_FAILED; m_pDXGIDev = m_pD3D11Device; m_pDX11VideoDevice = m_pD3D11Device; m_pVideoContext = m_pD3D11Ctx; MSDK_CHECK_POINTER(!!m_pDXGIDev, MFX_ERR_NULL_PTR); MSDK_CHECK_POINTER(!!m_pDX11VideoDevice, MFX_ERR_NULL_PTR); MSDK_CHECK_POINTER(!!m_pVideoContext, MFX_ERR_NULL_PTR); // turn on multithreading for the Context ComPtr<ID3D10Multithread> p_mt; p_mt = m_pVideoContext; if (p_mt) p_mt->SetMultithreadProtected(true); else return MFX_ERR_DEVICE_FAILED; // create swap chain only for rendering use case (hWindow != 0) DXGI_SWAP_CHAIN_DESC scd; if (hWindow) { ZeroMemory(&scd, sizeof(scd)); sts = FillSCD(hWindow, scd); MSDK_CHECK_RESULT(sts, MFX_ERR_NONE, sts); MSDK_CHECK_POINTER (!!m_pDXGIFactory, MFX_ERR_NULL_PTR); DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0}; swapChainDesc.Width = 0; // Use automatic sizing. swapChainDesc.Height = 0; swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; // This is the most common swap chain format. swapChainDesc.Stereo = m_nViews == 2 ? TRUE : FALSE; swapChainDesc.SampleDesc.Count = 1; // Don't use multi-sampling. swapChainDesc.SampleDesc.Quality = 0; swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; swapChainDesc.BufferCount = 2; // Use double buffering to minimize latency. swapChainDesc.Scaling = DXGI_SCALING_STRETCH; swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; swapChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; hres = m_pDXGIFactory->CreateSwapChainForHwnd(m_pD3D11Device, (HWND)hWindow, &swapChainDesc, NULL, NULL, reinterpret_cast<IDXGISwapChain1**>(&m_pSwapChain) ); if (FAILED(hres)) return MFX_ERR_DEVICE_FAILED; } return sts; }
mfxStatus CD3D11Device::Init( mfxHDL hWindow, mfxU16 nViews, mfxU32 nAdapterNum) { m_HandleWindow = (HWND)hWindow; mfxStatus sts = MFX_ERR_NONE; HRESULT hres = S_OK; m_nViews = nViews; if (2 < nViews) return MFX_ERR_UNSUPPORTED; m_bDefaultStereoEnabled = FALSE; static D3D_FEATURE_LEVEL FeatureLevels[] = { D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0 }; D3D_FEATURE_LEVEL pFeatureLevelsOut; hres = CreateDXGIFactory(__uuidof(IDXGIFactory2), (void**)(&m_pDXGIFactory) ); if (FAILED(hres)) return MFX_ERR_DEVICE_FAILED; if (m_nViews == 2 && hWindow) { hres = m_pDXGIFactory->QueryInterface(__uuidof(IDXGIDisplayControl), (void **)&m_pDisplayControl); if (FAILED(hres)) return MFX_ERR_DEVICE_FAILED; m_bDefaultStereoEnabled = m_pDisplayControl->IsStereoEnabled(); if (!m_bDefaultStereoEnabled) m_pDisplayControl->SetStereoEnabled(TRUE); } hres = m_pDXGIFactory->EnumAdapters(nAdapterNum,&m_pAdapter); if (FAILED(hres)) return MFX_ERR_DEVICE_FAILED; hres = D3D11CreateDevice(m_pAdapter , D3D_DRIVER_TYPE_UNKNOWN, NULL, 0, FeatureLevels, MSDK_ARRAY_LEN(FeatureLevels), D3D11_SDK_VERSION, &m_pD3D11Device, &pFeatureLevelsOut, &m_pD3D11Ctx); if (FAILED(hres)) return MFX_ERR_DEVICE_FAILED; m_pDXGIDev = m_pD3D11Device; m_pDX11VideoDevice = m_pD3D11Device; m_pVideoContext = m_pD3D11Ctx; MSDK_CHECK_POINTER(m_pDXGIDev.p, MFX_ERR_NULL_PTR); MSDK_CHECK_POINTER(m_pDX11VideoDevice.p, MFX_ERR_NULL_PTR); MSDK_CHECK_POINTER(m_pVideoContext.p, MFX_ERR_NULL_PTR); // turn on multithreading for the Context CComQIPtr<ID3D10Multithread> p_mt(m_pVideoContext); if (p_mt) p_mt->SetMultithreadProtected(true); else return MFX_ERR_DEVICE_FAILED; // create swap chain only for rendering use case (hWindow != 0) if (hWindow) { MSDK_CHECK_POINTER(m_pDXGIFactory.p, MFX_ERR_NULL_PTR); DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0}; sts = FillSCD1(swapChainDesc); MSDK_CHECK_RESULT(sts, MFX_ERR_NONE, sts); hres = m_pDXGIFactory->CreateSwapChainForHwnd(m_pD3D11Device, (HWND)hWindow, &swapChainDesc, NULL, NULL, reinterpret_cast<IDXGISwapChain1**>(&m_pSwapChain)); if (FAILED(hres)) return MFX_ERR_DEVICE_FAILED; } return sts; }