libobs-d3d11: Log GetDeviceRemovedReason

When DirectX throws error 0x887A0005 (DXGI_ERROR_DEVICE_REMOVED),
Microsoft recommends calling ID3D11Device::GetDeviceRemovedReason to
retrieve a more precise error code.

Closes jp9000/obs-studio#652
master
Ryan Foster 2016-10-07 02:39:35 -04:00 committed by jp9000
parent 986edc84c4
commit 487ef58ee7
1 changed files with 24 additions and 0 deletions

View File

@ -33,6 +33,16 @@ struct UnsupportedHWError : HRError {
#pragma warning (disable : 4316)
#endif
static inline void LogD3D11ErrorDetails(HRError error, gs_device_t *device)
{
if (error.hr == DXGI_ERROR_DEVICE_REMOVED) {
HRESULT DeviceRemovedReason =
device->device->GetDeviceRemovedReason();
blog(LOG_ERROR, " Device Removed Reason: %08lX",
DeviceRemovedReason);
}
}
static const IID dxgiFactory2 =
{0x50c83a1c, 0xe072, 0x4c48, {0x87, 0xb0, 0x36, 0x30, 0xfa, 0x36, 0xa6, 0xd0}};
@ -612,6 +622,7 @@ gs_swapchain_t *device_swapchain_create(gs_device_t *device,
} catch (HRError error) {
blog(LOG_ERROR, "device_swapchain_create (D3D11): %s (%08lX)",
error.str, error.hr);
LogD3D11ErrorDetails(error, device);
}
return swap;
@ -641,6 +652,7 @@ void device_resize(gs_device_t *device, uint32_t cx, uint32_t cy)
} catch (HRError error) {
blog(LOG_ERROR, "device_resize (D3D11): %s (%08lX)",
error.str, error.hr);
LogD3D11ErrorDetails(error, device);
}
}
@ -688,6 +700,7 @@ gs_texture_t *device_texture_create(gs_device_t *device, uint32_t width,
} catch (HRError error) {
blog(LOG_ERROR, "device_texture_create (D3D11): %s (%08lX)",
error.str, error.hr);
LogD3D11ErrorDetails(error, device);
} catch (const char *error) {
blog(LOG_ERROR, "device_texture_create (D3D11): %s", error);
}
@ -708,6 +721,7 @@ gs_texture_t *device_cubetexture_create(gs_device_t *device, uint32_t size,
blog(LOG_ERROR, "device_cubetexture_create (D3D11): %s "
"(%08lX)",
error.str, error.hr);
LogD3D11ErrorDetails(error, device);
} catch (const char *error) {
blog(LOG_ERROR, "device_cubetexture_create (D3D11): %s",
error);
@ -743,6 +757,7 @@ gs_zstencil_t *device_zstencil_create(gs_device_t *device, uint32_t width,
} catch (HRError error) {
blog(LOG_ERROR, "device_zstencil_create (D3D11): %s (%08lX)",
error.str, error.hr);
LogD3D11ErrorDetails(error, device);
}
return zstencil;
@ -759,6 +774,7 @@ gs_stagesurf_t *device_stagesurface_create(gs_device_t *device, uint32_t width,
blog(LOG_ERROR, "device_stagesurface_create (D3D11): %s "
"(%08lX)",
error.str, error.hr);
LogD3D11ErrorDetails(error, device);
}
return surf;
@ -774,6 +790,7 @@ gs_samplerstate_t *device_samplerstate_create(gs_device_t *device,
blog(LOG_ERROR, "device_samplerstate_create (D3D11): %s "
"(%08lX)",
error.str, error.hr);
LogD3D11ErrorDetails(error, device);
}
return ss;
@ -791,6 +808,7 @@ gs_shader_t *device_vertexshader_create(gs_device_t *device,
blog(LOG_ERROR, "device_vertexshader_create (D3D11): %s "
"(%08lX)",
error.str, error.hr);
LogD3D11ErrorDetails(error, device);
} catch (ShaderError error) {
const char *buf = (const char*)error.errors->GetBufferPointer();
@ -820,6 +838,7 @@ gs_shader_t *device_pixelshader_create(gs_device_t *device,
blog(LOG_ERROR, "device_pixelshader_create (D3D11): %s "
"(%08lX)",
error.str, error.hr);
LogD3D11ErrorDetails(error, device);
} catch (ShaderError error) {
const char *buf = (const char*)error.errors->GetBufferPointer();
@ -847,6 +866,7 @@ gs_vertbuffer_t *device_vertexbuffer_create(gs_device_t *device,
blog(LOG_ERROR, "device_vertexbuffer_create (D3D11): %s "
"(%08lX)",
error.str, error.hr);
LogD3D11ErrorDetails(error, device);
} catch (const char *error) {
blog(LOG_ERROR, "device_vertexbuffer_create (D3D11): %s",
error);
@ -865,6 +885,7 @@ gs_indexbuffer_t *device_indexbuffer_create(gs_device_t *device,
} catch (HRError error) {
blog(LOG_ERROR, "device_indexbuffer_create (D3D11): %s (%08lX)",
error.str, error.hr);
LogD3D11ErrorDetails(error, device);
}
return buffer;
@ -1308,6 +1329,7 @@ void device_draw(gs_device_t *device, enum gs_draw_mode draw_mode,
} catch (HRError error) {
blog(LOG_ERROR, "device_draw (D3D11): %s (%08lX)", error.str,
error.hr);
LogD3D11ErrorDetails(error, device);
return;
}
@ -1964,6 +1986,7 @@ extern "C" EXPORT gs_texture_t *device_texture_create_gdi(gs_device_t *device,
} catch (HRError error) {
blog(LOG_ERROR, "device_texture_create_gdi (D3D11): %s (%08lX)",
error.str, error.hr);
LogD3D11ErrorDetails(error, device);
} catch (const char *error) {
blog(LOG_ERROR, "device_texture_create_gdi (D3D11): %s", error);
}
@ -2018,6 +2041,7 @@ extern "C" EXPORT gs_texture_t *device_texture_open_shared(gs_device_t *device,
} catch (HRError error) {
blog(LOG_ERROR, "gs_texture_open_shared (D3D11): %s (%08lX)",
error.str, error.hr);
LogD3D11ErrorDetails(error, device);
} catch (const char *error) {
blog(LOG_ERROR, "gs_texture_open_shared (D3D11): %s", error);
}