changeset 30148:517a800e940e

Modify -vo direct3d so we do not have to link against d3d9.dll, it might not be available on some rare systems. Based on patch used for builds by Gianluigi Tiesi [sherpya netfarm it]
author reimar
date Sun, 03 Jan 2010 17:00:51 +0000
parents b30392ece0e3
children 5f8cbd711a04
files configure libvo/vo_direct3d.c
diffstat 2 files changed, 20 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/configure	Sun Jan 03 16:51:56 2010 +0000
+++ b/configure	Sun Jan 03 17:00:51 2010 +0000
@@ -5334,11 +5334,10 @@
 int main(void) { return 0; }
 EOF
   _direct3d=no
-  cc_check -ld3d9 && _direct3d=yes
+  cc_check && _direct3d=yes
 fi
 if test "$_direct3d" = yes ; then
   def_direct3d='#define CONFIG_DIRECT3D 1'
-  libs_mplayer="$libs_mplayer -ld3d9"
   _vomodules="direct3d $_vomodules"
 else
   def_direct3d='#undef CONFIG_DIRECT3D'
--- a/libvo/vo_direct3d.c	Sun Jan 03 16:51:56 2010 +0000
+++ b/libvo/vo_direct3d.c	Sun Jan 03 17:00:51 2010 +0000
@@ -70,6 +70,10 @@
                                     the movie's codec) */
     D3DFORMAT desktop_fmt;          /**< Desktop (screen) colorspace format.
                                     Usually XRGB */
+
+    HANDLE d3d9_dll;                /**< d3d9 Library HANDLE */
+    IDirect3D9 * (WINAPI *pDirect3DCreate9)(UINT); /**< pointer to Direct3DCreate9 function */
+
     LPDIRECT3D9        d3d_handle;  /**< Direct3D Handle */
     LPDIRECT3DDEVICE9  d3d_device;  /**< The Direct3D Adapter */
     IDirect3DSurface9 *d3d_surface; /**< Offscreen Direct3D Surface. MPlayer
@@ -441,7 +445,7 @@
     IDirect3D9_Release(priv->d3d_handle);
 
     /* Initialize Direct3D from the beginning */
-    priv->d3d_handle = Direct3DCreate9(D3D_SDK_VERSION);
+    priv->d3d_handle = priv->pDirect3DCreate9(D3D_SDK_VERSION);
     if (!priv->d3d_handle) {
         mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>Initializing Direct3D failed.\n");
         return 0;
@@ -678,7 +682,19 @@
        > an example of how to use it.
     */
 
-    priv->d3d_handle = Direct3DCreate9(D3D_SDK_VERSION);
+    priv->d3d9_dll = LoadLibraryA("d3d9.dll");
+    if (!priv->d3d9_dll) {
+        mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>Unable to dynamically load d3d9.dll\n");
+        return -1;
+    }
+
+    priv->pDirect3DCreate9 = (void *)GetProcAddress(priv->d3d9_dll, "Direct3DCreate9");
+    if (!priv->pDirect3DCreate9) {
+        mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>Unable to find entry point of Direct3DCreate9\n");
+        return -1;
+    }
+
+    priv->d3d_handle = priv->pDirect3DCreate9(D3D_SDK_VERSION);
     if (!priv->d3d_handle) {
         mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>Initializing Direct3D failed.\n");
         return -1;
@@ -861,6 +877,7 @@
 
     uninit_d3d();
     vo_w32_uninit(); /* w32_common framework call */
+    FreeLibrary(priv->d3d9_dll);
     free(priv);
     priv = NULL;
 }