[vlc-commits] direct3d9: refactor context create/destroy

Thomas Guillem git at videolan.org
Mon Nov 13 13:12:12 CET 2017


vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Wed Nov  8 17:38:17 2017 +0100| [1246ef73d0ce0132a4e0850df9bd48b08a397e0c] | committer: Thomas Guillem

direct3d9: refactor context create/destroy

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

 modules/video_output/win32/direct3d9.c | 108 ++++++++++++++++-----------------
 1 file changed, 54 insertions(+), 54 deletions(-)

diff --git a/modules/video_output/win32/direct3d9.c b/modules/video_output/win32/direct3d9.c
index cdc2049197..22ad032963 100644
--- a/modules/video_output/win32/direct3d9.c
+++ b/modules/video_output/win32/direct3d9.c
@@ -186,9 +186,9 @@ static void           Display(vout_display_t *, picture_t *, subpicture_t *subpi
 static int            Control(vout_display_t *, int, va_list);
 static void           Manage (vout_display_t *);
 
-static int  Direct3D9Create (vout_display_t *);
+static int  Direct3D9Create (vlc_object_t *, struct d3dctx *, const video_format_t *);
 static int  Direct3D9Reset  (vout_display_t *);
-static void Direct3D9Destroy(vout_display_t *);
+static void Direct3D9Destroy(vlc_object_t *, struct d3dctx *);
 
 static int  Direct3D9Open (vout_display_t *, video_format_t *);
 static void Direct3D9Close(vout_display_t *);
@@ -254,9 +254,8 @@ static int Open(vlc_object_t *object)
     if (!sys)
         return VLC_ENOMEM;
 
-    if (Direct3D9Create(vd)) {
+    if (Direct3D9Create(VLC_OBJECT(vd), &sys->d3dctx, &vd->fmt)) {
         msg_Err(vd, "Direct3D9 could not be initialized");
-        Direct3D9Destroy(vd);
         free(sys);
         return VLC_EGENERIC;
     }
@@ -328,7 +327,7 @@ static int Open(vlc_object_t *object)
 error:
     Direct3D9Close(vd);
     CommonClean(vd);
-    Direct3D9Destroy(vd);
+    Direct3D9Destroy(VLC_OBJECT(vd), &sys->d3dctx);
     free(vd->sys);
     return VLC_EGENERIC;
 }
@@ -347,7 +346,7 @@ static void Close(vlc_object_t *object)
 
     CommonClean(vd);
 
-    Direct3D9Destroy(vd);
+    Direct3D9Destroy(VLC_OBJECT(vd), &vd->sys->d3dctx);
 
     free(vd->sys);
 }
@@ -724,96 +723,97 @@ static HINSTANCE Direct3D9LoadShaderLibrary(void)
 /**
  * It initializes an instance of Direct3D9
  */
-static int Direct3D9Create(vout_display_t *vd)
+static int Direct3D9Create(vlc_object_t *o, struct d3dctx *d3dctx, const video_format_t *fmt)
 {
-    vout_display_sys_t *sys = vd->sys;
-
-    sys->d3dctx.hdll = LoadLibrary(TEXT("D3D9.DLL"));
-    if (!sys->d3dctx.hdll) {
-        msg_Warn(vd, "cannot load d3d9.dll, aborting");
+    d3dctx->hdll = LoadLibrary(TEXT("D3D9.DLL"));
+    if (!d3dctx->hdll) {
+        msg_Warn(o, "cannot load d3d9.dll, aborting");
         return VLC_EGENERIC;
     }
 
     LPDIRECT3D9 (WINAPI *OurDirect3DCreate9)(UINT SDKVersion);
     OurDirect3DCreate9 =
-        (void *)GetProcAddress(sys->d3dctx.hdll, "Direct3DCreate9");
+        (void *)GetProcAddress(d3dctx->hdll, "Direct3DCreate9");
     if (!OurDirect3DCreate9) {
-        msg_Err(vd, "Cannot locate reference to Direct3DCreate9 ABI in DLL");
-        return VLC_EGENERIC;
+        msg_Err(o, "Cannot locate reference to Direct3DCreate9 ABI in DLL");
+        goto error;
     }
 
     HRESULT (WINAPI *OurDirect3DCreate9Ex)(UINT SDKVersion, IDirect3D9Ex **ppD3D);
     OurDirect3DCreate9Ex =
-        (void *)GetProcAddress(sys->d3dctx.hdll, "Direct3DCreate9Ex");
+        (void *)GetProcAddress(d3dctx->hdll, "Direct3DCreate9Ex");
 
     /* Create the D3D object. */
     if (OurDirect3DCreate9Ex) {
-        HRESULT hr = OurDirect3DCreate9Ex(D3D_SDK_VERSION, &sys->d3dctx.objex);
+        HRESULT hr = OurDirect3DCreate9Ex(D3D_SDK_VERSION, &d3dctx->objex);
         if(!FAILED(hr)) {
-            msg_Dbg(vd, "Using Direct3D9 Extended API!");
-            sys->d3dctx.use_ex = true;
+            msg_Dbg(o, "Using Direct3D9 Extended API!");
+            d3dctx->use_ex = true;
         }
     }
 
-    if (!sys->d3dctx.obj)
+    if (!d3dctx->obj)
     {
-        sys->d3dctx.obj = OurDirect3DCreate9(D3D_SDK_VERSION);
-        if (!sys->d3dctx.obj) {
-            msg_Err(vd, "Could not create Direct3D9 instance.");
-            return VLC_EGENERIC;
+        d3dctx->obj = OurDirect3DCreate9(D3D_SDK_VERSION);
+        if (!d3dctx->obj) {
+            msg_Err(o, "Could not create Direct3D9 instance.");
+            goto error;
         }
     }
 
-    sys->d3dctx.hxdll = Direct3D9LoadShaderLibrary();
-    if (!sys->d3dctx.hxdll)
-        msg_Warn(vd, "cannot load Direct3D9 Shader Library; HLSL pixel shading will be disabled.");
+    d3dctx->hxdll = Direct3D9LoadShaderLibrary();
+    if (!d3dctx->hxdll)
+        msg_Warn(o, "cannot load Direct3D9 Shader Library; HLSL pixel shading will be disabled.");
 
     /*
     ** Get device capabilities
     */
-    ZeroMemory(&sys->d3dctx.caps, sizeof(sys->d3dctx.caps));
-    HRESULT hr = IDirect3D9_GetDeviceCaps(sys->d3dctx.obj, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &sys->d3dctx.caps);
+    ZeroMemory(&d3dctx->caps, sizeof(d3dctx->caps));
+    HRESULT hr = IDirect3D9_GetDeviceCaps(d3dctx->obj, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &d3dctx->caps);
     if (FAILED(hr)) {
-       msg_Err(vd, "Could not read adapter capabilities. (hr=0x%0lx)", hr);
-       return VLC_EGENERIC;
+       msg_Err(o, "Could not read adapter capabilities. (hr=0x%0lx)", hr);
+       goto error;
     }
 
     /* TODO: need to test device capabilities and select the right render function */
-    if (!(sys->d3dctx.caps.DevCaps2 & D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES)) {
-        msg_Err(vd, "Device does not support stretching from textures.");
-        return VLC_EGENERIC;
+    if (!(d3dctx->caps.DevCaps2 & D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES)) {
+        msg_Err(o, "Device does not support stretching from textures.");
+        goto error;
     }
 
-    if ( vd->fmt.i_width > sys->d3dctx.caps.MaxTextureWidth ||
-         vd->fmt.i_height > sys->d3dctx.caps.MaxTextureHeight )
+    if ( fmt->i_width > d3dctx->caps.MaxTextureWidth ||
+         fmt->i_height > d3dctx->caps.MaxTextureHeight )
     {
-        msg_Err(vd, "Textures too large %ux%u max possible: %ux%u",
-                vd->fmt.i_width, vd->fmt.i_height,
-                (unsigned) sys->d3dctx.caps.MaxTextureWidth,
-                (unsigned) sys->d3dctx.caps.MaxTextureHeight);
-        return VLC_EGENERIC;
+        msg_Err(o, "Textures too large %ux%u max possible: %ux%u",
+                fmt->i_width, fmt->i_height,
+                (unsigned) d3dctx->caps.MaxTextureWidth,
+                (unsigned) d3dctx->caps.MaxTextureHeight);
+        goto error;
     }
 
     return VLC_SUCCESS;
+error:
+    Direct3D9Destroy(o, d3dctx);
+    return VLC_EGENERIC;
 }
 
 /**
  * It releases an instance of Direct3D9
  */
-static void Direct3D9Destroy(vout_display_t *vd)
+static void Direct3D9Destroy(vlc_object_t *o, struct d3dctx *d3dctx)
 {
-    vout_display_sys_t *sys = vd->sys;
-
-    if (sys->d3dctx.obj)
-       IDirect3D9_Release(sys->d3dctx.obj);
-    if (sys->d3dctx.hdll)
-        FreeLibrary(sys->d3dctx.hdll);
-    if (sys->d3dctx.hxdll)
-        FreeLibrary(sys->d3dctx.hxdll);
-
-    sys->d3dctx.obj = NULL;
-    sys->d3dctx.hdll = NULL;
-    sys->d3dctx.hxdll = NULL;
+    VLC_UNUSED(o);
+
+    if (d3dctx->obj)
+       IDirect3D9_Release(d3dctx->obj);
+    if (d3dctx->hdll)
+        FreeLibrary(d3dctx->hdll);
+    if (d3dctx->hxdll)
+        FreeLibrary(d3dctx->hxdll);
+
+    d3dctx->obj = NULL;
+    d3dctx->hdll = NULL;
+    d3dctx->hxdll = NULL;
 }
 
 



More information about the vlc-commits mailing list