From 4c2779a496a3b3b12ff2b7832b527390fcc57dae Mon Sep 17 00:00:00 2001 From: Steve Lhomme <robux4@ycbcr.xyz> Date: Thu, 15 Nov 2018 12:04:47 +0100 Subject: [PATCH] vout: win32: don't run the HWND thread in windowless mode --- modules/video_output/win32/common.c | 56 ++++++++++++++++++------- modules/video_output/win32/direct3d11.c | 6 ++- modules/video_output/win32/direct3d9.c | 8 ++-- modules/video_output/win32/directdraw.c | 23 +++++----- modules/video_output/win32/glwin32.c | 3 +- modules/video_output/win32/wingdi.c | 3 +- 6 files changed, 69 insertions(+), 30 deletions(-) diff --git a/modules/video_output/win32/common.c b/modules/video_output/win32/common.c index d2ff2150bbde..b24428de0983 100644 --- a/modules/video_output/win32/common.c +++ b/modules/video_output/win32/common.c @@ -52,6 +52,8 @@ static int CommonControlSetFullscreen(vout_display_t *, bool is_fullscreen); static bool GetRect(const vout_display_sys_t *sys, RECT *out) { + if (sys->b_windowless) + return false; return GetClientRect(sys->hwnd, out); } #endif @@ -91,9 +93,13 @@ int CommonInit(vout_display_t *vd, bool b_windowless) SetRectEmpty(&sys->rect_display); SetRectEmpty(&sys->rect_parent); - var_Create(vd, "video-deco", VLC_VAR_BOOL | VLC_VAR_DOINHERIT); var_Create(vd, "disable-screensaver", VLC_VAR_BOOL | VLC_VAR_DOINHERIT); + if (b_windowless) + return VLC_SUCCESS; + + var_Create(vd, "video-deco", VLC_VAR_BOOL | VLC_VAR_DOINHERIT); + /* */ sys->event = EventThreadCreate(vd); if (!sys->event) @@ -151,21 +157,30 @@ void UpdateRects(vout_display_t *vd, #define rect_dest_clipped sys->rect_dest_clipped RECT rect; - POINT point; + POINT point = { 0 }; /* */ if (!cfg) cfg = vd->cfg; /* Retrieve the window size */ - if (!sys->pf_GetRect(sys, &rect)) - return; + if (sys->b_windowless) + { + rect.left = 0; + rect.top = 0; + rect.right = vd->source.i_visible_width; + rect.bottom = vd->source.i_visible_height; + } + else + { + if (!sys->pf_GetRect(sys, &rect)) + return; - /* Retrieve the window position */ - point.x = point.y = 0; #if !VLC_WINSTORE_APP - ClientToScreen(sys->hwnd, &point); + /* Retrieve the window position */ + ClientToScreen(sys->hwnd, &point); #endif + } /* If nothing changed, we can return */ bool has_moved; @@ -180,6 +195,11 @@ void UpdateRects(vout_display_t *vd, vout_display_SendEventDisplaySize(vd, rect.right, rect.bottom); #endif #else + if (sys->b_windowless) + { + has_moved = is_resized = false; + } + else EventThreadUpdateWindowPosition(sys->event, &has_moved, &is_resized, point.x, point.y, rect.right, rect.bottom); @@ -204,12 +224,15 @@ void UpdateRects(vout_display_t *vd, vout_display_PlacePicture(&place, source, &place_cfg, false); #if !VLC_WINSTORE_APP - EventThreadUpdateSourceAndPlace(sys->event, source, &place); - - if (sys->hvideownd) - SetWindowPos(sys->hvideownd, 0, - place.x, place.y, place.width, place.height, - SWP_NOCOPYBITS | SWP_NOZORDER | SWP_ASYNCWINDOWPOS); + if (!sys->b_windowless) + { + EventThreadUpdateSourceAndPlace(sys->event, source, &place); + + if (sys->hvideownd) + SetWindowPos(sys->hvideownd, 0, + place.x, place.y, place.width, place.height, + SWP_NOCOPYBITS | SWP_NOZORDER | SWP_ASYNCWINDOWPOS); + } #endif /* Destination image position and dimensions */ @@ -353,6 +376,8 @@ void CommonClean(vout_display_t *vd) void CommonManage(vout_display_t *vd) { vout_display_sys_t *sys = vd->sys; + if (sys->b_windowless) + return; /* We used to call the Win32 PeekMessage function here to read the window * messages. But since window can stay blocked into this function for a @@ -514,6 +539,9 @@ static int CommonControlSetFullscreen(vout_display_t *vd, bool is_fullscreen) if (sys->parent_window) return VLC_EGENERIC; + if(sys->b_windowless) + return VLC_SUCCESS; + /* */ HWND hwnd = sys->hparent && sys->hfswnd ? sys->hfswnd : sys->hwnd; @@ -629,7 +657,7 @@ int CommonControl(vout_display_t *vd, int query, va_list args) .bottom = cfg->display.height, }; - if (!cfg->is_fullscreen) { + if (!cfg->is_fullscreen && !sys->b_windowless) { AdjustWindowRect(&rect_window, EventThreadGetWindowStyle(sys->event), 0); SetWindowPos(sys->hwnd, 0, 0, 0, rect_window.right - rect_window.left, diff --git a/modules/video_output/win32/direct3d11.c b/modules/video_output/win32/direct3d11.c index 311b921e19c5..5b1ed23eb9e8 100644 --- a/modules/video_output/win32/direct3d11.c +++ b/modules/video_output/win32/direct3d11.c @@ -291,7 +291,8 @@ static int Open(vlc_object_t *object) } #if !VLC_WINSTORE_APP - EventThreadUpdateTitle(vd->sys->sys.event, VOUT_TITLE " (Direct3D11 output)"); + if (!vd->sys->sys.b_windowless) + EventThreadUpdateTitle(vd->sys->sys.event, VOUT_TITLE " (Direct3D11 output)"); #endif msg_Dbg(vd, "Direct3D11 device adapter successfully initialized"); @@ -1240,6 +1241,9 @@ static int Direct3D11Open(vout_display_t *vd) FillSwapChainDesc(vd, &scd); + if (sys->sys.hvideownd == 0) + return VLC_EGENERIC; + hr = IDXGIFactory2_CreateSwapChainForHwnd(dxgifactory, (IUnknown *)sys->d3d_dev.d3ddevice, sys->sys.hvideownd, &scd, NULL, NULL, &sys->dxgiswapChain); if (hr == DXGI_ERROR_INVALID_CALL && scd.Format == DXGI_FORMAT_R10G10B10A2_UNORM) diff --git a/modules/video_output/win32/direct3d9.c b/modules/video_output/win32/direct3d9.c index eb3b6120b457..19cd570f846b 100644 --- a/modules/video_output/win32/direct3d9.c +++ b/modules/video_output/win32/direct3d9.c @@ -625,7 +625,8 @@ static int ControlReopenDevice(vout_display_t *vd) /* */ Direct3D9Close(vd); - EventThreadStop(sys->sys.event); + if (!sys->sys.b_windowless) + EventThreadStop(sys->sys.event); /* */ vlc_mutex_lock(&sys->lock); @@ -645,7 +646,7 @@ static int ControlReopenDevice(vout_display_t *vd) } event_hwnd_t hwnd; - if (EventThreadStart(sys->sys.event, &hwnd, &cfg)) { + if (!sys->sys.b_windowless && EventThreadStart(sys->sys.event, &hwnd, &cfg)) { msg_Err(vd, "Failed to restart event thread"); return VLC_EGENERIC; } @@ -812,7 +813,8 @@ static int Direct3D9Open(vout_display_t *vd, video_format_t *fmt) } /* Change the window title bar text */ - EventThreadUpdateTitle(sys->sys.event, VOUT_TITLE " (Direct3D9 output)"); + if (!vd->sys->sys.b_windowless) + EventThreadUpdateTitle(sys->sys.event, VOUT_TITLE " (Direct3D9 output)"); msg_Dbg(vd, "Direct3D9 device adapter successfully initialized"); return VLC_SUCCESS; diff --git a/modules/video_output/win32/directdraw.c b/modules/video_output/win32/directdraw.c index d28f1c275cba..0b29e9da7999 100644 --- a/modules/video_output/win32/directdraw.c +++ b/modules/video_output/win32/directdraw.c @@ -438,17 +438,20 @@ static int DirectXOpen(vout_display_t *vd, video_format_t *fmt) /* */ if (sys->sys.use_overlay) DirectXUpdateOverlay(vd, NULL); - EventThreadUseOverlay(sys->sys.event, sys->sys.use_overlay); + if (!sys->sys.b_windowless) + { + EventThreadUseOverlay(sys->sys.event, sys->sys.use_overlay); - /* Change the window title bar text */ - const char *fallback; - if (sys->sys.use_overlay) - fallback = VOUT_TITLE " (hardware YUV overlay DirectX output)"; - else if (vlc_fourcc_IsYUV(fmt->i_chroma)) - fallback = VOUT_TITLE " (hardware YUV DirectX output)"; - else - fallback = VOUT_TITLE " (software RGB DirectX output)"; - EventThreadUpdateTitle(sys->sys.event, fallback); + /* Change the window title bar text */ + const char *fallback; + if (sys->sys.use_overlay) + fallback = VOUT_TITLE " (hardware YUV overlay DirectX output)"; + else if (vlc_fourcc_IsYUV(fmt->i_chroma)) + fallback = VOUT_TITLE " (hardware YUV DirectX output)"; + else + fallback = VOUT_TITLE " (software RGB DirectX output)"; + EventThreadUpdateTitle(sys->sys.event, fallback); + } return VLC_SUCCESS; } diff --git a/modules/video_output/win32/glwin32.c b/modules/video_output/win32/glwin32.c index a22afec66044..212901622f1a 100644 --- a/modules/video_output/win32/glwin32.c +++ b/modules/video_output/win32/glwin32.c @@ -127,7 +127,8 @@ static int Open(vlc_object_t *object) if (CommonInit(vd, false)) goto error; - EventThreadUpdateTitle(sys->sys.event, VOUT_TITLE " (OpenGL output)"); + if (!sys->sys.b_windowless) + EventThreadUpdateTitle(sys->sys.event, VOUT_TITLE " (OpenGL output)"); vout_window_t *surface = EmbedVideoWindow_Create(vd); if (!surface) diff --git a/modules/video_output/win32/wingdi.c b/modules/video_output/win32/wingdi.c index 6014a9ff0db0..c6fde3641aba 100644 --- a/modules/video_output/win32/wingdi.c +++ b/modules/video_output/win32/wingdi.c @@ -290,7 +290,8 @@ static int Init(vout_display_t *vd, video_format_t *fmt) SelectObject(sys->off_dc, sys->off_bitmap); ReleaseDC(sys->sys.hvideownd, window_dc); - EventThreadUpdateTitle(sys->sys.event, VOUT_TITLE " (WinGDI output)"); + if (!sys->sys.b_windowless) + EventThreadUpdateTitle(sys->sys.event, VOUT_TITLE " (WinGDI output)"); /* */ picture_resource_t rsc; -- GitLab