diff --git a/lib/media_player.c b/lib/media_player.c
index 240ee7b55d64073b61b0593d628cc5bb5068c7be..6d7ba5bf07af693bfeb5fd5d18c34b7748f4e8b4 100644
--- a/lib/media_player.c
+++ b/lib/media_player.c
@@ -1128,7 +1128,7 @@ bool libvlc_video_set_output_callbacks(libvlc_media_player_t *mp,
     }
     else if ( engine == libvlc_video_engine_d3d11 )
     {
-        var_SetString ( mp, "vout", "direct3d11" );
+        var_SetString ( mp, "vout", "d3d11drawable" );
         var_SetString ( mp, "dec-dev", "d3d11" );
     }
     else if ( engine == libvlc_video_engine_d3d9 )
diff --git a/modules/video_output/win32/direct3d11.cpp b/modules/video_output/win32/direct3d11.cpp
index 9791e00e4881c809eaee26218784d424d0b2337f..18e7a5323b1d0ccea6a90a848ab3193d7436074e 100644
--- a/modules/video_output/win32/direct3d11.cpp
+++ b/modules/video_output/win32/direct3d11.cpp
@@ -58,7 +58,9 @@
 
 using Microsoft::WRL::ComPtr;
 
-static int  Open(vout_display_t *,
+static int  OpenDisplay(vout_display_t *,
+                 video_format_t *, vlc_video_context *);
+static int  OpenDrawable(vout_display_t *,
                  video_format_t *, vlc_video_context *);
 static void Close(vout_display_t *);
 
@@ -98,7 +100,12 @@ vlc_module_begin ()
         change_string_list(ppsz_hdr_mode, ppsz_hdr_mode_text)
 
     add_shortcut("direct3d11")
-    set_callback_display(Open, 300)
+    set_callback_display(OpenDisplay, 300)
+
+    add_submodule()
+        set_callback_display(OpenDrawable, 0)
+        add_shortcut("d3d11drawable")
+
 vlc_module_end ()
 
 enum d3d11_upscale
@@ -529,13 +536,9 @@ static const auto ops = []{
     return ops;
 }();
 
-static int Open(vout_display_t *vd,
+static int OpenGeneric(vout_display_t *vd,
                 video_format_t *fmtp, vlc_video_context *context)
 {
-    if (vd->cfg->window->type != VLC_WINDOW_TYPE_HWND &&
-        vd->cfg->window->type != VLC_WINDOW_TYPE_DCOMP)
-        return VLC_ENOTSUP;
-
     vout_display_sys_t *sys = new (std::nothrow) vout_display_sys_t();
     if (!sys)
         return VLC_ENOMEM;
@@ -639,6 +642,27 @@ error:
     return VLC_EGENERIC;
 }
 
+static int OpenDisplay(vout_display_t *vd,
+                       video_format_t *fmtp, vlc_video_context *context)
+{
+    if (vd->cfg->window->type != VLC_WINDOW_TYPE_HWND &&
+        vd->cfg->window->type != VLC_WINDOW_TYPE_DCOMP)
+        return VLC_ENOTSUP;
+
+    return OpenGeneric(vd, fmtp, context);
+}
+
+static int OpenDrawable(vout_display_t *vd,
+                        video_format_t *fmtp, vlc_video_context *context)
+{
+    if (vd->cfg->window->type != VLC_WINDOW_TYPE_DUMMY)
+        return VLC_ENOTSUP;
+
+    /* TODO: other checks for callback validity should be there. */
+
+    return OpenGeneric(vd, fmtp, context);
+}
+
 static void Close(vout_display_t *vd)
 {
     vout_display_sys_t *sys = static_cast<vout_display_sys_t *>(vd->sys);