[vlc-devel] [PATCH 3/3] direct3d11: use DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL to avoid buffer copies

Steve Lhomme robux4 at videolabs.io
Thu Mar 3 11:22:06 CET 2016


this will restrict the D3D11 vout to Windows 7 SP1 and Windows 8+
---
 modules/video_output/msw/common.h     | 12 +++---------
 modules/video_output/msw/direct3d11.c | 35 +++++++++++++++++++++--------------
 2 files changed, 24 insertions(+), 23 deletions(-)

diff --git a/modules/video_output/msw/common.h b/modules/video_output/msw/common.h
index 0edf3c5..fee7774 100644
--- a/modules/video_output/msw/common.h
+++ b/modules/video_output/msw/common.h
@@ -28,11 +28,7 @@
 #endif
 #ifdef MODULE_NAME_IS_direct3d11
 # include <d3d11.h>
-# if VLC_WINSTORE_APP
-#  include <dxgi1_2.h>
-# else
-#  include <dxgi.h>
-#endif
+# include <dxgi1_2.h>
 # include <d3dcompiler.h>
 #endif
 #ifdef MODULE_NAME_IS_direct3d9
@@ -174,15 +170,13 @@ struct vout_display_sys_t
     HINSTANCE                hdxgi_dll;        /* handle of the opened dxgi dll */
     HINSTANCE                hd3d11_dll;       /* handle of the opened d3d11 dll */
     HINSTANCE                hd3dcompiler_dll; /* handle of the opened d3dcompiler dll */
-    IDXGIFactory             *dxgifactory;     /* DXGI factory */
-    IDXGISwapChain           *dxgiswapChain;   /* DXGI 1.0 swap chain */
+    IDXGIFactory2            *dxgifactory;     /* DXGI 1.2 factory */
     /* We should find a better way to store this or atleast a shorter name */
     PFN_D3D11_CREATE_DEVICE_AND_SWAP_CHAIN OurD3D11CreateDeviceAndSwapChain;
     PFN_D3D11_CREATE_DEVICE                OurD3D11CreateDevice;
     pD3DCompile                            OurD3DCompile;
-#else
-    IDXGISwapChain1          *dxgiswapChain;   /* DXGI 1.1 swap chain */
 #endif
+    IDXGISwapChain1          *dxgiswapChain;   /* DXGI 1.1 swap chain */
     ID3D11Device             *d3ddevice;       /* D3D device */
     ID3D11DeviceContext      *d3dcontext;      /* D3D context */
     d3d_quad_t               picQuad;
diff --git a/modules/video_output/msw/direct3d11.c b/modules/video_output/msw/direct3d11.c
index 27f2e29..e5b2b62 100644
--- a/modules/video_output/msw/direct3d11.c
+++ b/modules/video_output/msw/direct3d11.c
@@ -413,8 +413,13 @@ static int Open(vlc_object_t *object)
         return VLC_EGENERIC;
     }
 
+    UINT i_factory_flags = 0;
+#ifndef NDEBUG
+    i_factory_flags |= DXGI_CREATE_FACTORY_DEBUG;
+#endif
+
     /* TODO : detect the directx version supported and use IID_IDXGIFactory3 or 2 */
-    HRESULT hr = OurCreateDXGIFactory(&IID_IDXGIFactory, (void **)&sys->dxgifactory);
+    HRESULT hr = OurCreateDXGIFactory(&IID_IDXGIFactory2, (void **)&sys->dxgifactory);
     if (FAILED(hr)) {
         msg_Err(vd, "Could not create dxgi factory. (hr=0x%lX)", hr);
         Direct3D11Destroy(vd);
@@ -801,7 +806,9 @@ static void Display(vout_display_t *vd, picture_t *picture, subpicture_t *subpic
         }
     }
 
-    HRESULT hr = IDXGISwapChain_Present(sys->dxgiswapChain, 0, 0);
+    DXGI_PRESENT_PARAMETERS presentParams;
+    memset(&presentParams, 0, sizeof(presentParams));
+    HRESULT hr = IDXGISwapChain1_Present1(sys->dxgiswapChain, 0, 0, &presentParams);
     if (hr == DXGI_ERROR_DEVICE_REMOVED || hr == DXGI_ERROR_DEVICE_RESET)
     {
         /* TODO device lost */
@@ -872,18 +879,17 @@ static int Direct3D11Open(vout_display_t *vd, video_format_t *fmt)
     creationFlags |= D3D11_CREATE_DEVICE_DEBUG;
 # endif
 
-    DXGI_SWAP_CHAIN_DESC scd;
+    DXGI_SWAP_CHAIN_DESC1 scd;
     memset(&scd, 0, sizeof(scd));
-    scd.BufferCount = 1;
+    scd.BufferCount = 2;
     scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
     scd.SampleDesc.Count = 1;
     scd.SampleDesc.Quality = 0;
-    scd.BufferDesc.Width = fmt->i_visible_width;
-    scd.BufferDesc.Height = fmt->i_visible_height;
-    scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
-
-    scd.Windowed = TRUE;
-    scd.OutputWindow = sys->hvideownd;
+    scd.Width = fmt->i_visible_width;
+    scd.Height = fmt->i_visible_height;
+    scd.Format = DXGI_FORMAT_R8G8B8A8_UNORM; /* TODO: use DXGI_FORMAT_NV12 */
+    //scd.Flags = 512; // DXGI_SWAP_CHAIN_FLAG_YUV_VIDEO;
+    scd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
 
     IDXGIAdapter *dxgiadapter;
     static const D3D_FEATURE_LEVEL featureLevels[] =
@@ -899,7 +905,7 @@ static int Direct3D11Open(vout_display_t *vd, video_format_t *fmt)
 
 # if USE_DXGI
     /* TODO : list adapters for the user to choose from */
-    hr = IDXGIFactory_EnumAdapters(sys->dxgifactory, 0, &dxgiadapter);
+    hr = IDXGIFactory2_EnumAdapters(sys->dxgifactory, 0, &dxgiadapter);
     if (FAILED(hr)) {
        msg_Err(vd, "Could not create find factory. (hr=0x%lX)", hr);
        return VLC_EGENERIC;
@@ -985,15 +991,16 @@ static int Direct3D11Open(vout_display_t *vd, video_format_t *fmt)
        return VLC_EGENERIC;
     }
 
-    hr = IDXGIAdapter_GetParent(dxgiadapter, &IID_IDXGIFactory, (void **)&sys->dxgifactory);
+    hr = IDXGIAdapter_GetParent(dxgiadapter, &IID_IDXGIFactory2, (void **)&sys->dxgifactory);
     IDXGIAdapter_Release(dxgiadapter);
     if (FAILED(hr)) {
        msg_Err(vd, "Could not get the DXGI Factory. (hr=0x%lX)", hr);
        return VLC_EGENERIC;
     }
 
-    hr = IDXGIFactory_CreateSwapChain(sys->dxgifactory, (IUnknown *)sys->d3ddevice, &scd, &sys->dxgiswapChain);
-    IDXGIFactory_Release(sys->dxgifactory);
+    hr = IDXGIFactory2_CreateSwapChainForHwnd(sys->dxgifactory, (IUnknown *)sys->d3ddevice,
+                                              sys->hvideownd, &scd, NULL, NULL, &sys->dxgiswapChain);
+    IDXGIFactory2_Release(sys->dxgifactory);
     if (FAILED(hr)) {
        msg_Err(vd, "Could not create the SwapChain. (hr=0x%lX)", hr);
        return VLC_EGENERIC;
-- 
2.7.2.windows.1



More information about the vlc-devel mailing list