[vlc-commits] direct3d9: no need for a HWND at all to create & use a device

Steve Lhomme git at videolan.org
Wed Jul 3 11:54:25 CEST 2019


vlc | branch: master | Steve Lhomme <robux4 at ycbcr.xyz> | Wed Jun 26 09:47:37 2019 +0200| [ba5c9bfced5186d13f50154d04ec764d7f9b3dc8] | committer: Steve Lhomme

direct3d9: no need for a HWND at all to create & use a device

When presenting the data we use the proper HWND to Present(). When rendering
externally it's the host that needs to take care of that, and we render in a
texture anyway.

The decoder/filters don't seem to need the HWND at all (tested on Win7 and 10).

And simplify the calls to D3D9_CreateExternal().

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

 modules/codec/avcodec/dxva2.c          |  6 +++---
 modules/video_chroma/d3d9_fmt.c        | 19 ++++++++-----------
 modules/video_chroma/d3d9_fmt.h        | 10 ++++------
 modules/video_output/win32/direct3d9.c |  4 ++--
 4 files changed, 17 insertions(+), 22 deletions(-)

diff --git a/modules/codec/avcodec/dxva2.c b/modules/codec/avcodec/dxva2.c
index 6ee8888131..977bf09309 100644
--- a/modules/codec/avcodec/dxva2.c
+++ b/modules/codec/avcodec/dxva2.c
@@ -277,8 +277,8 @@ static int Open(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt,
             free( sys );
             goto error;
         }
-        if ( D3D9_CreateExternal(va, &sys->hd3d, device) != VLC_SUCCESS ||
-             FAILED(D3D9_CreateDeviceExternal( device, &sys->hd3d, 0, &sys->d3d_dev)) )
+        if ( D3D9_CreateExternal(&sys->hd3d, device) != VLC_SUCCESS ||
+             FAILED(D3D9_CreateDeviceExternal( device, &sys->hd3d, &sys->d3d_dev)) )
         {
             IDirect3DDevice9_Release(device);
             free( sys );
@@ -359,7 +359,7 @@ static int D3dCreateDevice(vlc_va_t *va)
         return VLC_SUCCESS;
     }
 
-    HRESULT hr = D3D9_CreateDevice(va, &sys->hd3d, -1, NULL, &sys->d3d_dev);
+    HRESULT hr = D3D9_CreateDevice(va, &sys->hd3d, -1, &sys->d3d_dev);
     if (FAILED(hr))
     {
         msg_Err(va, "IDirect3D9_CreateDevice failed");
diff --git a/modules/video_chroma/d3d9_fmt.c b/modules/video_chroma/d3d9_fmt.c
index ec23efd565..e7579abf12 100644
--- a/modules/video_chroma/d3d9_fmt.c
+++ b/modules/video_chroma/d3d9_fmt.c
@@ -31,7 +31,7 @@ typedef picture_sys_d3d9_t VA_PICSYS;
 #include "../codec/avcodec/va_surface.h"
 
 #undef D3D9_CreateDevice
-HRESULT D3D9_CreateDevice(vlc_object_t *o, d3d9_handle_t *hd3d, int AdapterToUse, HWND hwnd,
+HRESULT D3D9_CreateDevice(vlc_object_t *o, d3d9_handle_t *hd3d, int AdapterToUse,
                           d3d9_device_t *out)
 {
     HRESULT hr;
@@ -74,7 +74,6 @@ HRESULT D3D9_CreateDevice(vlc_object_t *o, d3d9_handle_t *hd3d, int AdapterToUse
     }
 
     out->adapterId = AdapterToUse;
-    out->hwnd      = hwnd;
     /* TODO only create a device for the decoder dimensions */
     D3DPRESENT_PARAMETERS d3dpp;
     if (D3D9_FillPresentationParameters(hd3d, out, &d3dpp))
@@ -105,12 +104,12 @@ HRESULT D3D9_CreateDevice(vlc_object_t *o, d3d9_handle_t *hd3d, int AdapterToUse
             DWORD creationFlags = thread_modes[t] | vertex_modes[v];
             if (hd3d->use_ex)
                 hr = IDirect3D9Ex_CreateDeviceEx(hd3d->objex, AdapterToUse,
-                                                 DeviceType, hwnd,
+                                                 DeviceType, NULL,
                                                  creationFlags,
                                                  &d3dpp, NULL, &out->devex);
             else
                 hr = IDirect3D9_CreateDevice(hd3d->obj, AdapterToUse,
-                                             DeviceType, hwnd,
+                                             DeviceType, NULL,
                                              creationFlags,
                                              &d3dpp, &out->dev);
             if (SUCCEEDED(hr))
@@ -127,7 +126,7 @@ HRESULT D3D9_CreateDevice(vlc_object_t *o, d3d9_handle_t *hd3d, int AdapterToUse
     return hr;
 }
 
-HRESULT D3D9_CreateDeviceExternal(IDirect3DDevice9 *dev, d3d9_handle_t *hd3d, HWND hwnd,
+HRESULT D3D9_CreateDeviceExternal(IDirect3DDevice9 *dev, d3d9_handle_t *hd3d,
                                   d3d9_device_t *out)
 {
     D3DDEVICE_CREATION_PARAMETERS params;
@@ -136,7 +135,6 @@ HRESULT D3D9_CreateDeviceExternal(IDirect3DDevice9 *dev, d3d9_handle_t *hd3d, HW
        return hr;
     out->dev   = dev;
     out->owner = false;
-    out->hwnd  = hwnd;
     out->adapterId = params.AdapterOrdinal;
     ZeroMemory(&out->caps, sizeof(out->caps));
     hr = IDirect3D9_GetDeviceCaps(hd3d->obj, out->adapterId, params.DeviceType, &out->caps);
@@ -165,7 +163,7 @@ void D3D9_ReleaseDevice(d3d9_device_t *d3d_dev)
  * from the default adapter.
  */
 int D3D9_FillPresentationParameters(d3d9_handle_t *hd3d,
-                                    const d3d9_device_t *out,
+                                    const d3d9_device_t *d3ddev,
                                     D3DPRESENT_PARAMETERS *d3dpp)
 {
     /*
@@ -173,7 +171,7 @@ int D3D9_FillPresentationParameters(d3d9_handle_t *hd3d,
     ** buffer of the same format
     */
     D3DDISPLAYMODE d3ddm;
-    HRESULT hr = IDirect3D9_GetAdapterDisplayMode(hd3d->obj, out->adapterId, &d3ddm);
+    HRESULT hr = IDirect3D9_GetAdapterDisplayMode(hd3d->obj, d3ddev->adapterId, &d3ddm);
     if (FAILED(hr))
         return VLC_EGENERIC;
 
@@ -184,7 +182,7 @@ int D3D9_FillPresentationParameters(d3d9_handle_t *hd3d,
     d3dpp->MultiSampleType        = D3DMULTISAMPLE_NONE;
     d3dpp->PresentationInterval   = D3DPRESENT_INTERVAL_DEFAULT;
     d3dpp->EnableAutoDepthStencil = FALSE;
-    d3dpp->hDeviceWindow          = out->hwnd;
+    d3dpp->hDeviceWindow          = NULL;
     d3dpp->SwapEffect             = D3DSWAPEFFECT_COPY;
     d3dpp->BackBufferFormat       = d3ddm.Format;
     d3dpp->BackBufferCount        = 1;
@@ -256,8 +254,7 @@ error:
     return VLC_EGENERIC;
 }
 
-#undef D3D9_CreateExternal
-int D3D9_CreateExternal(vlc_object_t *o, d3d9_handle_t *hd3d, IDirect3DDevice9 *d3d9dev)
+int D3D9_CreateExternal(d3d9_handle_t *hd3d, IDirect3DDevice9 *d3d9dev)
 {
     HRESULT hr = IDirect3DDevice9_GetDirect3D(d3d9dev, &hd3d->obj);
     if (unlikely(FAILED(hr)))
diff --git a/modules/video_chroma/d3d9_fmt.h b/modules/video_chroma/d3d9_fmt.h
index 8453d875f6..f35e4414c9 100644
--- a/modules/video_chroma/d3d9_fmt.h
+++ b/modules/video_chroma/d3d9_fmt.h
@@ -63,7 +63,6 @@ typedef struct
     /* creation parameters */
     D3DFORMAT               BufferFormat;
     UINT                    adapterId;
-    HWND                    hwnd;
     D3DCAPS9                caps;
 } d3d9_device_t;
 
@@ -95,17 +94,16 @@ static inline void ReleaseD3D9PictureSys(picture_sys_d3d9_t *p_sys)
     FreeLibrary(p_sys->dxva2_dll);
 }
 
-HRESULT D3D9_CreateDevice(vlc_object_t *, d3d9_handle_t *, int, HWND,
+HRESULT D3D9_CreateDevice(vlc_object_t *, d3d9_handle_t *, int,
                           d3d9_device_t *out);
-#define D3D9_CreateDevice(a,b,c,d,e) D3D9_CreateDevice( VLC_OBJECT(a), b, c, d, e )
-HRESULT D3D9_CreateDeviceExternal(IDirect3DDevice9 *, d3d9_handle_t *, HWND,
+#define D3D9_CreateDevice(a,b,c,d) D3D9_CreateDevice( VLC_OBJECT(a), b, c, d )
+HRESULT D3D9_CreateDeviceExternal(IDirect3DDevice9 *, d3d9_handle_t *,
                                   d3d9_device_t *out);
 
 void D3D9_ReleaseDevice(d3d9_device_t *);
 int D3D9_Create(vlc_object_t *, d3d9_handle_t *);
 #define D3D9_Create(a,b) D3D9_Create( VLC_OBJECT(a), b )
-int D3D9_CreateExternal(vlc_object_t *, d3d9_handle_t *, IDirect3DDevice9 *);
-#define D3D9_CreateExternal(a,b,c) D3D9_CreateExternal( VLC_OBJECT(a), b, c )
+int D3D9_CreateExternal(d3d9_handle_t *, IDirect3DDevice9 *);
 void D3D9_CloneExternal(d3d9_handle_t *, IDirect3D9 *);
 
 void D3D9_Destroy(d3d9_handle_t *);
diff --git a/modules/video_output/win32/direct3d9.c b/modules/video_output/win32/direct3d9.c
index 12a65b6964..4fe32fbb6d 100644
--- a/modules/video_output/win32/direct3d9.c
+++ b/modules/video_output/win32/direct3d9.c
@@ -1699,7 +1699,7 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
     }
     IDirect3D9 *d3d9_device = device_setup.device_context;
     D3D9_CloneExternal( &sys->hd3d, d3d9_device );
-    HRESULT hr = D3D9_CreateDevice(vd, &sys->hd3d, device_setup.adapter, NULL, &sys->d3d_dev);
+    HRESULT hr = D3D9_CreateDevice(vd, &sys->hd3d, device_setup.adapter, &sys->d3d_dev);
     if (FAILED(hr)) {
         msg_Err( vd, "D3D9 Creation failed! (hr=0x%lX)", hr);
         D3D9_Destroy(&sys->hd3d);
@@ -1961,7 +1961,7 @@ GLConvOpen(vlc_object_t *obj)
         goto error;
     }
 
-    if (FAILED(D3D9_CreateDevice(obj, &priv->hd3d, -1, NULL,
+    if (FAILED(D3D9_CreateDevice(obj, &priv->hd3d, -1,
                                  &priv->d3d_dev)))
         goto error;
 



More information about the vlc-commits mailing list