[vlc-devel] [PATCH 08/14] dxva2: make use of the DLL loading/Device creation from libd3d9_common

Steve Lhomme robux4 at videolabs.io
Sat Nov 18 14:26:41 CET 2017


---
 modules/codec/avcodec/dxva2.c | 99 ++++++++++++-------------------------------
 1 file changed, 26 insertions(+), 73 deletions(-)

diff --git a/modules/codec/avcodec/dxva2.c b/modules/codec/avcodec/dxva2.c
index 7bfe6a9273..2758cbea7e 100644
--- a/modules/codec/avcodec/dxva2.c
+++ b/modules/codec/avcodec/dxva2.c
@@ -112,12 +112,9 @@ struct vlc_va_sys_t
 {
     directx_sys_t         dx_sys;
 
-    /* DLL */
-    HINSTANCE             hd3d9_dll;
-
     /* Direct3D */
-    LPDIRECT3D9            d3dobj;
-    D3DADAPTER_IDENTIFIER9 d3dai;
+    d3d9_handle_t          hd3d;
+    d3d9_device_t          d3d_dev;
 
     /* Device manager */
     IDirect3DDeviceManager9  *devmng;
@@ -245,9 +242,6 @@ static void Close(vlc_va_t *va, void **ctx)
 
     directx_va_Close(va, &sys->dx_sys);
 
-    if (sys->hd3d9_dll)
-        FreeLibrary(sys->hd3d9_dll);
-
     free((char *)va->description);
     free(sys);
 }
@@ -268,8 +262,7 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,
         return VLC_ENOMEM;
 
     /* Load dll*/
-    sys->hd3d9_dll = LoadLibrary(TEXT("D3D9.DLL"));
-    if (!sys->hd3d9_dll) {
+    if (D3D9_Create(va, &sys->hd3d) != VLC_SUCCESS) {
         msg_Warn(va, "cannot load d3d9.dll");
         goto error;
     }
@@ -298,7 +291,9 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,
         D3DSURFACE_DESC src;
         if (SUCCEEDED(IDirect3DSurface9_GetDesc(p_sys->surface, &src)))
             sys->render = src.Format;
-        IDirect3DSurface9_GetDevice(p_sys->surface, &dx_sys->d3ddev );
+        IDirect3DSurface9_GetDevice(p_sys->surface, &sys->d3d_dev.dev );
+        dx_sys->d3ddev = sys->d3d_dev.dev;
+        sys->d3d_dev.owner = false;
     }
 
     err = directx_va_Open(va, &sys->dx_sys, true);
@@ -329,64 +324,19 @@ static int D3dCreateDevice(vlc_va_t *va)
 {
     vlc_va_sys_t *sys = va->sys;
 
-    if (sys->dx_sys.d3ddev) {
+    if (sys->d3d_dev.dev) {
         msg_Dbg(va, "Reusing Direct3D9 device");
         return VLC_SUCCESS;
     }
 
-    /* */
-    LPDIRECT3D9 (WINAPI *Create9)(UINT SDKVersion);
-    Create9 = (void *)GetProcAddress(sys->hd3d9_dll, "Direct3DCreate9");
-    if (!Create9) {
-        msg_Err(va, "Cannot locate reference to Direct3DCreate9 ABI in DLL");
-        return VLC_EGENERIC;
-    }
-
-    /* */
-    LPDIRECT3D9 d3dobj;
-    d3dobj = Create9(D3D_SDK_VERSION);
-    if (!d3dobj) {
-        msg_Err(va, "Direct3DCreate9 failed");
-        return VLC_EGENERIC;
-    }
-    sys->d3dobj = d3dobj;
-
-    /* */
-    D3DADAPTER_IDENTIFIER9 *d3dai = &sys->d3dai;
-    if (FAILED(IDirect3D9_GetAdapterIdentifier(sys->d3dobj,
-                                               D3DADAPTER_DEFAULT, 0, d3dai))) {
-        msg_Warn(va, "IDirect3D9_GetAdapterIdentifier failed");
-        ZeroMemory(d3dai, sizeof(*d3dai));
-    }
-
-    /* */
-    D3DPRESENT_PARAMETERS d3dpp;
-    ZeroMemory(&d3dpp, sizeof(d3dpp));
-    d3dpp.Flags                  = D3DPRESENTFLAG_VIDEO;
-    d3dpp.Windowed               = TRUE;
-    d3dpp.hDeviceWindow          = NULL;
-    d3dpp.SwapEffect             = D3DSWAPEFFECT_DISCARD;
-    d3dpp.MultiSampleType        = D3DMULTISAMPLE_NONE;
-    d3dpp.PresentationInterval   = D3DPRESENT_INTERVAL_DEFAULT;
-    d3dpp.BackBufferCount        = 0;                  /* FIXME what to put here */
-    d3dpp.BackBufferFormat       = D3DFMT_X8R8G8B8;    /* FIXME what to put here */
-    d3dpp.BackBufferWidth        = 0;
-    d3dpp.BackBufferHeight       = 0;
-    d3dpp.EnableAutoDepthStencil = FALSE;
-
-    /* Direct3D needs a HWND to create a device, even without using ::Present
-    this HWND is used to alert Direct3D when there's a change of focus window.
-    For now, use GetDesktopWindow, as it looks harmless */
-    LPDIRECT3DDEVICE9 d3ddev;
-    if (FAILED(IDirect3D9_CreateDevice(d3dobj, D3DADAPTER_DEFAULT,
-                                       D3DDEVTYPE_HAL, GetDesktopWindow(),
-                                       D3DCREATE_SOFTWARE_VERTEXPROCESSING |
-                                       D3DCREATE_MULTITHREADED,
-                                       &d3dpp, &d3ddev))) {
+    video_format_t fmt = { 0 };
+    HRESULT hr = D3D9_CreateDevice(va, &sys->hd3d, GetDesktopWindow(), &fmt, &sys->d3d_dev);
+    if (FAILED(hr))
+    {
         msg_Err(va, "IDirect3D9_CreateDevice failed");
         return VLC_EGENERIC;
     }
-    sys->dx_sys.d3ddev = d3ddev;
+    sys->dx_sys.d3ddev = sys->d3d_dev.dev;
 
     return VLC_SUCCESS;
 }
@@ -396,16 +346,14 @@ static int D3dCreateDevice(vlc_va_t *va)
  */
 static void D3dDestroyDevice(vlc_va_t *va)
 {
-    directx_sys_t *dx_sys = &va->sys->dx_sys;
-    if (va->sys->d3dobj)
-        IDirect3D9_Release(va->sys->d3dobj);
-    if (dx_sys->d3ddev)
-        IDirect3DDevice9_Release(dx_sys->d3ddev);
+    vlc_va_sys_t *sys = va->sys;
+    D3D9_ReleaseDevice(&sys->d3d_dev);
+    D3D9_Destroy( &sys->hd3d );
 }
 /**
  * It describes our Direct3D object
  */
-static char *DxDescribe(vlc_va_sys_t *va)
+static char *DxDescribe(vlc_va_sys_t *sys)
 {
     static const struct {
         unsigned id;
@@ -418,11 +366,16 @@ static char *DxDescribe(vlc_va_sys_t *va)
         { 0x5333, "S3 Graphics" },
         { 0, "" }
     };
-    D3DADAPTER_IDENTIFIER9 *id = &va->d3dai;
+
+    D3DADAPTER_IDENTIFIER9 d3dai;
+    if (FAILED(IDirect3D9_GetAdapterIdentifier(sys->hd3d.obj,
+                                               sys->d3d_dev.adapterId, 0, &d3dai))) {
+        return NULL;
+    }
 
     const char *vendor = "Unknown";
     for (int i = 0; vendors[i].id != 0; i++) {
-        if (vendors[i].id == id->VendorId) {
+        if (vendors[i].id == d3dai.VendorId) {
             vendor = vendors[i].name;
             break;
         }
@@ -430,8 +383,8 @@ static char *DxDescribe(vlc_va_sys_t *va)
 
     char *description;
     if (asprintf(&description, "DXVA2 (%.*s, vendor %lu(%s), device %lu, revision %lu)",
-                 (int)sizeof(id->Description), id->Description,
-                 id->VendorId, vendor, id->DeviceId, id->Revision) < 0)
+                 (int)sizeof(d3dai.Description), d3dai.Description,
+                 d3dai.VendorId, vendor, d3dai.DeviceId, d3dai.Revision) < 0)
         return NULL;
     return description;
 }
@@ -465,7 +418,7 @@ static int D3dCreateDeviceManager(vlc_va_t *va)
     sys->devmng = devmng;
     msg_Dbg(va, "obtained IDirect3DDeviceManager9");
 
-    HRESULT hr = IDirect3DDeviceManager9_ResetDevice(devmng, dx_sys->d3ddev, token);
+    HRESULT hr = IDirect3DDeviceManager9_ResetDevice(devmng, sys->d3d_dev.dev, token);
     if (FAILED(hr)) {
         msg_Err(va, "IDirect3DDeviceManager9_ResetDevice failed: %08x", (unsigned)hr);
         return VLC_EGENERIC;
-- 
2.14.2



More information about the vlc-devel mailing list