[vlc-devel] [PATCH 03/14] direct3d9: query the capabilities just before creating the device

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


And use the proper adapter.
---
 modules/video_chroma/d3d9_fmt.c        | 35 ++++++++++++++++++----
 modules/video_chroma/d3d9_fmt.h        |  6 ++--
 modules/video_output/win32/direct3d9.c | 55 +++++++++-------------------------
 3 files changed, 47 insertions(+), 49 deletions(-)

diff --git a/modules/video_chroma/d3d9_fmt.c b/modules/video_chroma/d3d9_fmt.c
index beae3c1066..01951535a1 100644
--- a/modules/video_chroma/d3d9_fmt.c
+++ b/modules/video_chroma/d3d9_fmt.c
@@ -37,8 +37,7 @@ picture_sys_t *ActivePictureSys(picture_t *p_pic)
 
 #undef D3D9_CreateDevice
 HRESULT D3D9_CreateDevice(vlc_object_t *o, d3d9_handle_t *hd3d, HWND hwnd,
-                          const video_format_t *source, const D3DCAPS9 *caps,
-                          d3d9_device_t *out)
+                          const video_format_t *source, d3d9_device_t *out)
 {
     HRESULT hr;
 
@@ -59,6 +58,32 @@ HRESULT D3D9_CreateDevice(vlc_object_t *o, d3d9_handle_t *hd3d, HWND hwnd,
     }
 #endif
 
+    /*
+    ** Get device capabilities
+    */
+    ZeroMemory(&out->caps, sizeof(out->caps));
+    hr = IDirect3D9_GetDeviceCaps(hd3d->obj, AdapterToUse, DeviceType, &out->caps);
+    if (FAILED(hr)) {
+       msg_Err(o, "Could not read adapter capabilities. (hr=0x%0lx)", hr);
+       return hr;
+    }
+
+    /* TODO: need to test device capabilities and select the right render function */
+    if (!(out->caps.DevCaps2 & D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES)) {
+        msg_Err(o, "Device does not support stretching from textures.");
+        return E_INVALIDARG;
+    }
+
+    if ( source->i_width > out->caps.MaxTextureWidth ||
+         source->i_height > out->caps.MaxTextureHeight )
+    {
+        msg_Err(o, "Textures too large %ux%u max possible: %ux%u",
+                source->i_width, source->i_height,
+                (unsigned) out->caps.MaxTextureWidth,
+                (unsigned) out->caps.MaxTextureHeight);
+        return E_INVALIDARG;
+    }
+
     if (D3D9_FillPresentationParameters(o, hd3d, AdapterToUse, hwnd, source, out))
         return E_INVALIDARG;
 
@@ -72,10 +97,10 @@ HRESULT D3D9_CreateDevice(vlc_object_t *o, d3d9_handle_t *hd3d, HWND hwnd,
     }
 
     DWORD creationFlags = D3DCREATE_MULTITHREADED;
-    if ( (caps->DevCaps & D3DDEVCAPS_DRAWPRIMTLVERTEX) &&
-         (caps->DevCaps & D3DDEVCAPS_HWRASTERIZATION) ) {
+    if ( (out->caps.DevCaps & D3DDEVCAPS_DRAWPRIMTLVERTEX) &&
+         (out->caps.DevCaps & D3DDEVCAPS_HWRASTERIZATION) ) {
         creationFlags |= D3DCREATE_HARDWARE_VERTEXPROCESSING;
-    } else if (caps->DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) {
+    } else if (out->caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) {
         creationFlags |= D3DCREATE_MIXED_VERTEXPROCESSING;
     } else {
         creationFlags |= D3DCREATE_SOFTWARE_VERTEXPROCESSING;
diff --git a/modules/video_chroma/d3d9_fmt.h b/modules/video_chroma/d3d9_fmt.h
index 644c2b7de2..7785ef9a4d 100644
--- a/modules/video_chroma/d3d9_fmt.h
+++ b/modules/video_chroma/d3d9_fmt.h
@@ -55,6 +55,7 @@ typedef struct
     /* creation parameters */
     D3DPRESENT_PARAMETERS   pp;
     UINT                    adapterId;
+    D3DCAPS9                caps;
 } d3d9_device_t;
 
 #include "../codec/avcodec/va_surface.h"
@@ -72,9 +73,8 @@ static inline void ReleasePictureSys(picture_sys_t *p_sys)
 }
 
 HRESULT D3D9_CreateDevice(vlc_object_t *, d3d9_handle_t *, HWND,
-                          const video_format_t *, const D3DCAPS9 *,
-                          d3d9_device_t *out);
-#define D3D9_CreateDevice(a,b,c,d,e,f)  D3D9_CreateDevice(VLC_OBJECT(a),b,c,d,e,f)
+                          const video_format_t *, d3d9_device_t *out);
+#define D3D9_CreateDevice(a,b,c,d,e) D3D9_CreateDevice( VLC_OBJECT(a), b, c, d, e )
 
 int D3D9_FillPresentationParameters(vlc_object_t *, d3d9_handle_t *, UINT AdapterToUse, HWND,
                                     const video_format_t *, d3d9_device_t *out);
diff --git a/modules/video_output/win32/direct3d9.c b/modules/video_output/win32/direct3d9.c
index 9d0dee1b91..55f3de7508 100644
--- a/modules/video_output/win32/direct3d9.c
+++ b/modules/video_output/win32/direct3d9.c
@@ -133,7 +133,6 @@ struct d3dctx
     HINSTANCE               hxdll;      /* handle of the opened d3d9x dll */
     d3d9_handle_t           hd3d;
     d3d9_device_t           d3d_dev;
-    D3DCAPS9                caps;
     HWND                    hwnd;
 };
 
@@ -186,7 +185,7 @@ static picture_pool_t*DisplayPool(vout_display_t *, unsigned);
 static int            Control(vout_display_t *, int, va_list);
 static void           Manage (vout_display_t *);
 
-static int  Direct3D9Create (vlc_object_t *, struct d3dctx *, const video_format_t *);
+static int  Direct3D9Create (vlc_object_t *, struct d3dctx *);
 static int  Direct3D9Reset  (vout_display_t *);
 static void Direct3D9Destroy(vlc_object_t *, struct d3dctx *);
 
@@ -254,7 +253,7 @@ static int Open(vlc_object_t *object)
     if (!sys)
         return VLC_ENOMEM;
 
-    if (Direct3D9Create(VLC_OBJECT(vd), &sys->d3dctx, &vd->fmt)) {
+    if (Direct3D9Create(VLC_OBJECT(vd), &sys->d3dctx)) {
         msg_Err(vd, "Direct3D9 could not be initialized");
         free(sys);
         return VLC_EGENERIC;
@@ -289,11 +288,11 @@ static int Open(vlc_object_t *object)
     info.has_pictures_invalid = !is_d3d9_opaque(fmt.i_chroma);
     if (var_InheritBool(vd, "direct3d9-hw-blending") &&
         sys->d3dregion_format != D3DFMT_UNKNOWN &&
-        (sys->d3dctx.caps.SrcBlendCaps  & D3DPBLENDCAPS_SRCALPHA) &&
-        (sys->d3dctx.caps.DestBlendCaps & D3DPBLENDCAPS_INVSRCALPHA) &&
-        (sys->d3dctx.caps.TextureCaps   & D3DPTEXTURECAPS_ALPHA) &&
-        (sys->d3dctx.caps.TextureOpCaps & D3DTEXOPCAPS_SELECTARG1) &&
-        (sys->d3dctx.caps.TextureOpCaps & D3DTEXOPCAPS_MODULATE))
+        (sys->d3dctx.d3d_dev.caps.SrcBlendCaps  & D3DPBLENDCAPS_SRCALPHA) &&
+        (sys->d3dctx.d3d_dev.caps.DestBlendCaps & D3DPBLENDCAPS_INVSRCALPHA) &&
+        (sys->d3dctx.d3d_dev.caps.TextureCaps   & D3DPTEXTURECAPS_ALPHA) &&
+        (sys->d3dctx.d3d_dev.caps.TextureOpCaps & D3DTEXOPCAPS_SELECTARG1) &&
+        (sys->d3dctx.d3d_dev.caps.TextureOpCaps & D3DTEXOPCAPS_MODULATE))
         info.subpicture_chromas = d3d_subpicture_chromas;
     else
         info.subpicture_chromas = NULL;
@@ -735,7 +734,7 @@ static HINSTANCE Direct3D9LoadShaderLibrary(void)
 /**
  * It initializes an instance of Direct3D9
  */
-static int Direct3D9Create(vlc_object_t *o, struct d3dctx *d3dctx, const video_format_t *fmt)
+static int Direct3D9Create(vlc_object_t *o, struct d3dctx *d3dctx)
 {
     d3dctx->hdll = LoadLibrary(TEXT("D3D9.DLL"));
     if (!d3dctx->hdll) {
@@ -777,32 +776,6 @@ static int Direct3D9Create(vlc_object_t *o, struct d3dctx *d3dctx, const video_f
     if (!d3dctx->hxdll)
         msg_Warn(o, "cannot load Direct3D9 Shader Library; HLSL pixel shading will be disabled.");
 
-    /*
-    ** Get device capabilities
-    */
-    ZeroMemory(&d3dctx->caps, sizeof(d3dctx->caps));
-    HRESULT hr = IDirect3D9_GetDeviceCaps(d3dctx->hd3d.obj, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &d3dctx->caps);
-    if (FAILED(hr)) {
-       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 (!(d3dctx->caps.DevCaps2 & D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES)) {
-        msg_Err(o, "Device does not support stretching from textures.");
-        goto error;
-    }
-
-    if ( fmt->i_width > d3dctx->caps.MaxTextureWidth ||
-         fmt->i_height > d3dctx->caps.MaxTextureHeight )
-    {
-        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);
@@ -851,7 +824,7 @@ static int Direct3D9Open(vout_display_t *vd, video_format_t *fmt)
     sys->d3dctx.hwnd = sys->sys.hvideownd;
 
     if (FAILED(D3D9_CreateDevice(vd, &sys->d3dctx.hd3d, sys->d3dctx.hwnd,
-                                 &vd->source, &sys->d3dctx.caps, &sys->d3dctx.d3d_dev)))
+                                 &vd->source, &sys->d3dctx.d3d_dev)))
         return VLC_EGENERIC;
 
     const d3d9_device_t *p_d3d9_dev = &sys->d3dctx.d3d_dev;
@@ -1157,14 +1130,14 @@ static int Direct3D9CreateScene(vout_display_t *vd, const video_format_t *fmt)
     IDirect3DDevice9_SetSamplerState(d3ddev, 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
 
     // Set linear filtering quality
-    if (sys->d3dctx.caps.TextureFilterCaps & D3DPTFILTERCAPS_MINFLINEAR) {
+    if (sys->d3dctx.d3d_dev.caps.TextureFilterCaps & D3DPTFILTERCAPS_MINFLINEAR) {
         //msg_Dbg(vd, "Using D3DTEXF_LINEAR for minification");
         IDirect3DDevice9_SetSamplerState(d3ddev, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
     } else {
         //msg_Dbg(vd, "Using D3DTEXF_POINT for minification");
         IDirect3DDevice9_SetSamplerState(d3ddev, 0, D3DSAMP_MINFILTER, D3DTEXF_POINT);
     }
-    if (sys->d3dctx.caps.TextureFilterCaps & D3DPTFILTERCAPS_MAGFLINEAR) {
+    if (sys->d3dctx.d3d_dev.caps.TextureFilterCaps & D3DPTFILTERCAPS_MAGFLINEAR) {
         //msg_Dbg(vd, "Using D3DTEXF_LINEAR for magnification");
         IDirect3DDevice9_SetSamplerState(d3ddev, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
     } else {
@@ -1195,7 +1168,7 @@ static int Direct3D9CreateScene(vout_display_t *vd, const video_format_t *fmt)
     IDirect3DDevice9_SetRenderState(d3ddev, D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
     IDirect3DDevice9_SetRenderState(d3ddev, D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
 
-    if (sys->d3dctx.caps.AlphaCmpCaps & D3DPCMPCAPS_GREATER) {
+    if (sys->d3dctx.d3d_dev.caps.AlphaCmpCaps & D3DPCMPCAPS_GREATER) {
         IDirect3DDevice9_SetRenderState(d3ddev, D3DRS_ALPHATESTENABLE,TRUE);
         IDirect3DDevice9_SetRenderState(d3ddev, D3DRS_ALPHAREF, 0x00);
         IDirect3DDevice9_SetRenderState(d3ddev, D3DRS_ALPHAFUNC,D3DCMP_GREATER);
@@ -2049,7 +2022,7 @@ GLConvOpen(vlc_object_t *obj)
     priv->vt = vt;
 
     priv->d3dctx = (struct d3dctx) { .hwnd = tc->gl->surface->handle.hwnd };
-    if (Direct3D9Create(obj, &priv->d3dctx, &tc->fmt) != VLC_SUCCESS)
+    if (Direct3D9Create(obj, &priv->d3dctx) != VLC_SUCCESS)
         goto error;
 
     if (!priv->d3dctx.hd3d.use_ex)
@@ -2059,7 +2032,7 @@ GLConvOpen(vlc_object_t *obj)
     }
 
     if (FAILED(D3D9_CreateDevice(obj, &priv->d3dctx.hd3d, priv->d3dctx.hwnd,
-                                 &tc->fmt, &priv->d3dctx.caps, &priv->d3dctx.d3d_dev)))
+                                 &tc->fmt, &priv->d3dctx.d3d_dev)))
         goto error;
 
     HRESULT hr;
-- 
2.14.2



More information about the vlc-devel mailing list