vlc | branch: master | Steve Lhomme <rob...@ycbcr.xyz> | Mon Mar 2 17:05:48 2020 +0100| [5fbc2a6bec6af7ea1b1d5ceb92b72eecda145425] | committer: Steve Lhomme
d3d9_fmt: move the code to reset the D3D9 device So we don't have to share the D3D9_FillPresentationParameters function. + cleaning of the cleaning functions > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=5fbc2a6bec6af7ea1b1d5ceb92b72eecda145425 --- modules/video_chroma/d3d9_fmt.c | 92 +++++++++++++++++++++------------- modules/video_chroma/d3d9_fmt.h | 2 +- modules/video_output/win32/direct3d9.c | 32 +++--------- 3 files changed, 67 insertions(+), 59 deletions(-) diff --git a/modules/video_chroma/d3d9_fmt.c b/modules/video_chroma/d3d9_fmt.c index 730a5b7a00..fed4831757 100644 --- a/modules/video_chroma/d3d9_fmt.c +++ b/modules/video_chroma/d3d9_fmt.c @@ -52,6 +52,63 @@ typedef struct { d3d9_decoder_device_t dec_device; } d3d9_decoder_device; +/** + * It setup vout_display_sys_t::d3dpp and vout_display_sys_t::rect_display + * from the default adapter. + */ +static HRESULT FillPresentationParameters(const d3d9_decoder_device_t *dec_dev, + D3DPRESENT_PARAMETERS *d3dpp) +{ + /* + ** Get the current desktop display mode, so we can set up a back + ** buffer of the same format + */ + D3DDISPLAYMODE d3ddm; + HRESULT hr = IDirect3D9_GetAdapterDisplayMode(dec_dev->hd3d.obj, dec_dev->d3ddev.adapterId, &d3ddm); + if (FAILED(hr)) + return hr; + + /* Set up the structure used to create the D3DDevice. */ + ZeroMemory(d3dpp, sizeof(D3DPRESENT_PARAMETERS)); + d3dpp->Flags = D3DPRESENTFLAG_VIDEO; + d3dpp->Windowed = TRUE; + d3dpp->MultiSampleType = D3DMULTISAMPLE_NONE; + d3dpp->PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; + d3dpp->EnableAutoDepthStencil = FALSE; + d3dpp->hDeviceWindow = NULL; + d3dpp->SwapEffect = D3DSWAPEFFECT_COPY; + d3dpp->BackBufferFormat = d3ddm.Format; + d3dpp->BackBufferCount = 1; + d3dpp->BackBufferWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN); + d3dpp->BackBufferHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN); + + return D3D_OK; +} + +int D3D9_ResetDevice(vlc_object_t *o, d3d9_decoder_device_t *dec_dev) +{ + D3DPRESENT_PARAMETERS d3dpp; + if (FAILED(FillPresentationParameters(dec_dev, &d3dpp))) + { + msg_Err(o, "Could not get presentation parameters to reset device"); + return VLC_EGENERIC; + } + + /* */ + HRESULT hr; + if (dec_dev->hd3d.use_ex){ + hr = IDirect3DDevice9Ex_ResetEx(dec_dev->d3ddev.devex, &d3dpp, NULL); + } else { + hr = IDirect3DDevice9_Reset(dec_dev->d3ddev.dev, &d3dpp); + } + if (FAILED(hr)) { + msg_Err(o, "IDirect3DDevice9_Reset failed! (hr=0x%lX)", hr); + return VLC_EGENERIC; + } + dec_dev->d3ddev.BufferFormat = d3dpp.BackBufferFormat; + return VLC_SUCCESS; +} + static void D3D9_Destroy(d3d9_handle_t *hd3d) { if (hd3d->obj) @@ -207,7 +264,7 @@ d3d9_handle_t *hd3d = &sys->dec_device.hd3d; out->adapterId = AdapterToUse; /* TODO only create a device for the decoder dimensions */ D3DPRESENT_PARAMETERS d3dpp; - if (D3D9_FillPresentationParameters(&sys->dec_device, &d3dpp)) + if (FAILED(FillPresentationParameters(&sys->dec_device, &d3dpp))) { msg_Err(o, "Could not get presentation parameters"); goto error; @@ -271,39 +328,6 @@ void D3D9_ReleaseDevice(d3d9_decoder_device_t *dec_dev) sys->cleanupDeviceCb( sys->opaque ); } -/** - * It setup vout_display_sys_t::d3dpp and vout_display_sys_t::rect_display - * from the default adapter. - */ -int D3D9_FillPresentationParameters(const d3d9_decoder_device_t *dec_dev, - D3DPRESENT_PARAMETERS *d3dpp) -{ - /* - ** Get the current desktop display mode, so we can set up a back - ** buffer of the same format - */ - D3DDISPLAYMODE d3ddm; - HRESULT hr = IDirect3D9_GetAdapterDisplayMode(dec_dev->hd3d.obj, dec_dev->d3ddev.adapterId, &d3ddm); - if (FAILED(hr)) - return VLC_EGENERIC; - - /* Set up the structure used to create the D3DDevice. */ - ZeroMemory(d3dpp, sizeof(D3DPRESENT_PARAMETERS)); - d3dpp->Flags = D3DPRESENTFLAG_VIDEO; - d3dpp->Windowed = TRUE; - d3dpp->MultiSampleType = D3DMULTISAMPLE_NONE; - d3dpp->PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; - d3dpp->EnableAutoDepthStencil = FALSE; - d3dpp->hDeviceWindow = NULL; - d3dpp->SwapEffect = D3DSWAPEFFECT_COPY; - d3dpp->BackBufferFormat = d3ddm.Format; - d3dpp->BackBufferCount = 1; - d3dpp->BackBufferWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN); - d3dpp->BackBufferHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN); - - return VLC_SUCCESS; -} - const struct vlc_video_context_operations d3d9_vctx_ops = { NULL, }; diff --git a/modules/video_chroma/d3d9_fmt.h b/modules/video_chroma/d3d9_fmt.h index 396872357f..727b4ac692 100644 --- a/modules/video_chroma/d3d9_fmt.h +++ b/modules/video_chroma/d3d9_fmt.h @@ -139,7 +139,7 @@ d3d9_decoder_device_t *D3D9_CreateDevice(vlc_object_t *); void D3D9_ReleaseDevice(d3d9_decoder_device_t *); -int D3D9_FillPresentationParameters(const d3d9_decoder_device_t *, D3DPRESENT_PARAMETERS *); +int D3D9_ResetDevice(vlc_object_t *, d3d9_decoder_device_t *); void d3d9_pic_context_destroy(picture_context_t *); picture_context_t *d3d9_pic_context_copy(picture_context_t *); diff --git a/modules/video_output/win32/direct3d9.c b/modules/video_output/win32/direct3d9.c index 02a82dd7a9..e724e4af16 100644 --- a/modules/video_output/win32/direct3d9.c +++ b/modules/video_output/win32/direct3d9.c @@ -427,6 +427,8 @@ static void Direct3D9DestroyScene(vout_display_t *vd) vout_display_sys_t *sys = vd->sys; Direct3D9DeleteRegions(sys->d3dregion_count, sys->d3dregion); + sys->d3dregion_count = 0; + sys->d3dregion = NULL; if (sys->sceneVertexBuffer) { @@ -440,9 +442,6 @@ static void Direct3D9DestroyScene(vout_display_t *vd) sys->sceneTexture = NULL; } - sys->d3dregion_count = 0; - sys->d3dregion = NULL; - msg_Dbg(vd, "Direct3D9 scene released successfully"); } @@ -451,8 +450,10 @@ static void Direct3D9DestroyShaders(vout_display_t *vd) vout_display_sys_t *sys = vd->sys; if (sys->d3dx_shader) + { IDirect3DPixelShader9_Release(sys->d3dx_shader); - sys->d3dx_shader = NULL; + sys->d3dx_shader = NULL; + } } /** @@ -845,31 +846,14 @@ static int Direct3D9CreateResources(vout_display_t *vd, const video_format_t *fm static int Direct3D9Reset(vout_display_t *vd, const video_format_t *fmtp) { vout_display_sys_t *sys = vd->sys; - d3d9_device_t *p_d3d9_dev = &sys->d3d9_device->d3ddev; - D3DPRESENT_PARAMETERS d3dpp; - if (D3D9_FillPresentationParameters(sys->d3d9_device, &d3dpp)) - { - msg_Err(vd, "Could not get presentation parameters to reset device"); - return VLC_EGENERIC; - } + int res = D3D9_ResetDevice( VLC_OBJECT(vd), sys->d3d9_device ); + if (res != VLC_SUCCESS) + return res; /* release all D3D objects */ Direct3D9DestroyResources(vd); - /* */ - HRESULT hr; - if (sys->d3d9_device->hd3d.use_ex){ - hr = IDirect3DDevice9Ex_ResetEx(p_d3d9_dev->devex, &d3dpp, NULL); - } else { - hr = IDirect3DDevice9_Reset(p_d3d9_dev->dev, &d3dpp); - } - if (FAILED(hr)) { - msg_Err(vd, "IDirect3DDevice9_Reset failed! (hr=0x%lX)", hr); - return VLC_EGENERIC; - } - p_d3d9_dev->BufferFormat = d3dpp.BackBufferFormat; - /* re-create them */ if (Direct3D9CreateResources(vd, fmtp)) { msg_Dbg(vd, "Direct3D9CreateResources failed !"); _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits