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
---
configure | 2 ++
libavutil/hwcontext_d3d11va.c | 30 ++++++++++++++++++++++++++++++
libavutil/hwcontext_d3d11va.h | 4 ++++
3 files changed, 36 insertions(+)
diff --git a/configure b/configure
index 019902cee6..01874f365d 100755
--- a/configure
+++ b/configure
@@ -1560,6 +1560,7 @@ HEADERS_LIST="
dev_video_meteor_ioctl_meteor_h
direct_h
dlfcn_h
+ dxgidebug_h
dxva_h
gsm_h
io_h
@@ -4655,6 +4656,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 4e3c0c00e0..de7776ef96 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>
#if !defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0600
@@ -28,6 +30,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"
@@ -446,6 +452,14 @@ 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);
+
+#ifndef UWP
+ if (is_debug) {
+ if (LoadLibrary("d3d11_1sdklayers.dll"))
+ creationFlags |= D3D11_CREATE_DEVICE_DEBUG;
+ }
+#endif
if (device) {
PFN_CREATE_DXGI_FACTORY mCreateDXGIFactory;
@@ -497,6 +511,22 @@ static int d3d11va_device_create(AVHWDeviceContext *ctx,
const char *device,
ID3D10Multithread_Release(pMultithread);
}
+#if !defined(UWP) && 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>
--
2.11.0
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel