diff options
author | wm4 <nfxjfg@googlemail.com> | 2017-06-22 14:52:57 +0200 |
---|---|---|
committer | Luca Barbato <lu_zero@gentoo.org> | 2017-06-27 00:23:12 +0200 |
commit | cfc9e7c94eafa33e7f109099664ec4fb57ac5ca3 (patch) | |
tree | d93640b7a72ef45b0bb1e07d397eb5684975501a | |
parent | 5030e3856c2126fb829edb828f5aae011d178eb4 (diff) | |
download | ffmpeg-cfc9e7c94eafa33e7f109099664ec4fb57ac5ca3.tar.gz |
hwcontext_d3d11va: add option to enable debug mode
Basically copied from VLC (LGPL):
http://git.videolan.org/?p=vlc.git;a=blob;f=modules/video_output/win32/direct3d11.c;h=e9fcb83dcabfe778f26e63d19f218caf06a7c3ae;hb=HEAD#l1482
http://git.videolan.org/?p=vlc.git;a=blob;f=modules/codec/avcodec/d3d11va.c;h=85e7d25caebc059a9770da2ef4bb8fe90816d76d;hb=HEAD#l599
Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
-rwxr-xr-x | configure | 2 | ||||
-rw-r--r-- | libavutil/hwcontext_d3d11va.c | 32 | ||||
-rw-r--r-- | libavutil/hwcontext_d3d11va.h | 4 |
3 files changed, 38 insertions, 0 deletions
@@ -1561,6 +1561,7 @@ HEADERS_LIST=" dev_video_meteor_ioctl_meteor_h direct_h dlfcn_h + dxgidebug_h dxva_h gsm_h io_h @@ -4660,6 +4661,7 @@ check_struct windows.h "CONDITION_VARIABLE" Ptr check_header d3d11.h check_header direct.h check_header dlfcn.h +check_header dxgidebug.h check_header dxva.h check_header dxva2api.h check_header io.h diff --git a/libavutil/hwcontext_d3d11va.c b/libavutil/hwcontext_d3d11va.c index 376c76e5cf..75f78d8669 100644 --- a/libavutil/hwcontext_d3d11va.c +++ b/libavutil/hwcontext_d3d11va.c @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "config.h" + #include <windows.h> // Include thread.h before redefining _WIN32_WINNT, to get @@ -32,6 +34,10 @@ #include <d3d11.h> #include <dxgi1_2.h> +#if HAVE_DXGIDEBUG_H +#include <dxgidebug.h> +#endif + #include "avassert.h" #include "common.h" #include "hwcontext.h" @@ -476,8 +482,18 @@ static int d3d11va_device_create(AVHWDeviceContext *ctx, const char *device, IDXGIAdapter *pAdapter = NULL; ID3D10Multithread *pMultithread; UINT creationFlags = D3D11_CREATE_DEVICE_VIDEO_SUPPORT; + int is_debug = !!av_dict_get(opts, "debug", NULL, 0); int ret; + // (On UWP we can't check this.) +#if HAVE_LOADLIBRARY + if (!LoadLibrary("d3d11_1sdklayers.dll")) + is_debug = 0; +#endif + + if (is_debug) + creationFlags |= D3D11_CREATE_DEVICE_DEBUG; + if ((ret = ff_thread_once(&functions_loaded, load_functions)) != 0) return AVERROR_UNKNOWN; if (!mD3D11CreateDevice || !mCreateDXGIFactory) { @@ -511,6 +527,22 @@ static int d3d11va_device_create(AVHWDeviceContext *ctx, const char *device, ID3D10Multithread_Release(pMultithread); } +#if HAVE_LOADLIBRARY && HAVE_DXGIDEBUG_H + if (is_debug) { + HANDLE dxgidebug_dll = LoadLibrary("dxgidebug.dll"); + if (dxgidebug_dll) { + HRESULT (WINAPI * pf_DXGIGetDebugInterface)(const GUID *riid, void **ppDebug) + = (void *)GetProcAddress(dxgidebug_dll, "DXGIGetDebugInterface"); + if (pf_DXGIGetDebugInterface) { + IDXGIDebug *dxgi_debug = NULL; + hr = pf_DXGIGetDebugInterface(&IID_IDXGIDebug, (void**)&dxgi_debug); + if (SUCCEEDED(hr) && dxgi_debug) + IDXGIDebug_ReportLiveObjects(dxgi_debug, DXGI_DEBUG_ALL, DXGI_DEBUG_RLO_ALL); + } + } + } +#endif + return 0; } diff --git a/libavutil/hwcontext_d3d11va.h b/libavutil/hwcontext_d3d11va.h index d41451580e..0ed3033452 100644 --- a/libavutil/hwcontext_d3d11va.h +++ b/libavutil/hwcontext_d3d11va.h @@ -30,6 +30,10 @@ * Using sw_format==AV_PIX_FMT_YUV420P has special semantics, and maps to * DXGI_FORMAT_420_OPAQUE. av_hwframe_transfer_data() is not supported for * this format. Refer to MSDN for details. + * + * av_hwdevice_ctx_create() for this device type supports a key named "debug" + * for the AVDictionary entry. If this is set to any value, the device creation + * code will try to load various supported D3D debugging layers. */ #include <d3d11.h> |