[vlc-devel] [PATCH] [RFC] direct3d9: no need to reopen the device when going in wallpaper mode

Steve Lhomme robux4 at ycbcr.xyz
Wed Jan 16 16:47:58 CET 2019


The resizing of the window seems to be enough for the swapchain to be updated
with the proper dimensions (and we use these dimensions to position the
rendered picture).

has_pictures_invalid is still needed when we receive D3DERR_DEVICENOTRESET.

TODO: use_desktop is still used by common.c

Fixes #21733
---
 modules/video_output/win32/direct3d9.c | 142 -------------------------
 1 file changed, 142 deletions(-)

diff --git a/modules/video_output/win32/direct3d9.c b/modules/video_output/win32/direct3d9.c
index 31a6a40b73..7d3e251c35 100644
--- a/modules/video_output/win32/direct3d9.c
+++ b/modules/video_output/win32/direct3d9.c
@@ -135,11 +135,6 @@ struct vout_display_sys_t
     vout_display_sys_win32_t sys;
 
     bool allow_hw_yuv;    /* Should we use hardware YUV->RGB conversions */
-    struct {
-        bool is_fullscreen;
-        bool is_on_top;
-        RECT win;
-    } desktop_save;
     vout_display_cfg_t cfg_saved; /* configuration used before going into desktop mode */
 
     // core objects
@@ -162,11 +157,6 @@ struct vout_display_sys_t
     bool                    lost_not_ready;
     bool                    clear_scene;
 
-    /* It protects the following variables */
-    vlc_mutex_t    lock;
-    bool           ch_desktop;
-    bool           desktop_requested;
-
     /* outside rendering */
     void *outside_opaque;
     void (*swapCb)(void* opaque);
@@ -911,18 +901,6 @@ static void Manage (vout_display_t *vd)
 
     CommonManage(vd);
 
-    /* Desktop mode change */
-    vlc_mutex_lock(&sys->lock);
-    const bool ch_desktop = sys->ch_desktop;
-    sys->ch_desktop = false;
-    vlc_mutex_unlock(&sys->lock);
-
-    if (ch_desktop) {
-        sys->reopen_device = true;
-        if (vd->info.has_pictures_invalid)
-            vout_display_SendEventPicturesInvalid(vd);
-    }
-
     /* Position Change */
     if (sys->sys.changes & DX_POSITION_CHANGE) {
 #if 0 /* need that when bicubic filter is available */
@@ -1514,81 +1492,6 @@ static void Direct3D9Close(vout_display_t *vd)
     D3D9_ReleaseDevice(&sys->d3d_dev);
 }
 
-static int ControlReopenDevice(vout_display_t *vd, video_format_t *fmtp)
-{
-    vout_display_sys_t *sys = vd->sys;
-
-    if (!sys->sys.use_desktop) {
-        /* Save non-desktop state */
-        sys->desktop_save.is_fullscreen = sys->sys.vdcfg.is_fullscreen;
-        sys->desktop_save.is_on_top     = sys->sys.is_on_top;
-
-        WINDOWPLACEMENT wp = { .length = sizeof(wp), };
-        GetWindowPlacement(sys->sys.hparent ? sys->sys.hparent : sys->sys.hwnd, &wp);
-        sys->desktop_save.win = wp.rcNormalPosition;
-    }
-
-    /* */
-    Direct3D9Close(vd);
-    if (!sys->sys.b_windowless)
-        EventThreadStop(sys->sys.event);
-
-    /* */
-    vlc_mutex_lock(&sys->lock);
-    sys->sys.use_desktop = sys->desktop_requested;
-    sys->ch_desktop = false;
-    vlc_mutex_unlock(&sys->lock);
-
-    /* */
-    event_cfg_t cfg;
-    memset(&cfg, 0, sizeof(cfg));
-    cfg.use_desktop = sys->sys.use_desktop;
-    if (!sys->sys.use_desktop) {
-        cfg.x      = sys->desktop_save.win.left;
-        cfg.y      = sys->desktop_save.win.top;
-        cfg.width  = sys->desktop_save.win.right  - sys->desktop_save.win.left;
-        cfg.height = sys->desktop_save.win.bottom - sys->desktop_save.win.top;
-    }
-
-    event_hwnd_t hwnd;
-    if (!sys->sys.b_windowless && EventThreadStart(sys->sys.event, &hwnd, &cfg)) {
-        msg_Err(vd, "Failed to restart event thread");
-        return VLC_EGENERIC;
-    }
-    sys->sys.parent_window = hwnd.parent_window;
-    sys->sys.hparent       = hwnd.hparent;
-    sys->sys.hwnd          = hwnd.hwnd;
-    sys->sys.hvideownd     = hwnd.hvideownd;
-    sys->sys.hfswnd        = hwnd.hfswnd;
-    SetRectEmpty(&sys->sys.rect_parent);
-
-    /* */
-    video_format_t fmt;
-    IDirect3DDevice9 *d3d9_device = var_InheritAddress(vd, "vout-engine-ctx");
-    if (Direct3D9Open(vd, &fmt, d3d9_device)) {
-        CommonClean(vd);
-        msg_Err(vd, "Failed to reopen device");
-        return VLC_EGENERIC;
-    }
-    *fmtp = fmt;
-    sys->sys.is_first_display = true;
-
-    if (sys->sys.use_desktop) {
-        /* Disable fullscreen/on_top while using desktop */
-        if (sys->desktop_save.is_fullscreen)
-            vout_display_SendEventFullscreen(vd, false);
-        if (sys->desktop_save.is_on_top)
-            vout_display_SendWindowState(vd, VOUT_WINDOW_STATE_NORMAL);
-    } else {
-        /* Restore fullscreen/on_top */
-        if (sys->desktop_save.is_fullscreen)
-            vout_display_SendEventFullscreen(vd, true);
-        if (sys->desktop_save.is_on_top)
-            vout_display_SendWindowState(vd, VOUT_WINDOW_STATE_ABOVE);
-    }
-    return VLC_SUCCESS;
-}
-
 static int Control(vout_display_t *vd, int query, va_list args)
 {
     vout_display_sys_t *sys = vd->sys;
@@ -1605,12 +1508,6 @@ static int Control(vout_display_t *vd, int query, va_list args)
                 return VLC_EGENERIC;
             }
             sys->reset_device = false;
-        } else if(sys->reopen_device) {
-            if (ControlReopenDevice(vd, fmt)) {
-                msg_Err(vd, "Failed to reopen device");
-                return VLC_EGENERIC;
-            }
-            sys->reopen_device = false;
         }
         (void) cfg;
         return VLC_SUCCESS;
@@ -1620,27 +1517,6 @@ static int Control(vout_display_t *vd, int query, va_list args)
     }
 }
 
-/*****************************************************************************
- * DesktopCallback: desktop mode variable callback
- *****************************************************************************/
-static int DesktopCallback(vlc_object_t *object, char const *psz_cmd,
-                            vlc_value_t oldval, vlc_value_t newval,
-                            void *p_data)
-{
-    vout_display_t *vd = (vout_display_t *)object;
-    vout_display_sys_t *sys = vd->sys;
-    VLC_UNUSED(psz_cmd);
-    VLC_UNUSED(oldval);
-    VLC_UNUSED(p_data);
-
-    vlc_mutex_lock(&sys->lock);
-    const bool ch_desktop = !sys->desktop_requested != !newval.b_bool;
-    sys->ch_desktop |= ch_desktop;
-    sys->desktop_requested = newval.b_bool;
-    vlc_mutex_unlock(&sys->lock);
-    return VLC_SUCCESS;
-}
-
 typedef struct
 {
     char **values;
@@ -1738,15 +1614,8 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
 
     sys->sys.use_desktop = var_CreateGetBool(vd, "video-wallpaper");
     sys->reset_device = false;
-    sys->reopen_device = false;
     sys->lost_not_ready = false;
     sys->allow_hw_yuv = var_CreateGetBool(vd, "directx-hw-yuv");
-    sys->desktop_save.is_fullscreen = cfg->is_fullscreen;
-    sys->desktop_save.is_on_top     = false;
-    sys->desktop_save.win.left      = var_InheritInteger(vd, "video-x");
-    sys->desktop_save.win.right     = cfg->display.width;
-    sys->desktop_save.win.top       = var_InheritInteger(vd, "video-y");
-    sys->desktop_save.win.bottom    = cfg->display.height;
 
     if (CommonInit(vd, d3d9_device != NULL, cfg))
         goto error;
@@ -1774,14 +1643,6 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
     else
         vd->info.subpicture_chromas = NULL;
 
-    /* Interaction */
-    vlc_mutex_init(&sys->lock);
-    sys->ch_desktop = false;
-    sys->desktop_requested = sys->sys.use_desktop;
-
-    var_Change(vd, "video-wallpaper", VLC_VAR_SETTEXT, _("Desktop"));
-    var_AddCallback(vd, "video-wallpaper", DesktopCallback, NULL);
-
     video_format_Clean(fmtp);
     video_format_Copy(fmtp, &fmt);
 
@@ -1808,9 +1669,6 @@ error:
  */
 static void Close(vout_display_t *vd)
 {
-    var_DelCallback(vd, "video-wallpaper", DesktopCallback, NULL);
-    vlc_mutex_destroy(&vd->sys->lock);
-
     Direct3D9Close(vd);
 
     CommonClean(vd);
-- 
2.17.1



More information about the vlc-devel mailing list