[vlc-commits] Compile D3D11 for WinRT

Jean-Baptiste Kempf git at videolan.org
Wed May 27 12:30:14 CEST 2015


vlc | branch: master | Jean-Baptiste Kempf <jb at videolan.org> | Wed May 27 11:59:38 2015 +0200| [7b00c39992c196032b80a20e2594675d72ec20ef] | committer: Jean-Baptiste Kempf

Compile D3D11 for WinRT

This is based on some work by Martell, and modified by /me
It's not yet perfectly clean, but that will come in the next commits

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=7b00c39992c196032b80a20e2594675d72ec20ef
---

 modules/video_output/Makefile.am      |    8 ++---
 modules/video_output/msw/common.c     |   52 +++++++++++++++++++++++++--------
 modules/video_output/msw/direct3d11.c |   22 +++++++++-----
 3 files changed, 59 insertions(+), 23 deletions(-)

diff --git a/modules/video_output/Makefile.am b/modules/video_output/Makefile.am
index 5aaeafb..2c8f930 100644
--- a/modules/video_output/Makefile.am
+++ b/modules/video_output/Makefile.am
@@ -182,13 +182,13 @@ vout_LTLIBRARIES += $(LTLIBdirect3d9)
 EXTRA_LTLIBRARIES += libdirect3d9_plugin.la
 
 libdirect3d11_plugin_la_SOURCES = video_output/msw/direct3d11.c \
- video_output/msw/common.c video_output/msw/common.h \
- video_output/msw/events.c video_output/msw/events.h \
- video_output/msw/builtin_shaders.h \
- video_output/msw/win32touch.c video_output/msw/win32touch.h
+ video_output/msw/common.c video_output/msw/common.h
 libdirect3d11_plugin_la_CPPFLAGS = $(AM_CPPFLAGS) \
  -DMODULE_NAME_IS_direct3d11
 if !HAVE_WINSTORE
+libdirect3d11_plugin_la_SOURCES += video_output/msw/events.c \
+ video_output/msw/events.h video_output/msw/builtin_shaders.h \
+ video_output/msw/win32touch.c video_output/msw/win32touch.h
 libdirect3d11_plugin_la_LIBADD = -lgdi32 -lole32 -luuid
 else
 libdirect3d11_plugin_la_LIBADD = -ld3dcompiler -lole32 -luuid
diff --git a/modules/video_output/msw/common.c b/modules/video_output/msw/common.c
index 987f260..1e5b5f7 100644
--- a/modules/video_output/msw/common.c
+++ b/modules/video_output/msw/common.c
@@ -42,11 +42,13 @@
 
 #include <vlc_windows_interfaces.h>
 
+#if !VLC_WINSTORE_APP
 static void CommonChangeThumbnailClip(vout_display_t *, bool show);
 static int  CommonControlSetFullscreen(vout_display_t *, bool is_fullscreen);
 
 static void DisableScreensaver(vout_display_t *);
 static void RestoreScreensaver(vout_display_t *);
+#endif
 
 /* */
 int CommonInit(vout_display_t *vd)
@@ -58,10 +60,12 @@ int CommonInit(vout_display_t *vd)
     sys->hparent   = NULL;
     sys->hfswnd    = NULL;
     sys->changes   = 0;
+    sys->is_first_display = true;
+    sys->is_on_top        = false;
+
+#if !VLC_WINSTORE_APP
     SetRectEmpty(&sys->rect_display);
     SetRectEmpty(&sys->rect_parent);
-    sys->is_first_display = true;
-    sys->is_on_top = false;
 
     var_Create(vd, "video-deco", VLC_VAR_BOOL | VLC_VAR_DOINHERIT);
     var_Create(vd, "disable-screensaver", VLC_VAR_BOOL | VLC_VAR_DOINHERIT);
@@ -70,6 +74,7 @@ int CommonInit(vout_display_t *vd)
     sys->event = EventThreadCreate(vd);
     if (!sys->event)
         return VLC_EGENERIC;
+#endif
 
     event_cfg_t cfg;
     memset(&cfg, 0, sizeof(cfg));
@@ -84,6 +89,7 @@ int CommonInit(vout_display_t *vd)
     cfg.width  = vd->cfg->display.width;
     cfg.height = vd->cfg->display.height;
 
+#if !VLC_WINSTORE_APP
     event_hwnd_t hwnd;
     if (EventThreadStart(sys->event, &hwnd, &cfg))
         return VLC_EGENERIC;
@@ -100,15 +106,24 @@ int CommonInit(vout_display_t *vd)
     }
 
     DisableScreensaver (vd);
+#endif
 
     return VLC_SUCCESS;
 }
 
 /* */
+picture_pool_t *CommonPool(vout_display_t *vd, unsigned count)
+{
+    VLC_UNUSED(count);
+    return vd->sys->pool;
+}
+
+
+#if !VLC_WINSTORE_APP
+/* */
 void CommonClean(vout_display_t *vd)
 {
     vout_display_sys_t *sys = vd->sys;
-
     if (sys->event) {
         CommonChangeThumbnailClip(vd, false);
         EventThreadStop(sys->event);
@@ -118,13 +133,6 @@ void CommonClean(vout_display_t *vd)
     RestoreScreensaver(vd);
 }
 
-/* */
-picture_pool_t *CommonPool(vout_display_t *vd, unsigned count)
-{
-    VLC_UNUSED(count);
-    return vd->sys->pool;
-}
-
 void CommonManage(vout_display_t *vd)
 {
     vout_display_sys_t *sys = vd->sys;
@@ -133,7 +141,6 @@ void CommonManage(vout_display_t *vd)
      * messages. But since window can stay blocked into this function for a
      * long time (for example when you move your window on the screen), I
      * decided to isolate PeekMessage in another thread. */
-
     /* If we do not control our window, we check for geometry changes
      * ourselves because the parent might not send us its events. */
     if (sys->hparent) {
@@ -179,7 +186,6 @@ void CommonManage(vout_display_t *vd)
 void CommonDisplay(vout_display_t *vd)
 {
     vout_display_sys_t *sys = vd->sys;
-
     if (!sys->is_first_display)
         return;
 
@@ -195,6 +201,7 @@ void CommonDisplay(vout_display_t *vd)
                  SWP_NOZORDER);
     sys->is_first_display = false;
 }
+#endif
 
 /**
  * It updates a picture data/pitches.
@@ -272,6 +279,7 @@ void AlignRect(RECT *r, int align_boundary, int align_size)
         r->right = ((r->right - r->left + align_size/2) & ~align_size) + r->left;
 }
 
+#if !VLC_WINSTORE_APP
 /* */
 static void CommonChangeThumbnailClip(vout_display_t *vd, bool show)
 {
@@ -710,3 +718,23 @@ static void RestoreScreensaver(vout_display_t *vd)
                              sys->i_spi_screensaveactive, NULL, 0);
     }
 }
+
+#else
+
+int CommonControl(vout_display_t *vd, int query, va_list args)
+{
+    switch (query) {
+    default:
+        return VLC_EGENERIC;
+    }
+}
+
+void CommonManage(vout_display_t *vd) {};
+void CommonClean(vout_display_t *vd) {};
+void CommonDisplay(vout_display_t *vd) {};
+void UpdateRects(vout_display_t *vd,
+                  const vout_display_cfg_t *cfg,
+                  const video_format_t *source,
+                  bool is_forced)
+{};
+#endif
diff --git a/modules/video_output/msw/direct3d11.c b/modules/video_output/msw/direct3d11.c
index 280d710..48e5f03 100644
--- a/modules/video_output/msw/direct3d11.c
+++ b/modules/video_output/msw/direct3d11.c
@@ -44,7 +44,6 @@
 # define D3D11CreateDevice(args...)             sys->OurD3D11CreateDevice(args)
 # define D3DCompile(args...)                    sys->OurD3DCompile(args)
 #else
-# define IDXGISwapChain_Present(args...)        IDXGISwapChain_Present1(args)
 # define IDXGIFactory_CreateSwapChain(a,b,c,d)  IDXGIFactory2_CreateSwapChainForComposition(a,b,c,NULL,d)
 # define DXGI_SWAP_CHAIN_DESC                   DXGI_SWAP_CHAIN_DESC1
 #endif
@@ -598,8 +597,10 @@ static void Prepare(vout_display_t *vd, picture_t *picture, subpicture_t *subpic
     vout_display_sys_t *sys = vd->sys;
     VLC_UNUSED(picture);
 
-    /* float ClearColor[4] = { 1.0f, 0.125f, 0.3f, 1.0f }; */
-    /* ID3D11DeviceContext_ClearRenderTargetView(sys->d3dcontext,sys->d3drenderTargetView, ClearColor); */
+#if VLC_WINSTORE_APP /* TODO: Choose the WinRT app background clear color */
+    float ClearColor[4] = { 1.0f, 0.125f, 0.3f, 1.0f };
+    ID3D11DeviceContext_ClearRenderTargetView(sys->d3dcontext,sys->d3drenderTargetView, ClearColor);
+#endif
     ID3D11DeviceContext_ClearDepthStencilView(sys->d3dcontext,sys->d3ddepthStencilView, D3D11_CLEAR_DEPTH, 1.0f, 0);
 
     if (subpicture) {
@@ -655,9 +656,7 @@ static void Display(vout_display_t *vd, picture_t *picture, subpicture_t *subpic
 
 static void Direct3D11Destroy(vout_display_t *vd)
 {
-
 #if !VLC_WINSTORE_APP
-
     vout_display_sys_t *sys = vd->sys;
 
 # if USE_DXGI
@@ -679,9 +678,7 @@ static void Direct3D11Destroy(vout_display_t *vd)
     sys->hd3d11_dll = NULL;
     sys->hd3dcompiler_dll = NULL;
 #else
-
     VLC_UNUSED(vd);
-
 #endif
 }
 
@@ -965,7 +962,9 @@ static int Direct3D11Open(vout_display_t *vd, video_format_t *fmt)
         return VLC_EGENERIC;
     }
 
+#if !VLC_WINSTORE_APP
     EventThreadUpdateTitle(sys->event, VOUT_TITLE " (Direct3D11 output)");
+#endif
 
     msg_Dbg(vd, "Direct3D11 device adapter successfully initialized");
     return VLC_SUCCESS;
@@ -976,12 +975,21 @@ static void Direct3D11Close(vout_display_t *vd)
     vout_display_sys_t *sys = vd->sys;
 
     Direct3D11DestroyResources(vd);
+#if !VLC_WINSTORE_APP
     if (sys->dxgiswapChain)
         IDXGISwapChain_Release(sys->dxgiswapChain);
     if ( sys->d3dcontext )
         ID3D11DeviceContext_Release(sys->d3dcontext);
     if ( sys->d3ddevice )
         ID3D11Device_Release(sys->d3ddevice);
+#else
+    if ( sys->d3dcontext )
+        ID3D11DeviceContext_Flush(sys->d3dcontext);
+
+    sys->d3dcontext = NULL;
+    sys->d3ddevice = NULL;
+    sys->dxgiswapChain = NULL;
+#endif
     msg_Dbg(vd, "Direct3D11 device adapter closed");
 }
 



More information about the vlc-commits mailing list