mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-26 03:31:05 +00:00
d3d11: Log device removed reason
... and live objects. It could be useful hint for GPU debugging Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4170>
This commit is contained in:
parent
a9c5e5e239
commit
a88d90b777
3 changed files with 55 additions and 16 deletions
|
@ -61,6 +61,11 @@ void gst_d3d11_device_dxgi_debug (GstD3D11Device * device,
|
||||||
const gchar * function,
|
const gchar * function,
|
||||||
gint line);
|
gint line);
|
||||||
|
|
||||||
|
void gst_d3d11_device_log_live_objects (GstD3D11Device * device,
|
||||||
|
const gchar * file,
|
||||||
|
const gchar * function,
|
||||||
|
gint line);
|
||||||
|
|
||||||
#define GST_D3D11_CLEAR_COM(obj) G_STMT_START { \
|
#define GST_D3D11_CLEAR_COM(obj) G_STMT_START { \
|
||||||
if (obj) { \
|
if (obj) { \
|
||||||
(obj)->Release (); \
|
(obj)->Release (); \
|
||||||
|
|
|
@ -698,6 +698,31 @@ gst_d3d11_device_get_property (GObject * object, guint prop_id,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gst_d3d11_device_log_live_objects (GstD3D11Device * device,
|
||||||
|
const gchar * file, const gchar * function, gint line)
|
||||||
|
{
|
||||||
|
#if HAVE_D3D11SDKLAYERS_H
|
||||||
|
if (device->priv->d3d11_debug) {
|
||||||
|
device->priv->d3d11_debug->ReportLiveDeviceObjects ((D3D11_RLDO_FLAGS)
|
||||||
|
GST_D3D11_RLDO_FLAGS);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (device->priv->d3d11_info_queue)
|
||||||
|
gst_d3d11_device_d3d11_debug (device, file, function, line);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_DXGIDEBUG_H
|
||||||
|
if (device->priv->dxgi_debug) {
|
||||||
|
device->priv->dxgi_debug->ReportLiveObjects (DXGI_DEBUG_ALL,
|
||||||
|
(DXGI_DEBUG_RLO_FLAGS) GST_D3D11_RLDO_FLAGS);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (device->priv->dxgi_info_queue)
|
||||||
|
gst_d3d11_device_dxgi_debug (device, file, function, line);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_d3d11_device_dispose (GObject * object)
|
gst_d3d11_device_dispose (GObject * object)
|
||||||
{
|
{
|
||||||
|
@ -713,29 +738,15 @@ gst_d3d11_device_dispose (GObject * object)
|
||||||
GST_D3D11_CLEAR_COM (priv->device);
|
GST_D3D11_CLEAR_COM (priv->device);
|
||||||
GST_D3D11_CLEAR_COM (priv->device_context);
|
GST_D3D11_CLEAR_COM (priv->device_context);
|
||||||
GST_D3D11_CLEAR_COM (priv->factory);
|
GST_D3D11_CLEAR_COM (priv->factory);
|
||||||
|
gst_d3d11_device_log_live_objects (self, __FILE__, GST_FUNCTION, __LINE__);
|
||||||
|
|
||||||
#if HAVE_D3D11SDKLAYERS_H
|
#if HAVE_D3D11SDKLAYERS_H
|
||||||
if (priv->d3d11_debug) {
|
|
||||||
priv->d3d11_debug->ReportLiveDeviceObjects ((D3D11_RLDO_FLAGS)
|
|
||||||
GST_D3D11_RLDO_FLAGS);
|
|
||||||
}
|
|
||||||
GST_D3D11_CLEAR_COM (priv->d3d11_debug);
|
GST_D3D11_CLEAR_COM (priv->d3d11_debug);
|
||||||
|
|
||||||
if (priv->d3d11_info_queue)
|
|
||||||
gst_d3d11_device_d3d11_debug (self, __FILE__, GST_FUNCTION, __LINE__);
|
|
||||||
|
|
||||||
GST_D3D11_CLEAR_COM (priv->d3d11_info_queue);
|
GST_D3D11_CLEAR_COM (priv->d3d11_info_queue);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAVE_DXGIDEBUG_H
|
#if HAVE_DXGIDEBUG_H
|
||||||
if (priv->dxgi_debug) {
|
|
||||||
priv->dxgi_debug->ReportLiveObjects (DXGI_DEBUG_ALL,
|
|
||||||
(DXGI_DEBUG_RLO_FLAGS) GST_D3D11_RLDO_FLAGS);
|
|
||||||
}
|
|
||||||
GST_D3D11_CLEAR_COM (priv->dxgi_debug);
|
GST_D3D11_CLEAR_COM (priv->dxgi_debug);
|
||||||
|
|
||||||
if (priv->dxgi_info_queue)
|
|
||||||
gst_d3d11_device_dxgi_debug (self, __FILE__, GST_FUNCTION, __LINE__);
|
|
||||||
|
|
||||||
GST_D3D11_CLEAR_COM (priv->dxgi_info_queue);
|
GST_D3D11_CLEAR_COM (priv->dxgi_info_queue);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -550,6 +550,21 @@ gst_d3d11_luid_to_int64 (const LUID * luid)
|
||||||
return val.QuadPart;
|
return val.QuadPart;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_d3d11_log_gpu_remove_reason (HRESULT hr, GstD3D11Device * device,
|
||||||
|
GstDebugCategory * cat, const gchar * file, const gchar * function,
|
||||||
|
gint line)
|
||||||
|
{
|
||||||
|
gchar *error_text = g_win32_error_message ((guint) hr);
|
||||||
|
|
||||||
|
gst_debug_log (cat, GST_LEVEL_ERROR, file, function, line,
|
||||||
|
NULL, "DeviceRemovedReason: 0x%x, %s", (guint) hr,
|
||||||
|
GST_STR_NULL (error_text));
|
||||||
|
g_free (error_text);
|
||||||
|
|
||||||
|
gst_d3d11_device_log_live_objects (device, file, function, line);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* _gst_d3d11_result:
|
* _gst_d3d11_result:
|
||||||
* @result: HRESULT D3D11 API return code
|
* @result: HRESULT D3D11 API return code
|
||||||
|
@ -584,6 +599,14 @@ _gst_d3d11_result (HRESULT hr, GstD3D11Device * device, GstDebugCategory * cat,
|
||||||
GST_STR_NULL (error_text));
|
GST_STR_NULL (error_text));
|
||||||
g_free (error_text);
|
g_free (error_text);
|
||||||
|
|
||||||
|
if (device) {
|
||||||
|
ID3D11Device *device_handle = gst_d3d11_device_get_device_handle (device);
|
||||||
|
hr = device_handle->GetDeviceRemovedReason ();
|
||||||
|
if (hr != S_OK) {
|
||||||
|
gst_d3d11_log_gpu_remove_reason (hr, device, cat, file, function, line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ret = FALSE;
|
ret = FALSE;
|
||||||
}
|
}
|
||||||
#if (HAVE_D3D11SDKLAYERS_H || HAVE_DXGIDEBUG_H)
|
#if (HAVE_D3D11SDKLAYERS_H || HAVE_DXGIDEBUG_H)
|
||||||
|
|
Loading…
Reference in a new issue