[vlc-devel] [PATCH 03/14] d3d11_fmt: introduce d3d11_handle_t to keep a handle on the DLL

Steve Lhomme robux4 at videolabs.io
Sat Nov 18 14:29:17 CET 2017


---
 modules/codec/avcodec/d3d11va.c         |  3 ++-
 modules/video_chroma/d3d11_fmt.c        |  4 ++--
 modules/video_chroma/d3d11_fmt.h        |  9 ++++++++-
 modules/video_output/win32/direct3d11.c | 16 ++++++++--------
 4 files changed, 20 insertions(+), 12 deletions(-)

diff --git a/modules/codec/avcodec/d3d11va.c b/modules/codec/avcodec/d3d11va.c
index 17d6a2040c..3c8ee18a3a 100644
--- a/modules/codec/avcodec/d3d11va.c
+++ b/modules/codec/avcodec/d3d11va.c
@@ -428,7 +428,8 @@ static int D3dCreateDevice(vlc_va_t *va)
 
     /* */
     d3d11_device_t d3d_dev;
-    hr = D3D11_CreateDevice(VLC_OBJECT(va), dx_sys->hdecoder_dll, true, &d3d_dev);
+    d3d11_handle_t hd3d = { .hdll = dx_sys->hdecoder_dll };
+    hr = D3D11_CreateDevice(va, &hd3d, true, &d3d_dev);
     if (FAILED(hr)) {
         msg_Err(va, "D3D11CreateDevice failed. (hr=0x%lX)", hr);
         return VLC_EGENERIC;
diff --git a/modules/video_chroma/d3d11_fmt.c b/modules/video_chroma/d3d11_fmt.c
index c5135c0984..695a47dd2b 100644
--- a/modules/video_chroma/d3d11_fmt.c
+++ b/modules/video_chroma/d3d11_fmt.c
@@ -130,14 +130,14 @@ int AllocateShaderView(vlc_object_t *obj, ID3D11Device *d3ddevice,
     return VLC_SUCCESS;
 }
 
-HRESULT D3D11_CreateDevice(vlc_object_t *obj, HINSTANCE hdecoder_dll,
+HRESULT D3D11_CreateDevice(vlc_object_t *obj, d3d11_handle_t *hd3d,
                            bool hw_decoding, d3d11_device_t *out)
 {
 #if !VLC_WINSTORE_APP
 # define D3D11CreateDevice(args...)             pf_CreateDevice(args)
     /* */
     PFN_D3D11_CREATE_DEVICE pf_CreateDevice;
-    pf_CreateDevice = (void *)GetProcAddress(hdecoder_dll, "D3D11CreateDevice");
+    pf_CreateDevice = (void *)GetProcAddress(hd3d->hdll, "D3D11CreateDevice");
     if (!pf_CreateDevice) {
         msg_Err(obj, "Cannot locate reference to D3D11CreateDevice ABI in DLL");
         return E_NOINTERFACE;
diff --git a/modules/video_chroma/d3d11_fmt.h b/modules/video_chroma/d3d11_fmt.h
index 84d3136691..4793fe75ce 100644
--- a/modules/video_chroma/d3d11_fmt.h
+++ b/modules/video_chroma/d3d11_fmt.h
@@ -35,6 +35,13 @@ typedef struct
     ID3D11DeviceContext      *d3dcontext;      /* D3D context */
 } d3d11_device_t;
 
+typedef struct
+{
+#if !VLC_WINSTORE_APP
+    HINSTANCE                 hdll;       /* handle of the opened d3d11 dll */
+#endif
+} d3d11_handle_t;
+
 /* owned by the vout for VLC_CODEC_D3D11_OPAQUE */
 struct picture_sys_t
 {
@@ -75,7 +82,7 @@ int AllocateShaderView(vlc_object_t *obj, ID3D11Device *d3ddevice,
                               ID3D11Texture2D *p_texture[D3D11_MAX_SHADER_VIEW], UINT slice_index,
                               ID3D11ShaderResourceView *resourceView[D3D11_MAX_SHADER_VIEW]);
 
-HRESULT D3D11_CreateDevice(vlc_object_t *obj, HINSTANCE hdecoder_dll,
+HRESULT D3D11_CreateDevice(vlc_object_t *obj, d3d11_handle_t *,
                            bool hw_decoding, d3d11_device_t *out);
 
 bool isXboxHardware(ID3D11Device *d3ddev);
diff --git a/modules/video_output/win32/direct3d11.c b/modules/video_output/win32/direct3d11.c
index a72a45e9f0..b98f6e372a 100644
--- a/modules/video_output/win32/direct3d11.c
+++ b/modules/video_output/win32/direct3d11.c
@@ -137,7 +137,7 @@ struct vout_display_sys_t
 
 #if !VLC_WINSTORE_APP
     HINSTANCE                hdxgi_dll;        /* handle of the opened dxgi dll */
-    HINSTANCE                hd3d11_dll;       /* handle of the opened d3d11 dll */
+    d3d11_handle_t           hd3d;
     HINSTANCE                hd3dcompiler_dll; /* handle of the opened d3dcompiler dll */
     /* We should find a better way to store this or atleast a shorter name */
     PFN_D3D11_CREATE_DEVICE_AND_SWAP_CHAIN OurD3D11CreateDeviceAndSwapChain;
@@ -418,8 +418,8 @@ static int OpenHwnd(vout_display_t *vd)
     if (!sys)
         return VLC_ENOMEM;
 
-    sys->hd3d11_dll = LoadLibrary(TEXT("D3D11.DLL"));
-    if (!sys->hd3d11_dll) {
+    sys->hd3d.hdll = LoadLibrary(TEXT("D3D11.DLL"));
+    if (!sys->hd3d.hdll) {
         msg_Warn(vd, "cannot load d3d11.dll, aborting");
         return VLC_EGENERIC;
     }
@@ -439,7 +439,7 @@ static int OpenHwnd(vout_display_t *vd)
     }
 
     sys->OurD3D11CreateDevice =
-        (void *)GetProcAddress(sys->hd3d11_dll, "D3D11CreateDevice");
+        (void *)GetProcAddress(sys->hd3d.hdll, "D3D11CreateDevice");
     if (!sys->OurD3D11CreateDevice) {
         msg_Err(vd, "Cannot locate reference to D3D11CreateDevice in d3d11 DLL");
         Direct3D11Destroy(vd);
@@ -1242,8 +1242,8 @@ static void Direct3D11Destroy(vout_display_t *vd)
 #if !VLC_WINSTORE_APP
     vout_display_sys_t *sys = vd->sys;
 
-    if (sys->hd3d11_dll)
-        FreeLibrary(sys->hd3d11_dll);
+    if (sys->hd3d.hdll)
+        FreeLibrary(sys->hd3d.hdll);
     if (sys->hd3dcompiler_dll)
         FreeLibrary(sys->hd3dcompiler_dll);
 
@@ -1251,7 +1251,7 @@ static void Direct3D11Destroy(vout_display_t *vd)
     sys->OurD3D11CreateDeviceAndSwapChain = NULL;
     sys->OurD3DCompile = NULL;
     sys->hdxgi_dll = NULL;
-    sys->hd3d11_dll = NULL;
+    sys->hd3d.hdll = NULL;
     sys->hd3dcompiler_dll = NULL;
 #else
     VLC_UNUSED(vd);
@@ -1476,7 +1476,7 @@ static int Direct3D11Open(vout_display_t *vd, video_format_t *fmt)
     //scd.Flags = 512; // DXGI_SWAP_CHAIN_FLAG_YUV_VIDEO;
     scd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
 
-    hr = D3D11_CreateDevice(VLC_OBJECT(vd), sys->hd3d11_dll,
+    hr = D3D11_CreateDevice(VLC_OBJECT(vd), &sys->hd3d,
                             is_d3d11_opaque(fmt->i_chroma),
                             &sys->d3d_dev);
     if (FAILED(hr)) {
-- 
2.14.2



More information about the vlc-devel mailing list