[vlc-devel] [PATCH 2/2] direct3d11: move the common code in C file rather than inline and use a static lib

Steve Lhomme robux4 at videolabs.io
Wed Nov 15 10:37:11 CET 2017


Also move some code from dxgi_fmt to d3d11_fmt
---
 modules/codec/Makefile.am            |   8 +-
 modules/video_chroma/Makefile.am     |   5 +-
 modules/video_chroma/d3d11_fmt.c     | 290 +++++++++++++++++++++++++++++++++++
 modules/video_chroma/d3d11_fmt.h     | 181 +++-------------------
 modules/video_chroma/d3d11_surface.c |   3 +-
 modules/video_chroma/dxgi_fmt.c      |  52 -------
 modules/video_chroma/dxgi_fmt.h      |  52 +------
 modules/video_output/Makefile.am     |  15 +-
 8 files changed, 333 insertions(+), 273 deletions(-)
 create mode 100644 modules/video_chroma/d3d11_fmt.c

diff --git a/modules/codec/Makefile.am b/modules/codec/Makefile.am
index 5f4f477bbf..f41985d27c 100644
--- a/modules/codec/Makefile.am
+++ b/modules/codec/Makefile.am
@@ -428,13 +428,17 @@ if HAVE_AVCODEC_DXVA2
 codec_LTLIBRARIES += libdxva2_plugin.la
 endif
 
+libd3d11_common_la_SOURCES = video_chroma/d3d11_fmt.c video_chroma/d3d11_fmt.h \
+	video_chroma/dxgi_fmt.c video_chroma/dxgi_fmt.h
+libd3d11_common_la_LDFLAGS = -static
+noinst_LTLIBRARIES += libd3d11_common.la
+
 libd3d11va_plugin_la_SOURCES = \
 	codec/avcodec/d3d11va.c codec/avcodec/directx_va.c codec/avcodec/directx_va.h \
         codec/avcodec/va_surface.c codec/avcodec/va_surface.h codec/avcodec/va_surface_internal.h \
-	video_chroma/d3d11_fmt.h video_chroma/dxgi_fmt.c video_chroma/dxgi_fmt.h \
 	packetizer/h264_nal.c packetizer/h264_nal.h \
 	packetizer/hevc_nal.c packetizer/hevc_nal.h
-libd3d11va_plugin_la_LIBADD = $(LIBCOM) -luuid
+libd3d11va_plugin_la_LIBADD = libd3d11_common.la $(LIBCOM) -luuid
 if HAVE_WINSTORE
 libd3d11va_plugin_la_LIBADD += -ld3d11
 endif
diff --git a/modules/video_chroma/Makefile.am b/modules/video_chroma/Makefile.am
index 500ca6c497..27b472f363 100644
--- a/modules/video_chroma/Makefile.am
+++ b/modules/video_chroma/Makefile.am
@@ -128,9 +128,8 @@ chroma_LTLIBRARIES += \
 endif
 
 # D3D11VA
-libd3d11_surface_plugin_la_SOURCES = video_chroma/d3d11_surface.c \
-	video_chroma/d3d11_fmt.h video_chroma/dxgi_fmt.c video_chroma/dxgi_fmt.h
-libd3d11_surface_plugin_la_LIBADD = libchroma_copy.la
+libd3d11_surface_plugin_la_SOURCES = video_chroma/d3d11_surface.c
+libd3d11_surface_plugin_la_LIBADD = libchroma_copy.la libd3d11_common.la
 
 if HAVE_AVCODEC_D3D11VA
 chroma_LTLIBRARIES += \
diff --git a/modules/video_chroma/d3d11_fmt.c b/modules/video_chroma/d3d11_fmt.c
new file mode 100644
index 0000000000..a59a3cf8dc
--- /dev/null
+++ b/modules/video_chroma/d3d11_fmt.c
@@ -0,0 +1,290 @@
+/*****************************************************************************
+ * d3d11_fmt.c : D3D11 helper calls
+ *****************************************************************************
+ * Copyright © 2017 VLC authors, VideoLAN and VideoLabs
+ *
+ * Authors: Steve Lhomme <robux4 at gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <vlc_common.h>
+#include <vlc_picture.h>
+
+#define COBJMACROS
+#include <d3d11.h>
+#include <assert.h>
+
+#include "d3d11_fmt.h"
+
+#include "../codec/avcodec/va_surface.h"
+
+picture_sys_t *ActivePictureSys(picture_t *p_pic)
+{
+    struct va_pic_context *pic_ctx = (struct va_pic_context*)p_pic->context;
+    return pic_ctx ? &pic_ctx->picsys : p_pic->p_sys;
+}
+
+/* index to use for texture/resource that use a known DXGI format
+ * (ie not DXGI_FORMAT_UNKNWON) */
+#define KNOWN_DXGI_INDEX   0
+
+void AcquirePictureSys(picture_sys_t *p_sys)
+{
+    for (int i=0; i<D3D11_MAX_SHADER_VIEW; i++) {
+        if (p_sys->resourceView[i])
+            ID3D11ShaderResourceView_AddRef(p_sys->resourceView[i]);
+        if (p_sys->texture[i])
+            ID3D11Texture2D_AddRef(p_sys->texture[i]);
+    }
+    if (p_sys->context)
+        ID3D11DeviceContext_AddRef(p_sys->context);
+    if (p_sys->decoder)
+        ID3D11VideoDecoderOutputView_AddRef(p_sys->decoder);
+    if (p_sys->processorInput)
+        ID3D11VideoProcessorInputView_AddRef(p_sys->processorInput);
+    if (p_sys->processorOutput)
+        ID3D11VideoProcessorOutputView_AddRef(p_sys->processorOutput);
+}
+
+void ReleasePictureSys(picture_sys_t *p_sys)
+{
+    for (int i=0; i<D3D11_MAX_SHADER_VIEW; i++) {
+        if (p_sys->resourceView[i])
+            ID3D11ShaderResourceView_Release(p_sys->resourceView[i]);
+        if (p_sys->texture[i])
+            ID3D11Texture2D_Release(p_sys->texture[i]);
+    }
+    if (p_sys->context)
+        ID3D11DeviceContext_Release(p_sys->context);
+    if (p_sys->decoder)
+        ID3D11VideoDecoderOutputView_Release(p_sys->decoder);
+    if (p_sys->processorInput)
+        ID3D11VideoProcessorInputView_Release(p_sys->processorInput);
+    if (p_sys->processorOutput)
+        ID3D11VideoProcessorOutputView_Release(p_sys->processorOutput);
+}
+
+/* map texture planes to resource views */
+int AllocateShaderView(vlc_object_t *obj, ID3D11Device *d3ddevice,
+                              const d3d_format_t *format,
+                              ID3D11Texture2D *p_texture[D3D11_MAX_SHADER_VIEW], UINT slice_index,
+                              ID3D11ShaderResourceView *resourceView[D3D11_MAX_SHADER_VIEW])
+{
+    HRESULT hr;
+    int i;
+    D3D11_SHADER_RESOURCE_VIEW_DESC resviewDesc = { 0 };
+    D3D11_TEXTURE2D_DESC texDesc;
+    ID3D11Texture2D_GetDesc(p_texture[0], &texDesc);
+    assert(texDesc.BindFlags & D3D11_BIND_SHADER_RESOURCE);
+
+    if (texDesc.ArraySize == 1)
+    {
+        resviewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
+        resviewDesc.Texture2D.MipLevels = 1;
+    }
+    else
+    {
+        resviewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
+        resviewDesc.Texture2DArray.MipLevels = -1;
+        resviewDesc.Texture2DArray.ArraySize = 1;
+        resviewDesc.Texture2DArray.FirstArraySlice = slice_index;
+    }
+    for (i=0; i<D3D11_MAX_SHADER_VIEW; i++)
+    {
+        resviewDesc.Format = format->resourceFormat[i];
+        if (resviewDesc.Format == DXGI_FORMAT_UNKNOWN)
+            resourceView[i] = NULL;
+        else
+        {
+            hr = ID3D11Device_CreateShaderResourceView(d3ddevice, (ID3D11Resource*)p_texture[i], &resviewDesc, &resourceView[i]);
+            if (FAILED(hr)) {
+                msg_Err(obj, "Could not Create the Texture ResourceView %d slice %d. (hr=0x%lX)", i, slice_index, hr);
+                break;
+            }
+        }
+    }
+
+    if (i != D3D11_MAX_SHADER_VIEW)
+    {
+        while (--i >= 0)
+        {
+            ID3D11ShaderResourceView_Release(resourceView[i]);
+            resourceView[i] = NULL;
+        }
+        return VLC_EGENERIC;
+    }
+
+    return VLC_SUCCESS;
+}
+
+HRESULT D3D11_CreateDevice(vlc_object_t *obj, HINSTANCE hdecoder_dll,
+                                         bool hw_decoding,
+                                         ID3D11Device **pp_d3ddevice,
+                                         ID3D11DeviceContext **pp_d3dcontext)
+{
+#if !VLC_WINSTORE_APP
+# define D3D11CreateDevice(args...)             pf_CreateDevice(args)
+    /* */
+    PFN_D3D11_CREATE_DEVICE pf_CreateDevice;
+    pf_CreateDevice = (void *)GetProcAddress(hdecoder_dll, "D3D11CreateDevice");
+    if (!pf_CreateDevice) {
+        msg_Err(obj, "Cannot locate reference to D3D11CreateDevice ABI in DLL");
+        return E_NOINTERFACE;
+    }
+#endif
+
+    HRESULT hr = E_NOTIMPL;
+    UINT creationFlags = 0;
+
+    if (hw_decoding)
+        creationFlags |= D3D11_CREATE_DEVICE_VIDEO_SUPPORT;
+
+#if !defined(NDEBUG)
+# if !VLC_WINSTORE_APP
+    if (IsDebuggerPresent())
+# endif
+    {
+        HINSTANCE sdklayer_dll = LoadLibrary(TEXT("d3d11_1sdklayers.dll"));
+        if (sdklayer_dll) {
+            creationFlags |= D3D11_CREATE_DEVICE_DEBUG;
+            FreeLibrary(sdklayer_dll);
+        }
+    }
+#endif
+
+    static const D3D_DRIVER_TYPE driverAttempts[] = {
+        D3D_DRIVER_TYPE_HARDWARE,
+#if 0 /* ifndef NDEBUG */
+        D3D_DRIVER_TYPE_REFERENCE,
+#endif
+    };
+
+    static D3D_FEATURE_LEVEL D3D11_features[] = {
+        D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0,
+        D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0,
+        D3D_FEATURE_LEVEL_9_3, D3D_FEATURE_LEVEL_9_2, D3D_FEATURE_LEVEL_9_1
+    };
+
+    for (UINT driver = 0; driver < ARRAY_SIZE(driverAttempts); driver++) {
+        D3D_FEATURE_LEVEL i_feature_level;
+        hr = D3D11CreateDevice(NULL, driverAttempts[driver], NULL, creationFlags,
+                    D3D11_features, ARRAY_SIZE(D3D11_features), D3D11_SDK_VERSION,
+                    pp_d3ddevice, &i_feature_level, pp_d3dcontext);
+        if (SUCCEEDED(hr)) {
+#ifndef NDEBUG
+            msg_Dbg(obj, "Created the D3D11 device 0x%p ctx 0x%p type %d level %x.",
+                    (void *)*pp_d3ddevice, (void *)*pp_d3dcontext,
+                    driverAttempts[driver], i_feature_level);
+#endif
+            /* we can work with legacy levels but only if forced */
+            if ( obj->obj.force || i_feature_level >= D3D_FEATURE_LEVEL_11_0 )
+                break;
+            msg_Dbg(obj, "Incompatible feature level %x", i_feature_level);
+            ID3D11DeviceContext_Release(*pp_d3dcontext);
+            *pp_d3dcontext = NULL;
+            ID3D11Device_Release(*pp_d3ddevice);
+            *pp_d3ddevice = NULL;
+            hr = E_NOTIMPL;
+        }
+    }
+    return hr;
+}
+
+IDXGIAdapter *D3D11DeviceAdapter(ID3D11Device *d3ddev)
+{
+    IDXGIDevice *pDXGIDevice = NULL;
+    HRESULT hr = ID3D11Device_QueryInterface(d3ddev, &IID_IDXGIDevice, (void **)&pDXGIDevice);
+    if (FAILED(hr)) {
+        return NULL;
+    }
+
+    IDXGIAdapter *p_adapter;
+    hr = IDXGIDevice_GetAdapter(pDXGIDevice, &p_adapter);
+    IDXGIDevice_Release(pDXGIDevice);
+    if (FAILED(hr)) {
+        return NULL;
+    }
+    return p_adapter;
+}
+
+bool isXboxHardware(ID3D11Device *d3ddev)
+{
+    IDXGIAdapter *p_adapter = D3D11DeviceAdapter(d3ddev);
+    if (!p_adapter)
+        return NULL;
+
+    bool result = false;
+    DXGI_ADAPTER_DESC adapterDesc;
+    if (SUCCEEDED(IDXGIAdapter_GetDesc(p_adapter, &adapterDesc))) {
+        if (adapterDesc.VendorId == 0 &&
+            adapterDesc.DeviceId == 0 &&
+            !wcscmp(L"ROOT\\SraKmd\\0000", adapterDesc.Description))
+            result = true;
+    }
+
+    IDXGIAdapter_Release(p_adapter);
+    return result;
+}
+
+bool isNvidiaHardware(ID3D11Device *d3ddev)
+{
+    IDXGIAdapter *p_adapter = D3D11DeviceAdapter(d3ddev);
+    if (!p_adapter)
+        return NULL;
+
+    bool result = false;
+    DXGI_ADAPTER_DESC adapterDesc;
+    if (SUCCEEDED(IDXGIAdapter_GetDesc(p_adapter, &adapterDesc))) {
+        result = adapterDesc.VendorId == 0x10DE;
+    }
+
+    IDXGIAdapter_Release(p_adapter);
+    return result;
+}
+
+const d3d_format_t *FindD3D11Format(ID3D11Device *d3ddevice,
+                                    vlc_fourcc_t i_src_chroma,
+                                    uint8_t bits_per_channel,
+                                    bool allow_opaque,
+                                    UINT supportFlags)
+{
+    supportFlags |= D3D11_FORMAT_SUPPORT_TEXTURE2D;
+    for (const d3d_format_t *output_format = GetRenderFormatList();
+         output_format->name != NULL; ++output_format)
+    {
+        if (i_src_chroma && i_src_chroma != output_format->fourcc)
+            continue;
+        if (bits_per_channel && bits_per_channel > output_format->bitsPerChannel)
+            continue;
+        if (!allow_opaque && (output_format->fourcc == VLC_CODEC_D3D11_OPAQUE ||
+                              output_format->fourcc == VLC_CODEC_D3D11_OPAQUE_10B))
+            continue;
+
+        DXGI_FORMAT textureFormat;
+        if (output_format->formatTexture == DXGI_FORMAT_UNKNOWN)
+            textureFormat = output_format->resourceFormat[0];
+        else
+            textureFormat = output_format->formatTexture;
+
+        if( DeviceSupportsFormat( d3ddevice, textureFormat, supportFlags ) )
+            return output_format;
+    }
+    return NULL;
+}
diff --git a/modules/video_chroma/d3d11_fmt.h b/modules/video_chroma/d3d11_fmt.h
index a41a9c0631..ee66ca6222 100644
--- a/modules/video_chroma/d3d11_fmt.h
+++ b/modules/video_chroma/d3d11_fmt.h
@@ -23,10 +23,7 @@
 #ifndef VLC_VIDEOCHROMA_D3D11_FMT_H_
 #define VLC_VIDEOCHROMA_D3D11_FMT_H_
 
-#include <vlc_picture.h>
-
 #include <d3d11.h>
-#include <assert.h>
 
 #include "dxgi_fmt.h"
 
@@ -50,176 +47,44 @@ struct picture_sys_t
 
 #include "../codec/avcodec/va_surface.h"
 
-static inline picture_sys_t *ActivePictureSys(picture_t *p_pic)
-{
-    struct va_pic_context *pic_ctx = (struct va_pic_context*)p_pic->context;
-    return pic_ctx ? &pic_ctx->picsys : p_pic->p_sys;
-}
+picture_sys_t *ActivePictureSys(picture_t *p_pic);
 
 /* index to use for texture/resource that use a known DXGI format
  * (ie not DXGI_FORMAT_UNKNWON) */
 #define KNOWN_DXGI_INDEX   0
 
-static inline void AcquirePictureSys(picture_sys_t *p_sys)
-{
-    for (int i=0; i<D3D11_MAX_SHADER_VIEW; i++) {
-        if (p_sys->resourceView[i])
-            ID3D11ShaderResourceView_AddRef(p_sys->resourceView[i]);
-        if (p_sys->texture[i])
-            ID3D11Texture2D_AddRef(p_sys->texture[i]);
-    }
-    if (p_sys->context)
-        ID3D11DeviceContext_AddRef(p_sys->context);
-    if (p_sys->decoder)
-        ID3D11VideoDecoderOutputView_AddRef(p_sys->decoder);
-    if (p_sys->processorInput)
-        ID3D11VideoProcessorInputView_AddRef(p_sys->processorInput);
-    if (p_sys->processorOutput)
-        ID3D11VideoProcessorOutputView_AddRef(p_sys->processorOutput);
-}
+void AcquirePictureSys(picture_sys_t *p_sys);
 
-static inline void ReleasePictureSys(picture_sys_t *p_sys)
-{
-    for (int i=0; i<D3D11_MAX_SHADER_VIEW; i++) {
-        if (p_sys->resourceView[i])
-            ID3D11ShaderResourceView_Release(p_sys->resourceView[i]);
-        if (p_sys->texture[i])
-            ID3D11Texture2D_Release(p_sys->texture[i]);
-    }
-    if (p_sys->context)
-        ID3D11DeviceContext_Release(p_sys->context);
-    if (p_sys->decoder)
-        ID3D11VideoDecoderOutputView_Release(p_sys->decoder);
-    if (p_sys->processorInput)
-        ID3D11VideoProcessorInputView_Release(p_sys->processorInput);
-    if (p_sys->processorOutput)
-        ID3D11VideoProcessorOutputView_Release(p_sys->processorOutput);
-}
+void ReleasePictureSys(picture_sys_t *p_sys);
 
 /* map texture planes to resource views */
-static inline int AllocateShaderView(vlc_object_t *obj, ID3D11Device *d3ddevice,
+int AllocateShaderView(vlc_object_t *obj, ID3D11Device *d3ddevice,
                               const d3d_format_t *format,
                               ID3D11Texture2D *p_texture[D3D11_MAX_SHADER_VIEW], UINT slice_index,
-                              ID3D11ShaderResourceView *resourceView[D3D11_MAX_SHADER_VIEW])
-{
-    HRESULT hr;
-    int i;
-    D3D11_SHADER_RESOURCE_VIEW_DESC resviewDesc = { 0 };
-    D3D11_TEXTURE2D_DESC texDesc;
-    ID3D11Texture2D_GetDesc(p_texture[0], &texDesc);
-    assert(texDesc.BindFlags & D3D11_BIND_SHADER_RESOURCE);
-
-    if (texDesc.ArraySize == 1)
-    {
-        resviewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
-        resviewDesc.Texture2D.MipLevels = 1;
-    }
-    else
-    {
-        resviewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
-        resviewDesc.Texture2DArray.MipLevels = -1;
-        resviewDesc.Texture2DArray.ArraySize = 1;
-        resviewDesc.Texture2DArray.FirstArraySlice = slice_index;
-    }
-    for (i=0; i<D3D11_MAX_SHADER_VIEW; i++)
-    {
-        resviewDesc.Format = format->resourceFormat[i];
-        if (resviewDesc.Format == DXGI_FORMAT_UNKNOWN)
-            resourceView[i] = NULL;
-        else
-        {
-            hr = ID3D11Device_CreateShaderResourceView(d3ddevice, (ID3D11Resource*)p_texture[i], &resviewDesc, &resourceView[i]);
-            if (FAILED(hr)) {
-                msg_Err(obj, "Could not Create the Texture ResourceView %d slice %d. (hr=0x%lX)", i, slice_index, hr);
-                break;
-            }
-        }
-    }
-
-    if (i != D3D11_MAX_SHADER_VIEW)
-    {
-        while (--i >= 0)
-        {
-            ID3D11ShaderResourceView_Release(resourceView[i]);
-            resourceView[i] = NULL;
-        }
-        return VLC_EGENERIC;
-    }
-
-    return VLC_SUCCESS;
-}
+                              ID3D11ShaderResourceView *resourceView[D3D11_MAX_SHADER_VIEW]);
 
-static inline HRESULT D3D11_CreateDevice(vlc_object_t *obj, HINSTANCE hdecoder_dll,
+HRESULT D3D11_CreateDevice(vlc_object_t *obj, HINSTANCE hdecoder_dll,
                                          bool hw_decoding,
                                          ID3D11Device **pp_d3ddevice,
-                                         ID3D11DeviceContext **pp_d3dcontext)
-{
-#if !VLC_WINSTORE_APP
-# define D3D11CreateDevice(args...)             pf_CreateDevice(args)
-    /* */
-    PFN_D3D11_CREATE_DEVICE pf_CreateDevice;
-    pf_CreateDevice = (void *)GetProcAddress(hdecoder_dll, "D3D11CreateDevice");
-    if (!pf_CreateDevice) {
-        msg_Err(obj, "Cannot locate reference to D3D11CreateDevice ABI in DLL");
-        return E_NOINTERFACE;
-    }
-#endif
-
-    HRESULT hr = E_NOTIMPL;
-    UINT creationFlags = 0;
-
-    if (hw_decoding)
-        creationFlags |= D3D11_CREATE_DEVICE_VIDEO_SUPPORT;
-
-#if !defined(NDEBUG)
-# if !VLC_WINSTORE_APP
-    if (IsDebuggerPresent())
-# endif
-    {
-        HINSTANCE sdklayer_dll = LoadLibrary(TEXT("d3d11_1sdklayers.dll"));
-        if (sdklayer_dll) {
-            creationFlags |= D3D11_CREATE_DEVICE_DEBUG;
-            FreeLibrary(sdklayer_dll);
-        }
-    }
-#endif
-
-    static const D3D_DRIVER_TYPE driverAttempts[] = {
-        D3D_DRIVER_TYPE_HARDWARE,
-#if 0 /* ifndef NDEBUG */
-        D3D_DRIVER_TYPE_REFERENCE,
-#endif
-    };
+                                         ID3D11DeviceContext **pp_d3dcontext);
 
-    static D3D_FEATURE_LEVEL D3D11_features[] = {
-        D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0,
-        D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0,
-        D3D_FEATURE_LEVEL_9_3, D3D_FEATURE_LEVEL_9_2, D3D_FEATURE_LEVEL_9_1
-    };
+bool isXboxHardware(ID3D11Device *d3ddev);
+bool isNvidiaHardware(ID3D11Device *d3ddev);
+IDXGIAdapter *D3D11DeviceAdapter(ID3D11Device *d3ddev);
 
-    for (UINT driver = 0; driver < ARRAY_SIZE(driverAttempts); driver++) {
-        D3D_FEATURE_LEVEL i_feature_level;
-        hr = D3D11CreateDevice(NULL, driverAttempts[driver], NULL, creationFlags,
-                    D3D11_features, ARRAY_SIZE(D3D11_features), D3D11_SDK_VERSION,
-                    pp_d3ddevice, &i_feature_level, pp_d3dcontext);
-        if (SUCCEEDED(hr)) {
-#ifndef NDEBUG
-            msg_Dbg(obj, "Created the D3D11 device 0x%p ctx 0x%p type %d level %x.",
-                    (void *)*pp_d3ddevice, (void *)*pp_d3dcontext,
-                    driverAttempts[driver], i_feature_level);
-#endif
-            /* we can work with legacy levels but only if forced */
-            if ( obj->obj.force || i_feature_level >= D3D_FEATURE_LEVEL_11_0 )
-                break;
-            msg_Dbg(obj, "Incompatible feature level %x", i_feature_level);
-            ID3D11DeviceContext_Release(*pp_d3dcontext);
-            *pp_d3dcontext = NULL;
-            ID3D11Device_Release(*pp_d3ddevice);
-            *pp_d3ddevice = NULL;
-            hr = E_NOTIMPL;
-        }
-    }
-    return hr;
+static inline bool DeviceSupportsFormat(ID3D11Device *d3ddevice,
+                                        DXGI_FORMAT format, UINT supportFlags)
+{
+    UINT i_formatSupport;
+    return SUCCEEDED( ID3D11Device_CheckFormatSupport(d3ddevice, format,
+                                                      &i_formatSupport) )
+            && ( i_formatSupport & supportFlags ) == supportFlags;
 }
 
+const d3d_format_t *FindD3D11Format(ID3D11Device *d3ddevice,
+                                                  vlc_fourcc_t i_src_chroma,
+                                                  uint8_t bits_per_channel,
+                                                  bool allow_opaque,
+                                                  UINT supportFlags);
+
 #endif /* include-guard */
diff --git a/modules/video_chroma/d3d11_surface.c b/modules/video_chroma/d3d11_surface.c
index d2b5ad15e4..076dcd23e7 100644
--- a/modules/video_chroma/d3d11_surface.c
+++ b/modules/video_chroma/d3d11_surface.c
@@ -34,8 +34,9 @@
 #include <vlc_picture.h>
 #include <vlc_modules.h>
 
-#include "copy.h"
+#include <assert.h>
 
+#include "copy.h"
 
 #include <windows.h>
 #define COBJMACROS
diff --git a/modules/video_chroma/dxgi_fmt.c b/modules/video_chroma/dxgi_fmt.c
index 7e1b60cee0..29bd446769 100644
--- a/modules/video_chroma/dxgi_fmt.c
+++ b/modules/video_chroma/dxgi_fmt.c
@@ -128,55 +128,3 @@ void DxgiFormatMask(DXGI_FORMAT format, video_format_t *fmt)
         fmt->i_bmask = 0xff000000;
     }
 }
-
-IDXGIAdapter *D3D11DeviceAdapter(ID3D11Device *d3ddev)
-{
-    IDXGIDevice *pDXGIDevice = NULL;
-    HRESULT hr = ID3D11Device_QueryInterface(d3ddev, &IID_IDXGIDevice, (void **)&pDXGIDevice);
-    if (FAILED(hr)) {
-        return NULL;
-    }
-
-    IDXGIAdapter *p_adapter;
-    hr = IDXGIDevice_GetAdapter(pDXGIDevice, &p_adapter);
-    IDXGIDevice_Release(pDXGIDevice);
-    if (FAILED(hr)) {
-        return NULL;
-    }
-    return p_adapter;
-}
-
-bool isXboxHardware(ID3D11Device *d3ddev)
-{
-    IDXGIAdapter *p_adapter = D3D11DeviceAdapter(d3ddev);
-    if (!p_adapter)
-        return NULL;
-
-    bool result = false;
-    DXGI_ADAPTER_DESC adapterDesc;
-    if (SUCCEEDED(IDXGIAdapter_GetDesc(p_adapter, &adapterDesc))) {
-        if (adapterDesc.VendorId == 0 &&
-            adapterDesc.DeviceId == 0 &&
-            !wcscmp(L"ROOT\\SraKmd\\0000", adapterDesc.Description))
-            result = true;
-    }
-
-    IDXGIAdapter_Release(p_adapter);
-    return result;
-}
-
-bool isNvidiaHardware(ID3D11Device *d3ddev)
-{
-    IDXGIAdapter *p_adapter = D3D11DeviceAdapter(d3ddev);
-    if (!p_adapter)
-        return NULL;
-
-    bool result = false;
-    DXGI_ADAPTER_DESC adapterDesc;
-    if (SUCCEEDED(IDXGIAdapter_GetDesc(p_adapter, &adapterDesc))) {
-        result = adapterDesc.VendorId == 0x10DE;
-    }
-
-    IDXGIAdapter_Release(p_adapter);
-    return result;
-}
diff --git a/modules/video_chroma/dxgi_fmt.h b/modules/video_chroma/dxgi_fmt.h
index 8e8cdb5e5b..4961cd4a08 100644
--- a/modules/video_chroma/dxgi_fmt.h
+++ b/modules/video_chroma/dxgi_fmt.h
@@ -42,53 +42,9 @@ typedef struct
     DXGI_FORMAT  resourceFormat[D3D11_MAX_SHADER_VIEW];
 } d3d_format_t;
 
-extern const char *DxgiFormatToStr(DXGI_FORMAT format);
-extern vlc_fourcc_t DxgiFormatFourcc(DXGI_FORMAT format);
-extern const d3d_format_t *GetRenderFormatList(void);
-extern void DxgiFormatMask(DXGI_FORMAT format, video_format_t *);
-
-typedef struct ID3D11Device ID3D11Device;
-bool isXboxHardware(ID3D11Device *d3ddev);
-bool isNvidiaHardware(ID3D11Device *d3ddev);
-IDXGIAdapter *D3D11DeviceAdapter(ID3D11Device *d3ddev);
-
-static inline bool DeviceSupportsFormat(ID3D11Device *d3ddevice,
-                                        DXGI_FORMAT format, UINT supportFlags)
-{
-    UINT i_formatSupport;
-    return SUCCEEDED( ID3D11Device_CheckFormatSupport(d3ddevice, format,
-                                                      &i_formatSupport) )
-            && ( i_formatSupport & supportFlags ) == supportFlags;
-}
-
-static inline const d3d_format_t *FindD3D11Format(ID3D11Device *d3ddevice,
-                                                  vlc_fourcc_t i_src_chroma,
-                                                  uint8_t bits_per_channel,
-                                                  bool allow_opaque,
-                                                  UINT supportFlags)
-{
-    supportFlags |= D3D11_FORMAT_SUPPORT_TEXTURE2D;
-    for (const d3d_format_t *output_format = GetRenderFormatList();
-         output_format->name != NULL; ++output_format)
-    {
-        if (i_src_chroma && i_src_chroma != output_format->fourcc)
-            continue;
-        if (bits_per_channel && bits_per_channel > output_format->bitsPerChannel)
-            continue;
-        if (!allow_opaque && (output_format->fourcc == VLC_CODEC_D3D11_OPAQUE ||
-                              output_format->fourcc == VLC_CODEC_D3D11_OPAQUE_10B))
-            continue;
-
-        DXGI_FORMAT textureFormat;
-        if (output_format->formatTexture == DXGI_FORMAT_UNKNOWN)
-            textureFormat = output_format->resourceFormat[0];
-        else
-            textureFormat = output_format->formatTexture;
-
-        if( DeviceSupportsFormat( d3ddevice, textureFormat, supportFlags ) )
-            return output_format;
-    }
-    return NULL;
-}
+const char *DxgiFormatToStr(DXGI_FORMAT format);
+vlc_fourcc_t DxgiFormatFourcc(DXGI_FORMAT format);
+const d3d_format_t *GetRenderFormatList(void);
+void DxgiFormatMask(DXGI_FORMAT format, video_format_t *);
 
 #endif /* include-guard */
diff --git a/modules/video_output/Makefile.am b/modules/video_output/Makefile.am
index 786d6e3261..279d4a5d87 100644
--- a/modules/video_output/Makefile.am
+++ b/modules/video_output/Makefile.am
@@ -263,8 +263,7 @@ libdirect3d9_deinterlace_plugin_la_SOURCES = video_output/win32/dxva2_deinterlac
         video_chroma/d3d9_fmt.h
 libdirect3d9_deinterlace_plugin_la_LIBADD = $(LIBCOM) libdeinterlace_common.la
 libdirect3d9_deinterlace_plugin_la_LDFLAGS = $(AM_LDFLAGS) -rpath '$(voutdir)'
-libdirect3d9_adjust_plugin_la_SOURCES = video_output/win32/d3d9_adjust.c \
-  video_chroma/dxgi_fmt.c video_chroma/dxgi_fmt.h
+libdirect3d9_adjust_plugin_la_SOURCES = video_output/win32/d3d9_adjust.c
 libdirect3d9_adjust_plugin_la_LDFLAGS = $(AM_LDFLAGS) -rpath '$(voutdir)'
 libdirect3d9_adjust_plugin_la_LIBADD = $(LIBCOM)
 if HAVE_WIN32_DESKTOP
@@ -274,11 +273,10 @@ EXTRA_LTLIBRARIES += libdirect3d9_plugin.la libdirect3d9_deinterlace_plugin.la l
 endif
 
 libdirect3d11_plugin_la_SOURCES = video_output/win32/direct3d11.c \
- video_chroma/d3d11_fmt.h video_chroma/dxgi_fmt.c video_chroma/dxgi_fmt.h \
  video_output/win32/common.c video_output/win32/common.h
 libdirect3d11_plugin_la_CPPFLAGS = $(AM_CPPFLAGS) \
  -DMODULE_NAME_IS_direct3d11
-libdirect3d11_plugin_la_LIBADD = libchroma_copy.la $(LIBCOM) -luuid
+libdirect3d11_plugin_la_LIBADD = libchroma_copy.la libd3d11_common.la $(LIBCOM) -luuid
 if !HAVE_WINSTORE
 libdirect3d11_plugin_la_SOURCES += video_output/win32/events.c \
  video_output/win32/events.h \
@@ -292,13 +290,12 @@ libdirect3d11_plugin_la_LDFLAGS = $(AM_LDFLAGS) -rpath '$(voutdir)'
 vout_LTLIBRARIES += $(LTLIBdirect3d11)
 EXTRA_LTLIBRARIES += libdirect3d11_plugin.la
 
-libdirect3d11_deinterlace_plugin_la_SOURCES = video_output/win32/d3d11_deinterlace.c \
-  video_chroma/dxgi_fmt.c video_chroma/dxgi_fmt.h
+libdirect3d11_deinterlace_plugin_la_SOURCES = video_output/win32/d3d11_deinterlace.c
 libdirect3d11_deinterlace_plugin_la_LDFLAGS = $(AM_LDFLAGS) -rpath '$(voutdir)'
-libdirect3d11_deinterlace_plugin_la_LIBADD = libdeinterlace_common.la
-libdirect3d11_adjust_plugin_la_SOURCES = video_output/win32/d3d11_adjust.c \
-  video_chroma/dxgi_fmt.c video_chroma/dxgi_fmt.h
+libdirect3d11_deinterlace_plugin_la_LIBADD = libdeinterlace_common.la libd3d11_common.la
+libdirect3d11_adjust_plugin_la_SOURCES = video_output/win32/d3d11_adjust.c
 libdirect3d11_adjust_plugin_la_LDFLAGS = $(AM_LDFLAGS) -rpath '$(voutdir)'
+libdirect3d11_adjust_plugin_la_LIBADD = libd3d11_common.la
 video_filter_LTLIBRARIES += $(LTLIBdirect3d11_deinterlace) $(LTLIBdirect3d11_adjust)
 EXTRA_LTLIBRARIES += libdirect3d11_deinterlace_plugin.la libdirect3d11_adjust_plugin.la
 
-- 
2.14.2



More information about the vlc-devel mailing list