HRESULT CD3DUtils::Init(DWORD type) { HWND hWnd = GetDesktopWindow(); HRESULT hr = E_FAIL; if (type == D3DDEV_TYPE_D3D9) { hr = InitD3D9Device(hWnd); CHECK_RETHR(hr); if(m_pfDXVA2CreateDirect3DDeviceManager9) { SAFE_RELEASE(m_pD3D9DevMgr); hr = m_pfDXVA2CreateDirect3DDeviceManager9(&m_ResetToken, &m_pD3D9DevMgr); } else hr = E_FAIL; if (S_OK == hr) { hr = m_pD3D9DevMgr->ResetDevice(m_pD3DDevice9, m_ResetToken); if(S_OK != hr) { SAFE_RELEASE(m_pD3D9DevMgr); m_ResetToken = 0; } } CreateVideoProcessor(1440, 900); m_pSurfDev9 = new CDXSurfaceDevice9(m_pD3DDevice9); } else if(type == D3DDEV_TYPE_D3D10) { hr = InitD3D10Device(hWnd); CHECK_RETHR(hr); m_pSurfDev10 = new CDXSurfaceDevice10(m_pD3DDevice10); } return hr; }
mfxStatus CD3D11Device::RenderFrame(mfxFrameSurface1 * pSrf, mfxFrameAllocator * pAlloc) { HRESULT hres = S_OK; mfxStatus sts; sts = CreateVideoProcessor(pSrf); MSDK_CHECK_RESULT(sts, MFX_ERR_NONE, sts); hres = m_pSwapChain->GetBuffer(0, __uuidof( ID3D11Texture2D ), (void**)m_pDXGIBackBuffer.Assign()); if (FAILED(hres)) return MFX_ERR_DEVICE_FAILED; D3D11_VIDEO_PROCESSOR_OUTPUT_VIEW_DESC OutputViewDesc; if (2 == m_nViews) { m_pVideoContext->VideoProcessorSetStreamStereoFormat(m_pVideoProcessor, 0, TRUE,D3D11_VIDEO_PROCESSOR_STEREO_FORMAT_SEPARATE, TRUE, TRUE, D3D11_VIDEO_PROCESSOR_STEREO_FLIP_NONE, NULL); m_pVideoContext->VideoProcessorSetOutputStereoMode(m_pVideoProcessor,TRUE); OutputViewDesc.ViewDimension = D3D11_VPOV_DIMENSION_TEXTURE2DARRAY; OutputViewDesc.Texture2DArray.ArraySize = 2; OutputViewDesc.Texture2DArray.MipSlice = 0; OutputViewDesc.Texture2DArray.FirstArraySlice = 0; } else { OutputViewDesc.ViewDimension = D3D11_VPOV_DIMENSION_TEXTURE2D; OutputViewDesc.Texture2D.MipSlice = 0; } if (1 == m_nViews || 0 == pSrf->Info.FrameId.ViewId) { hres = m_pDX11VideoDevice->CreateVideoProcessorOutputView( m_pDXGIBackBuffer, m_VideoProcessorEnum, &OutputViewDesc, m_pOutputView.Assign() ); if (FAILED(hres)) return MFX_ERR_DEVICE_FAILED; } D3D11_VIDEO_PROCESSOR_INPUT_VIEW_DESC InputViewDesc; InputViewDesc.FourCC = 0; InputViewDesc.ViewDimension = D3D11_VPIV_DIMENSION_TEXTURE2D; InputViewDesc.Texture2D.MipSlice = 0; InputViewDesc.Texture2D.ArraySlice = 0; mfxHDLPair pair = {NULL}; sts = pAlloc->GetHDL(pAlloc->pthis, pSrf->Data.MemId, (mfxHDL*)&pair); MSDK_CHECK_RESULT(sts, MFX_ERR_NONE, sts); ID3D11Texture2D *pRTTexture2D = reinterpret_cast<ID3D11Texture2D*>(pair.first); D3D11_TEXTURE2D_DESC RTTexture2DDesc; if(!m_pTempTexture && m_nViews == 2) { pRTTexture2D->GetDesc(&RTTexture2DDesc); hres = m_pD3D11Device->CreateTexture2D(&RTTexture2DDesc,NULL, m_pTempTexture.Assign()); if (FAILED(hres)) return MFX_ERR_DEVICE_FAILED; } // Creating input views for left and righ eyes if (1 == m_nViews) { hres = m_pDX11VideoDevice->CreateVideoProcessorInputView( pRTTexture2D, m_VideoProcessorEnum, &InputViewDesc, m_pInputViewLeft.Assign() ); } else if (2 == m_nViews && 0 == pSrf->Info.FrameId.ViewId) { m_pD3D11Ctx->CopyResource(m_pTempTexture,pRTTexture2D); hres = m_pDX11VideoDevice->CreateVideoProcessorInputView( m_pTempTexture, m_VideoProcessorEnum, &InputViewDesc, m_pInputViewLeft.Assign() ); } else { hres = m_pDX11VideoDevice->CreateVideoProcessorInputView( pRTTexture2D, m_VideoProcessorEnum, &InputViewDesc, m_pInputViewRight.Assign() ); } if (FAILED(hres)) return MFX_ERR_DEVICE_FAILED; // NV12 surface to RGB backbuffer RECT rect = {0}; rect.right = pSrf->Info.CropW; rect.bottom = pSrf->Info.CropH; D3D11_VIDEO_PROCESSOR_STREAM StreamData; if (1 == m_nViews || pSrf->Info.FrameId.ViewId == 1) { StreamData.Enable = TRUE; StreamData.OutputIndex = 0; StreamData.InputFrameOrField = 0; StreamData.PastFrames = 0; StreamData.FutureFrames = 0; StreamData.ppPastSurfaces = NULL; StreamData.ppFutureSurfaces = NULL; StreamData.pInputSurface = m_pInputViewLeft; StreamData.ppPastSurfacesRight = NULL; StreamData.ppFutureSurfacesRight = NULL; StreamData.pInputSurfaceRight = m_nViews == 2 ? m_pInputViewRight : NULL; m_pVideoContext->VideoProcessorSetStreamSourceRect(m_pVideoProcessor, 0, true, &rect); m_pVideoContext->VideoProcessorSetStreamFrameFormat( m_pVideoProcessor, 0, D3D11_VIDEO_FRAME_FORMAT_PROGRESSIVE); hres = m_pVideoContext->VideoProcessorBlt( m_pVideoProcessor, m_pOutputView, 0, 1, &StreamData ); if (FAILED(hres)) return MFX_ERR_DEVICE_FAILED; } if (1 == m_nViews || 1 == pSrf->Info.FrameId.ViewId) { DXGI_PRESENT_PARAMETERS parameters = {0}; hres = m_pSwapChain->Present1(0, 0, ¶meters); if (FAILED(hres)) return MFX_ERR_DEVICE_FAILED; } return MFX_ERR_NONE; }